Packages
cqrs_tools
0.1.7
0.5.28
0.5.27
0.5.26
0.5.25
0.5.24
0.5.23
0.5.22
0.5.21
0.5.20
0.5.19
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.30
0.2.29
0.2.28
0.2.27
0.2.26
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.1
0.1.0
A collection of handy Elixir macros for CQRS applications.
Current section
Files
Jump to
Current section
Files
lib/cqrs/absinthe.ex
if Code.ensure_loaded?(Absinthe) do
defmodule Cqrs.Absinthe do
defmacro __using__(_) do
quote do
import Cqrs.Absinthe, only: [query_args: 1, query_args: 2]
end
end
@doc """
Creates args for an `Absinthe` query from a [query's](`Cqrs.Query`) filters.
## Options
* `:only` - Restrict importing to only the filters listed
* `:except` - Imports all filters except for those listed
* any filter name to an existing absinthe_type
## Examples
field :user, :user do
query_args GetUser, except: [:name]
resolve &user/2
end
connection field :users, node_type: :user do
query_args ListUsers, status: :user_status
resolve &users/2
end
"""
defmacro query_args(query_module, opts \\ []) do
query_args = __create_query_args__(query_module, opts)
Module.eval_quoted(__CALLER__, query_args)
end
def __create_query_args__(query_module, opts) do
quote do
_ = unquote(query_module).__info__(:functions)
unless function_exported?(unquote(query_module), :__query__, 0) do
raise Cqrs.BoundedContext.InvalidQueryError, query: unquote(query_module)
end
filters = Cqrs.Absinthe.__extract_filters__(unquote(query_module), unquote(opts))
|> Enum.map(fn {name, absinthe_type, required} ->
case required do
true -> quote do: arg(unquote(name), non_null(unquote(absinthe_type)))
false -> quote do: arg(unquote(name), unquote(absinthe_type))
end
end)
end
end
def __extract_filters__(query_module, opts) do
filters = query_module.__filters__()
only = Keyword.get(opts, :only, [])
except = Keyword.get(opts, :except, [])
filters =
case {only, except} do
{[], []} -> filters
{[], except} -> Enum.reject(filters, &Enum.member?(except, elem(&1, 0)))
{only, []} -> Enum.filter(filters, &Enum.member?(only, elem(&1, 0)))
_ -> raise "You can only specify :only or :except"
end
Enum.map(filters, fn filter ->
{name, _type, filter_opts} = filter
absinthe_type = Cqrs.Absinthe.__absinthe_type__(filter, opts)
required = Keyword.get(filter_opts, :required, false)
{name, absinthe_type, required}
end)
end
def __absinthe_type__({name, Ecto.Enum, _}, opts) do
enum_type = Keyword.get(opts, name) || raise "Must supply absinthe enum type for #{name}"
quote do: unquote(enum_type)
end
def __absinthe_type__({_name, :binary_id, _}, _opts), do: quote(do: :id)
def __absinthe_type__({_name, type, _}, _opts), do: quote(do: unquote(type))
end
end