lib/entity/conditions.ex

defmodule Ecto.Entity.Conditions do
  import Ecto.Query

  defmacro __using__(_) do
    quote do
      def where(field, value) when is_atom(field) do
        from(u in __MODULE__, where: field(u, ^field) == ^value)
      end

      def where(field, value) when is_binary(field) do
        String.downcase(field)
        |> String.to_atom()
        |> __MODULE__.where(value)
      end

      def where_all(field, value), do: __MODULE__.where(field, value) |> all()

      def where_first(field, value) do
        __MODULE__.where(field, value) |> first() |> get_repo().one()
      end


      def in_ids(ids) when is_list(ids), do: from(p in __MODULE__, where: p.id in ^ids)
      def in_ids(id), do: __MODULE__.in_ids([id])

      def not_in_ids(ids) when is_list(ids), do: from(p in __MODULE__, where: p.id not in ^ids)
      def not_in_ids(id), do: not_in_ids([id])
    end
  end
end