Packages
cqrs_tools
0.5.21
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/command_field.ex
if Code.ensure_loaded?(Absinthe) do
defmodule Cqrs.Absinthe.CommandField do
@moduledoc false
alias Cqrs.{
BoundedContext,
Absinthe.Args,
Absinthe.Metadata,
Absinthe.Errors,
Absinthe.Middleware,
Absinthe.FieldMapping
}
def create_input_object(command_module, opts) do
function_name = BoundedContext.__function_name__(command_module, opts)
input_object_fields = create_input_object_fields(command_module, opts)
quote do
input_object unquote(:"#{function_name}_input") do
(unquote_splicing(input_object_fields))
end
end
end
defp create_input_object_fields(command_module, opts) do
command_module.__fields__()
|> Args.extract_args(opts)
|> Enum.map(fn {name, absinthe_type, required, opts} ->
case required do
true -> quote do: field(unquote(name), non_null(unquote(absinthe_type)), unquote(opts))
false -> quote do: field(unquote(name), unquote(absinthe_type), unquote(opts))
end
end)
end
def create_command_field(command_module, returns, opts) do
function_name = BoundedContext.__function_name__(command_module, opts)
args = create_command_field_args(command_module, function_name, opts)
description = command_module.__simple_moduledoc__()
quote do
require Middleware
field unquote(function_name), unquote(returns) do
unquote_splicing(args)
description unquote(description)
Middleware.before_resolve(unquote(command_module), unquote(opts))
resolve(fn parent, args, resolution ->
attrs =
args
|> Map.get(:input, args)
|> FieldMapping.resolve_parent_mappings(unquote(command_module), parent, args, unquote(opts))
|> FieldMapping.run_field_transformations(unquote(command_module), unquote(opts))
opts =
resolution
|> Metadata.merge(unquote(opts))
|> Errors.attach_error_handler()
BoundedContext.__dispatch_command__(unquote(command_module), attrs, opts)
end)
Middleware.after_resolve(unquote(command_module), unquote(opts))
end
end
end
def create_relay_mutation(command_module, returns, opts) do
function_name = BoundedContext.__function_name__(command_module, opts)
input_fields = create_input_object_fields(command_module, opts)
description = command_module.__simple_moduledoc__()
quote do
require Middleware
payload field unquote(function_name) do
description unquote(description)
input do
(unquote_splicing(input_fields))
end
output do
field :payload, unquote(returns)
end
Middleware.before_resolve(unquote(command_module), unquote(opts))
resolve(fn parent, args, resolution ->
attrs =
args
|> Map.get(:input, args)
|> FieldMapping.resolve_parent_mappings(unquote(command_module), parent, args, unquote(opts))
|> FieldMapping.run_field_transformations(unquote(command_module), unquote(opts))
opts =
resolution
|> Metadata.merge(unquote(opts))
|> Errors.attach_error_handler()
with {:ok, result} <- BoundedContext.__dispatch_command__(unquote(command_module), attrs, opts) do
{:ok, %{payload: result}}
end
end)
Middleware.after_resolve(unquote(command_module), unquote(opts))
end
end
end
defp create_command_field_args(command_module, function_name, opts) do
if Keyword.get(opts, :input_object?, false) do
args =
quote do
arg(:input, unquote(:"#{function_name}_input"))
end
[args]
else
create_command_field_args(command_module, opts)
end
end
defp create_command_field_args(command_module, opts) do
command_module.__fields__()
|> FieldMapping.reject_parent_mappings(opts)
|> Args.extract_args(opts)
|> Enum.map(fn {name, absinthe_type, required, opts} ->
case required do
true -> quote do: arg(unquote(name), non_null(unquote(absinthe_type)), unquote(opts))
false -> quote do: arg(unquote(name), unquote(absinthe_type), unquote(opts))
end
end)
end
end
end