mobilizon.chapril.org-mobil.../lib/graphql/schema/custom/enum_types.ex

48 lines
1.4 KiB
Elixir

defmodule Mobilizon.GraphQL.Schema.Custom.EnumTypes do
@moduledoc """
Register extra enum types dynamically
"""
alias Absinthe.Blueprint.Schema
alias Absinthe.Schema.Notation
alias Absinthe.{Blueprint, Phase, Pipeline}
alias Mobilizon.Events.Categories
def pipeline(pipeline) do
Pipeline.insert_after(pipeline, Phase.Schema.TypeImports, __MODULE__)
end
@spec run(Absinthe.Blueprint.t(), any()) :: {:ok, Absinthe.Blueprint.t()}
def run(%Blueprint{} = blueprint, _) do
%{schema_definitions: [schema]} = blueprint
new_enum = build_dynamic_enum()
schema =
Map.update!(schema, :type_definitions, fn type_definitions ->
[new_enum | type_definitions]
end)
{:ok, %{blueprint | schema_definitions: [schema]}}
end
@spec build_dynamic_enum :: Absinthe.Blueprint.Schema.EnumTypeDefinition.t()
defp build_dynamic_enum do
%Schema.EnumTypeDefinition{
name: "EventCategory",
identifier: :event_category,
module: __MODULE__,
__reference__: Notation.build_reference(__ENV__),
values:
Enum.map(Categories.list(), fn %{id: id} ->
%Schema.EnumValueDefinition{
identifier: id,
value: String.upcase(to_string(id)),
name: String.upcase(to_string(id)),
module: __MODULE__,
__reference__: Notation.build_reference(__ENV__)
}
end)
}
end
end