lib/uploadex.ex

defmodule Uploadex do
  @moduledoc """
  Imports functions from Files, Context and Resolver modules, passing itself as a parameter for configuration.
  """

  defmacro __using__(opts \\ []) do
    repo = Keyword.get(opts, :repo)

    quote do
      @behaviour Uploadex.Uploader

      alias Uploadex.{
        Context,
        Files,
        Resolver,
      }

      ## Files
      def store_files(record), do: Files.store_files(record, __MODULE__)
      def store_files(record, previous_record), do: Files.store_files(record, previous_record, __MODULE__)
      def delete_previous_files(new_record, previous_record), do: Files.delete_previous_files(new_record, previous_record, __MODULE__)
      def delete_files(record), do: Files.delete_files(record, __MODULE__)

      def get_file_url(record, file, field), do: Files.get_file_url(record, file, field, __MODULE__)
      def get_files_url(record, field), do: Files.get_files_url(record, field, __MODULE__)
      def get_files_url(record, files, field), do: Files.get_files_url(record, files, field, __MODULE__)

      def get_temporary_file(record, file, path, field), do: Files.get_temporary_file(record, file, field, path, __MODULE__)
      def get_temporary_files(record, path, field), do: Files.get_temporary_files(record, path, field, __MODULE__)
      def get_temporary_files(record, files, path, field), do: Files.get_temporary_files(record, files, path, field, __MODULE__)

      ## Context
      def create_with_file(changeset, opts \\ []), do: Context.create_with_file(changeset, unquote(repo), __MODULE__, opts)
      def update_with_file(changeset, previous_record, opts \\ []), do: Context.update_with_file(changeset, previous_record, unquote(repo), __MODULE__, opts)
      def update_with_file_keep_previous(changeset, opts \\ []), do: Context.update_with_file_keep_previous(changeset, unquote(repo), __MODULE__, opts)
      def delete_with_file(changeset, opts \\ []), do: Context.delete_with_file(changeset, unquote(repo), __MODULE__, opts)

      ## Resolver
      def get_file_url(field), do: Resolver.get_file_url(field, __MODULE__)
      def get_files_url(field), do: Resolver.get_files_url(field, __MODULE__)
    end
  end
end