lib/processing/file_processing.ex

defmodule Uploadex.FileProcessing do
  @moduledoc """
  Process files in Base64
  """

  @invalid_format_message "Invalid base64 format"

  @doc """
  If it's in base64, decode it. Otherwise, do not try to process the file.
  """
  @type processed_binary :: %{binary: String.t, content_type: String.t}

  @spec process_binary(String.t) :: {:ok, processed_binary()} | {:error, String.t}
  def process_binary(image_binary) do
    with  [metadata, base64] <- String.split(image_binary, ";base64,"),
          {:ok, binary} <- Base.decode64(base64)
    do
      {:ok, %{binary: binary, content_type: String.replace(metadata, "data:", "")}}
    else
      [_base64] -> {:error, @invalid_format_message}
      [] -> {:error, @invalid_format_message}
      :error -> {:error, "Invalid base64"}
    end
  end
end