-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Remove federated types/fields from sdl render (#22)
- Loading branch information
Showing
9 changed files
with
180 additions
and
104 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,97 +1,3 @@ | ||
defmodule Absinthe.Federation.Schema.Phase do | ||
@moduledoc false | ||
|
||
use Absinthe.Phase | ||
|
||
alias Absinthe.Blueprint | ||
alias Absinthe.Blueprint.Schema | ||
alias Absinthe.Federation.Schema.Directive | ||
alias Absinthe.Federation.Schema.EntitiesField | ||
alias Absinthe.Federation.Schema.EntityUnion | ||
alias Absinthe.Federation.Schema.ServiceField | ||
alias Absinthe.Type | ||
|
||
@dialyzer {:nowarn_function, add_directive: 2} | ||
|
||
def run(%Blueprint{} = blueprint, _) do | ||
blueprint = Blueprint.postwalk(blueprint, &collect_types/1) | ||
{:ok, blueprint} | ||
end | ||
|
||
@spec collect_types(Blueprint.node_t()) :: Blueprint.node_t() | ||
defp collect_types(%Schema.SchemaDefinition{type_definitions: type_definitions} = node) do | ||
entity_union = EntityUnion.build(node) | ||
|
||
%{node | type_definitions: [entity_union | type_definitions]} | ||
end | ||
|
||
defp collect_types(%Schema.ObjectTypeDefinition{identifier: :query, fields: fields} = node) do | ||
service_field = ServiceField.build() | ||
entities_field = EntitiesField.build() | ||
%{node | fields: [service_field, entities_field] ++ fields} | ||
end | ||
|
||
defp collect_types(%{__private__: _private} = node) do | ||
meta = Type.meta(node) | ||
maybe_add_directives(node, meta) | ||
end | ||
|
||
defp collect_types(node), do: node | ||
|
||
@spec maybe_add_directives(term(), any()) :: term() | ||
defp maybe_add_directives(node, meta) do | ||
node | ||
|> maybe_add_key_directive(meta) | ||
|> maybe_add_external_directive(meta) | ||
|> maybe_add_requires_directive(meta) | ||
|> maybe_add_provides_directive(meta) | ||
|> maybe_add_extends_directive(meta) | ||
end | ||
|
||
@spec maybe_add_key_directive(term(), map()) :: term() | ||
defp maybe_add_key_directive(node, %{key_fields: fields}) do | ||
directive = Directive.build("key", fields: fields) | ||
|
||
add_directive(node, directive) | ||
end | ||
|
||
defp maybe_add_key_directive(node, _meta), do: node | ||
|
||
defp maybe_add_external_directive(node, %{external: true}) do | ||
directive = Directive.build("external") | ||
|
||
add_directive(node, directive) | ||
end | ||
|
||
defp maybe_add_external_directive(node, _meta), do: node | ||
|
||
defp maybe_add_requires_directive(node, %{requires_fields: fields}) do | ||
directive = Directive.build("requires", fields: fields) | ||
|
||
add_directive(node, directive) | ||
end | ||
|
||
defp maybe_add_requires_directive(node, _meta), do: node | ||
|
||
defp maybe_add_provides_directive(node, %{provides_fields: fields}) do | ||
directive = Directive.build("provides", fields: fields) | ||
|
||
add_directive(node, directive) | ||
end | ||
|
||
defp maybe_add_provides_directive(node, _meta), do: node | ||
|
||
defp maybe_add_extends_directive(node, %{extends: true}) do | ||
directive = Directive.build("extends") | ||
|
||
add_directive(node, directive) | ||
end | ||
|
||
defp maybe_add_extends_directive(node, _meta), do: node | ||
|
||
defp add_directive(%{directives: directives} = node, directive) do | ||
%{node | directives: [directive | directives]} | ||
end | ||
|
||
defp add_directive(node, _directive), do: node | ||
end |
80 changes: 80 additions & 0 deletions
80
lib/absinthe/federation/schema/phase/add_federated_directives.ex
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
defmodule Absinthe.Federation.Schema.Phase.AddFederatedDirectives do | ||
@moduledoc false | ||
|
||
use Absinthe.Phase | ||
|
||
alias Absinthe.Blueprint | ||
alias Absinthe.Federation.Schema.Directive | ||
alias Absinthe.Type | ||
|
||
@dialyzer {:nowarn_function, add_directive: 2} | ||
|
||
def run(%Blueprint{} = blueprint, _) do | ||
blueprint = Blueprint.postwalk(blueprint, &collect_types/1) | ||
{:ok, blueprint} | ||
end | ||
|
||
defp collect_types(%{__private__: _private} = node) do | ||
meta = Type.meta(node) | ||
maybe_add_directives(node, meta) | ||
end | ||
|
||
defp collect_types(node), do: node | ||
|
||
@spec maybe_add_directives(term(), any()) :: term() | ||
defp maybe_add_directives(node, meta) do | ||
node | ||
|> maybe_add_key_directive(meta) | ||
|> maybe_add_external_directive(meta) | ||
|> maybe_add_requires_directive(meta) | ||
|> maybe_add_provides_directive(meta) | ||
|> maybe_add_extends_directive(meta) | ||
end | ||
|
||
@spec maybe_add_key_directive(term(), map()) :: term() | ||
defp maybe_add_key_directive(node, %{key_fields: fields}) do | ||
directive = Directive.build("key", fields: fields) | ||
|
||
add_directive(node, directive) | ||
end | ||
|
||
defp maybe_add_key_directive(node, _meta), do: node | ||
|
||
defp maybe_add_external_directive(node, %{external: true}) do | ||
directive = Directive.build("external") | ||
|
||
add_directive(node, directive) | ||
end | ||
|
||
defp maybe_add_external_directive(node, _meta), do: node | ||
|
||
defp maybe_add_requires_directive(node, %{requires_fields: fields}) do | ||
directive = Directive.build("requires", fields: fields) | ||
|
||
add_directive(node, directive) | ||
end | ||
|
||
defp maybe_add_requires_directive(node, _meta), do: node | ||
|
||
defp maybe_add_provides_directive(node, %{provides_fields: fields}) do | ||
directive = Directive.build("provides", fields: fields) | ||
|
||
add_directive(node, directive) | ||
end | ||
|
||
defp maybe_add_provides_directive(node, _meta), do: node | ||
|
||
defp maybe_add_extends_directive(node, %{extends: true}) do | ||
directive = Directive.build("extends") | ||
|
||
add_directive(node, directive) | ||
end | ||
|
||
defp maybe_add_extends_directive(node, _meta), do: node | ||
|
||
defp add_directive(%{directives: directives} = node, directive) do | ||
%{node | directives: [directive | directives]} | ||
end | ||
|
||
defp add_directive(node, _directive), do: node | ||
end |
35 changes: 35 additions & 0 deletions
35
lib/absinthe/federation/schema/phase/add_federated_types.ex
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
defmodule Absinthe.Federation.Schema.Phase.AddFederatedTypes do | ||
@moduledoc """ | ||
https://www.apollographql.com/docs/federation/federation-spec/#query_service | ||
The federation schema modifications (i.e. new types and directive definitions) should not be included in this SDL. | ||
""" | ||
|
||
use Absinthe.Phase | ||
|
||
alias Absinthe.Blueprint | ||
alias Absinthe.Blueprint.Schema | ||
alias Absinthe.Federation.Schema.EntitiesField | ||
alias Absinthe.Federation.Schema.EntityUnion | ||
alias Absinthe.Federation.Schema.ServiceField | ||
|
||
def run(%Blueprint{} = blueprint, _) do | ||
blueprint = Blueprint.postwalk(blueprint, &collect_types/1) | ||
{:ok, blueprint} | ||
end | ||
|
||
@spec collect_types(Blueprint.node_t()) :: Blueprint.node_t() | ||
defp collect_types(%Schema.SchemaDefinition{type_definitions: type_definitions} = node) do | ||
entity_union = EntityUnion.build(node) | ||
|
||
%{node | type_definitions: [entity_union | type_definitions]} | ||
end | ||
|
||
defp collect_types(%Schema.ObjectTypeDefinition{identifier: :query, fields: fields} = node) do | ||
service_field = ServiceField.build() | ||
entities_field = EntitiesField.build() | ||
%{node | fields: [service_field, entities_field] ++ fields} | ||
end | ||
|
||
defp collect_types(node), do: node | ||
end |
24 changes: 24 additions & 0 deletions
24
lib/absinthe/federation/schema/phase/remove_resolve_reference_fields.ex
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
defmodule Absinthe.Federation.Schema.Phase.RemoveResolveReferenceFields do | ||
@moduledoc false | ||
|
||
use Absinthe.Phase | ||
|
||
alias Absinthe.Blueprint | ||
|
||
def run(%Blueprint{} = blueprint, _) do | ||
blueprint = Blueprint.postwalk(blueprint, &remove_resolve_reference_fields/1) | ||
{:ok, blueprint} | ||
end | ||
|
||
@spec remove_resolve_reference_fields(Blueprint.node_t()) :: Blueprint.node_t() | ||
defp remove_resolve_reference_fields(%{fields: fields} = node) when is_list(fields) do | ||
remove_field(node, :_resolve_reference) | ||
end | ||
|
||
defp remove_resolve_reference_fields(node), do: node | ||
|
||
defp remove_field(%{fields: fields} = node, field) when is_list(fields) and is_atom(field) do | ||
filtered_fields = Enum.reject(fields, &(&1.identifier == field)) | ||
%{node | fields: filtered_fields} | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters