368911b58e
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
48 lines
1.4 KiB
Elixir
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
|