defmodule Absinthe.Relay.Mutation do
@moduledoc """
Middleware to support the macros located in:
- For Relay Modern: `Absinthe.Relay.Mutation.Notation.Modern`
- For Relay Classic: `Absinthe.Relay.Mutation.Notation.Classic`
Please see those modules for specific instructions.
"""
@doc false
# System resolver to extract values from the input and return the
# client mutation ID (the latter for Relay Classic only) as part of the response.
def call(%{state: :unresolved} = res, _) do
case res.arguments do
%{input: %{client_mutation_id: mut_id} = input} ->
%{
res
| arguments: input,
private:
Map.merge(res.private, %{__client_mutation_id: mut_id, __parse_ids_root: :input}),
middleware: res.middleware ++ [__MODULE__]
}
%{input: input} ->
%{
res
| arguments: input,
private: Map.merge(res.private, %{__parse_ids_root: :input}),
middleware: res.middleware ++ [__MODULE__]
}
_ ->
res
end
end
def call(%{state: :resolved, value: value} = res, _) when is_map(value) do
mut_id = res.private[:__client_mutation_id]
%{res | value: Map.put(value, :client_mutation_id, mut_id)}
end
def call(res, _) do
res
end
end