Packages
potionx
0.8.1
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
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.0
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.1.1
0.1.0
Potionx is a set of generators and functions that speeds up the process of setting up and deploying a full-stack application that uses Elixir with GraphQL for the server-side component and Vue for the frontend component.
Current section
Files
Jump to
Current section
Files
priv/templates/potion.gen.gql_for_model/resolver.ex
defmodule <%= module_name_graphql %>.Resolver.<%= model_name %> do
alias <%= potion_name %>.Context.Service
alias <%= module_name_data %>.<%= context_name %>.<%= model_name %>Service
use Absinthe.Relay.Schema.Notation, :modern
def collection(args, %{context: %Service{} = ctx}) do
q = <%= model_name %>Service.query(ctx)
count = <%= model_name %>Service.count(ctx)
count_before = get_count_before(ctx, count)
q
|> Absinthe.Relay.Connection.from_query(
&<%= module_name_data %>.Repo.all/1,
ensure_first_page_is_full(args),
[count: count]
)
|> case do
{:ok, result} ->
{
:ok,
Map.merge(
result, %{
count: count,
count_before: count_before
}
)
}
err -> err
end
end
def data do
Dataloader.Ecto.new(<%= module_name_data %>.Repo, query: &<%= model_name %>Service.query/2)
end
def delete(_, %{context: %Service{} = ctx}) do
<%= model_name %>Service.delete(ctx)
end
def ensure_first_page_is_full(args) do
if Map.get(args, :before) do
Absinthe.Relay.Connection.cursor_to_offset(args.before)
|> elem(1)
|> Kernel.<(args.last)
|> if do
%{
first: args.last
}
else
args
end
else
args
end
end
def get_count_before(ctx, count) do
cond do
not is_nil(ctx.pagination.after) ->
Absinthe.Relay.Connection.cursor_to_offset(ctx.pagination.after)
|> elem(1)
not is_nil(ctx.pagination.before) ->
Absinthe.Relay.Connection.cursor_to_offset(ctx.pagination.before)
|> elem(1)
|> Kernel.-(ctx.pagination.last)
|> max(0)
not is_nil(ctx.pagination.last) ->
count - ctx.pagination.last
true ->
0
end
end
def mutation(_, %{context: %Service{} = ctx}) do
<%= model_name %>Service.mutation(ctx)
|> case do
{:ok, %{<%= model_name_atom %>: res}} -> {:ok, res}
{:error, _, err, _} -> {:error, err}
res -> res
end
end
def one(_, %{context: %Service{} = ctx}) do
{:ok, <%= model_name %>Service.one(ctx)}
end
end