diff --git a/implementations/absinthe-federation/.gitignore b/implementations/absinthe-federation/.gitignore index 98893d7dd..82b807263 100644 --- a/implementations/absinthe-federation/.gitignore +++ b/implementations/absinthe-federation/.gitignore @@ -1,28 +1,11 @@ # The directory Mix will write compiled artifacts to. /_build/ -# If you run "mix test --cover", coverage assets end up here. -/cover/ - # The directory Mix downloads your dependencies sources to. /deps/ -# Where 3rd-party dependencies like ExDoc output generated docs. -/doc/ - -# Ignore .fetch files in case you like to edit your project deps locally. -/.fetch - # If the VM crashes, it generates a dump, let's ignore it too. erl_crash.dump -# Also ignore archive artifacts (built via "mix archive.build"). -*.ez - -# Ignore package tarball (built via "mix hex.build"). -products-*.tar - -# Since we are building assets from assets/, -# we ignore priv/static. You may want to comment -# this depending on your deployment strategy. -/priv/static/ +# Generated GraphQL schema files +schema.graphql diff --git a/implementations/absinthe-federation/lib/products/application.ex b/implementations/absinthe-federation/lib/products/application.ex index 86a40347a..5626753d4 100644 --- a/implementations/absinthe-federation/lib/products/application.ex +++ b/implementations/absinthe-federation/lib/products/application.ex @@ -1,26 +1,13 @@ defmodule Products.Application do - # See https://hexdocs.pm/elixir/Application.html - # for more information on OTP Applications - @moduledoc false - use Application def start(_type, _args) do - children = [ - # Start the Endpoint (http/https) - ProductsWeb.Endpoint - # Start a worker by calling: Products.Worker.start_link(arg) - # {Products.Worker, arg} - ] + children = [ProductsWeb.Endpoint] - # See https://hexdocs.pm/elixir/Supervisor.html - # for other strategies and supported options opts = [strategy: :one_for_one, name: Products.Supervisor] Supervisor.start_link(children, opts) end - # Tell Phoenix to update the endpoint configuration - # whenever the application is updated. def config_change(changed, _new, removed) do ProductsWeb.Endpoint.config_change(changed, removed) :ok diff --git a/implementations/absinthe-federation/lib/products_web/endpoint.ex b/implementations/absinthe-federation/lib/products_web/endpoint.ex index 3c35d7752..6dfce306a 100644 --- a/implementations/absinthe-federation/lib/products_web/endpoint.ex +++ b/implementations/absinthe-federation/lib/products_web/endpoint.ex @@ -19,8 +19,7 @@ defmodule ProductsWeb.Endpoint do plug(Plug.RequestId) plug(Plug.Parsers, - parsers: [:urlencoded, :multipart, :json], - pass: ["*/*"], + parsers: [:json], json_decoder: Phoenix.json_library() ) diff --git a/implementations/absinthe-federation/lib/products_web/schema.ex b/implementations/absinthe-federation/lib/products_web/schema.ex index 451fb2708..452ba4a15 100644 --- a/implementations/absinthe-federation/lib/products_web/schema.ex +++ b/implementations/absinthe-federation/lib/products_web/schema.ex @@ -1,7 +1,4 @@ defmodule ProductsWeb.Schema do - use Absinthe.Schema - use Absinthe.Federation.Schema - defmodule Product do defstruct [:id, :sku, :package, :variation] end @@ -26,23 +23,37 @@ defmodule ProductsWeb.Schema do defstruct [:email, :name, :total_products_created, :years_of_employment] end - import_sdl """ - schema @link(url: "https://specs.apollo.dev/federation/v2.0", - import: [ - "@extends", - "@external", - "@inaccessible", - "@key", - "@override", - "@provides", - "@requires", - "@shareable", - "@tag" - ]) { - query: Query - mutation: Mutation - } - """ + defmodule Prototype do + use Absinthe.Schema.Prototype + use Absinthe.Federation.Schema.Prototype.FederatedDirectives + + directive :custom do + on :object + end + end + + use Absinthe.Schema + use Absinthe.Federation.Schema, prototype_schema: Prototype + + extend schema do + directive :composeDirective, name: "@custom" + directive :link, url: "https://divvypay.com/test/v2.4", import: ["@custom"] + + directive :link, + url: "https://specs.apollo.dev/federation/v2.1", + import: [ + "@extends", + "@external", + "@inaccessible", + "@key", + "@override", + "@provides", + "@requires", + "@shareable", + "@tag", + "@composeDirective" + ] + end @desc """ type Product @key(fields: "id") @key(fields: "sku package") @key(fields: "sku variation { id }") { @@ -58,6 +69,8 @@ defmodule ProductsWeb.Schema do """ object :product do key_fields(["id", "sku package", "sku variation { id }"]) + directive :custom + field :id, non_null(:id) field :sku, :string field :package, :string @@ -124,7 +137,7 @@ defmodule ProductsWeb.Schema do } """ object :product_research do - key_fields("study { caseNumber }") + key_fields("study { case_number }") field :study, non_null(:case_study) field :outcome, :string @@ -132,7 +145,7 @@ defmodule ProductsWeb.Schema do resolve(fn representation, _ctx -> {:ok, Enum.find(product_research(), fn p -> - representation.study.caseNumber === p.study.case_number + representation.study.case_number === p.study.case_number end)} end) end @@ -285,8 +298,8 @@ defmodule ProductsWeb.Schema do {:ok, %{ user - | total_products_created: representation[:totalProductsCreated], - years_of_employment: representation[:yearsOfEmployment] + | total_products_created: representation[:total_products_created], + years_of_employment: representation[:years_of_employment] }} nil -> diff --git a/implementations/absinthe-federation/mix.exs b/implementations/absinthe-federation/mix.exs index 32f4c28b4..f561ff15a 100644 --- a/implementations/absinthe-federation/mix.exs +++ b/implementations/absinthe-federation/mix.exs @@ -5,9 +5,8 @@ defmodule Products.MixProject do [ app: :products, version: "0.1.0", - elixir: "~> 1.13", - elixirc_paths: elixirc_paths(Mix.env()), - compilers: [:phoenix, :gettext] ++ Mix.compilers(), + elixir: "~> 1.14", + elixirc_paths: ["lib"], start_permanent: Mix.env() == :prod, aliases: aliases(), deps: deps(), @@ -15,9 +14,6 @@ defmodule Products.MixProject do ] end - # Configuration for the OTP application. - # - # Type `mix help compile.app` for more information. def application do [ mod: {Products.Application, []}, @@ -25,31 +21,17 @@ defmodule Products.MixProject do ] end - # Specifies which paths to compile per environment. - defp elixirc_paths(:test), do: ["lib", "test/support"] - defp elixirc_paths(_), do: ["lib"] - - # Specifies your project dependencies. - # - # Type `mix help deps` for examples and options. defp deps do [ - {:absinthe, "~> 1.7.0"}, - {:absinthe_federation, "~> 0.2.53"}, + {:absinthe, "~> 1.7"}, + {:absinthe_federation, "~> 0.5"}, {:absinthe_plug, "~> 1.5"}, - {:phoenix, "~> 1.6.10"}, - {:gettext, "~> 0.19"}, - {:jason, "~> 1.3"}, - {:plug_cowboy, "~> 2.0"} + {:phoenix, "~> 1.7"}, + {:jason, "~> 1.4"}, + {:plug_cowboy, "~> 2.6"} ] end - # Aliases are shortcuts or tasks specific to the current project. - # For example, to install project dependencies and perform other setup tasks, run: - # - # $ mix setup - # - # See the documentation for `Mix` for more info on aliases. defp aliases do [ setup: ["deps.get"] diff --git a/implementations/absinthe-federation/mix.lock b/implementations/absinthe-federation/mix.lock index ccffaa577..781888c91 100644 --- a/implementations/absinthe-federation/mix.lock +++ b/implementations/absinthe-federation/mix.lock @@ -1,21 +1,25 @@ %{ - "absinthe": {:hex, :absinthe, "1.7.0", "36819e7b1fd5046c9c734f27fe7e564aed3bda59f0354c37cd2df88fd32dd014", [:mix], [{:dataloader, "~> 1.0.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0 or ~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "566a5b5519afc9b29c4d367f0c6768162de3ec03e9bf9916f9dc2bcbe7c09643"}, - "absinthe_federation": {:hex, :absinthe_federation, "0.2.53", "e7052bec70afe43796c0fb2892e064c8d7683790abe52124247d0192ab82e371", [:mix], [{:absinthe, "~> 1.6.5 or ~> 1.7.0", [hex: :absinthe, repo: "hexpm", optional: false]}, {:dataloader, "~> 1.0.9", [hex: :dataloader, repo: "hexpm", optional: false]}], "hexpm", "418e6516f30cf214a61b16e1d57daaeb19a28c1962eca085456ec866d2081bc8"}, + "absinthe": {:hex, :absinthe, "1.7.1", "aca6f64994f0914628429ddbdfbf24212747b51780dae189dd98909da911757b", [:mix], [{:dataloader, "~> 1.0.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 1.2.2 or ~> 1.3.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c0c4dbd93881fa3bfbad255608234b104b877c2a901850c1fe8c53b408a72a57"}, + "absinthe_federation": {:hex, :absinthe_federation, "0.5.0", "c2cd99f6e0f04c057f81b753b83be7a1ba0a5eccc2cc63e2168dbbe8355440c9", [:mix], [{:absinthe, "~> 1.7", [hex: :absinthe, repo: "hexpm", optional: false]}, {:dataloader, "~> 1.0.9 or ~> 2.0", [hex: :dataloader, repo: "hexpm", optional: false]}], "hexpm", "a2b1b512123bb691e466a7f625c2fae34bfe7c6bccd4f69de12e43c4bba44a6f"}, "absinthe_plug": {:hex, :absinthe_plug, "1.5.8", "38d230641ba9dca8f72f1fed2dfc8abd53b3907d1996363da32434ab6ee5d6ab", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bbb04176647b735828861e7b2705465e53e2cf54ccf5a73ddd1ebd855f996e5a"}, + "castore": {:hex, :castore, "1.0.0", "c25cd0794c054ebe6908a86820c8b92b5695814479ec95eeff35192720b71eec", [:mix], [], "hexpm", "577d0e855983a97ca1dfa33cbb8a3b6ece6767397ffb4861514343b078fc284b"}, "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"}, "dataloader": {:hex, :dataloader, "1.0.10", "a42f07641b1a0572e0b21a2a5ae1be11da486a6790f3d0d14512d96ff3e3bbe9", [:mix], [{:ecto, ">= 3.4.3 and < 4.0.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:telemetry, "~> 1.0 or ~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "54cd70cec09addf4b2ace14cc186a283a149fd4d3ec5475b155951bf33cd963f"}, "gettext": {:hex, :gettext, "0.19.1", "564953fd21f29358e68b91634799d9d26989f8d039d7512622efb3c3b1c97892", [:mix], [], "hexpm", "10c656c0912b8299adba9b061c06947511e3f109ab0d18b44a866a4498e77222"}, - "jason": {:hex, :jason, "1.3.0", "fa6b82a934feb176263ad2df0dbd91bf633d4a46ebfdffea0c8ae82953714946", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "53fc1f51255390e0ec7e50f9cb41e751c260d065dcba2bf0d08dc51a4002c2ac"}, - "mime": {:hex, :mime, "2.0.2", "0b9e1a4c840eafb68d820b0e2158ef5c49385d17fb36855ac6e7e087d4b1dcc5", [:mix], [], "hexpm", "e6a3f76b4c277739e36c2e21a2c640778ba4c3846189d5ab19f97f126df5f9b7"}, + "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, + "mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, - "phoenix": {:hex, :phoenix, "1.6.10", "7a9e8348c5c62e7fd2f74a1884b88d98251f87186a430048bfbdbab3e3f46736", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "08cf70d42f61dd0ea381805bac3cddef57b7b92ade5acc6f6036aa25ecaca9a2"}, + "phoenix": {:hex, :phoenix, "1.7.0", "cbed113bdc203e2ced75859011fe7e71eeebb6259cefa54de810d9c7048b5e22", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.4", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "8526139d4bd79ec97c5c3c8e69f6cd663597f782756cec874ba7da5429c93e34"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"}, + "phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"}, "phoenix_view": {:hex, :phoenix_view, "1.1.2", "1b82764a065fb41051637872c7bd07ed2fdb6f5c3bd89684d4dca6e10115c95a", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "7ae90ad27b09091266f6adbb61e1d2516a7c3d7062c6789d46a7554ec40f3a56"}, - "plug": {:hex, :plug, "1.13.6", "187beb6b67c6cec50503e940f0434ea4692b19384d47e5fdfd701e93cadb4cc2", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "02b9c6b9955bce92c829f31d6284bf53c591ca63c4fb9ff81dfd0418667a34ff"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.5.2", "62894ccd601cf9597e2c23911ff12798a8a18d237e9739f58a6b04e4988899fe", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ea6e87f774c8608d60c8d34022a7d073bd7680a0a013f049fc62bf35efea1044"}, - "plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"}, + "plug": {:hex, :plug, "1.14.0", "ba4f558468f69cbd9f6b356d25443d0b796fbdc887e03fa89001384a9cac638f", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "bf020432c7d4feb7b3af16a0c2701455cbbbb95e5b6866132cb09eb0c29adc14"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.6.0", "d1cf12ff96a1ca4f52207c5271a6c351a4733f413803488d75b70ccf44aebec2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "073cf20b753ce6682ed72905cd62a2d4bd9bad1bf9f7feb02a1b8e525bd94fa6"}, + "plug_crypto": {:hex, :plug_crypto, "1.2.3", "8f77d13aeb32bfd9e654cb68f0af517b371fb34c56c9f2b58fe3df1235c1251a", [:mix], [], "hexpm", "b5672099c6ad5c202c45f5a403f21a3411247f164e4a8fab056e5cd8a290f4a2"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, - "telemetry": {:hex, :telemetry, "1.1.0", "a589817034a27eab11144ad24d5c0f9fab1f58173274b1e9bae7074af9cbee51", [:rebar3], [], "hexpm", "b727b2a1f75614774cff2d7565b64d0dfa5bd52ba517f16543e6fc7efcc0df48"}, + "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, + "websock": {:hex, :websock, "0.4.3", "184ac396bdcd3dfceb5b74c17d221af659dd559a95b1b92041ecb51c9b728093", [:mix], [], "hexpm", "5e4dd85f305f43fd3d3e25d70bec4a45228dfed60f0f3b072d8eddff335539cf"}, + "websock_adapter": {:hex, :websock_adapter, "0.4.5", "30038a3715067f51a9580562c05a3a8d501126030336ffc6edb53bf57d6d2d26", [:mix], [{:bandit, "~> 0.6", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.4", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "1d9812dc7e703c205049426fd4fe0852a247a825f91b099e53dc96f68bafe4c8"}, }