lib/warlock/model.ex

defmodule Warlock.Model do
  alias Warlock.{Model, ModuleUtils, Schema}

  @callback new(params :: map(), user :: Schema.user()) :: Schema.query_result()
  @callback get(params :: map(), user :: Schema.user()) :: Schema.query_result()
  @callback get_count(params :: map(), user :: Schema.user()) ::
              Schema.query_result()
  @callback show(id :: any(), user :: Schema.user()) :: Schema.query_result()
  @callback update(item :: Schema.t(), params :: map()) :: Schema.query_result()
  @callback edit(params :: map(), id :: any(), user :: Schema.user()) ::
              Schema.query_result()
  @callback delete(id :: any(), user :: Schema.user()) :: Schema.query_result()

  @optional_callbacks new: 2,
                      get: 2,
                      get_count: 2,
                      show: 2,
                      update: 2,
                      edit: 3,
                      delete: 2

  defmacro __using__(opts \\ []) do
    quote do
      schema = unquote(ModuleUtils.replace_at(__CALLER__.module, "Schemas"))

      alias unquote(ModuleUtils.replace_at(__CALLER__.module, "Schemas"))

      @behaviour Model

      @schema Keyword.get(unquote(opts), :schema, schema)
      @admin Keyword.get(unquote(opts), :admin, nil)

      def is_admin?(nil), do: false
      def is_admin?(user), do: if(user == @admin, do: true, else: false)

      @impl true
      def new(params, user), do: @schema.new(params, user)

      @impl true
      def get(params, user), do: @schema.get(params, user)

      @impl true
      def get_count(params, user), do: @schema.get_count(params, user)

      @impl true
      def show(id, user), do: @schema.show(id, user)

      @impl true
      def update(item, params), do: @schema.update(item, params)

      @impl true
      def edit(params, id, user), do: @schema.edit(params, id, user)

      @impl true
      def delete(id, user), do: @schema.delete(id, user)

      defoverridable is_admin?: 1,
                     new: 2,
                     get: 2,
                     get_count: 2,
                     show: 2,
                     update: 2,
                     edit: 3,
                     delete: 2
    end
  end
end