defmodule AthenaWeb.Schema do @moduledoc """ Root GraphQL Schema """ use Absinthe.Schema use Absinthe.Relay.Schema, :modern alias AthenaWeb.Middleware.Safe alias AthenaWeb.Schema.Dataloader, as: RepoDataLoader alias AthenaWeb.Schema.Resolver @impl Absinthe.Schema @spec context(context :: map) :: map def context(context), do: Map.put( context, :loader, Dataloader.add_source(Dataloader.new(), RepoDataLoader, RepoDataLoader.data()) ) @impl Absinthe.Schema @spec plugins :: [atom] def plugins, do: [Absinthe.Middleware.Dataloader | Absinthe.Plugin.defaults()] @impl Absinthe.Schema @spec middleware( [Absinthe.Middleware.spec(), ...], Absinthe.Type.Field.t(), Absinthe.Type.Object.t() ) :: [Absinthe.Middleware.spec(), ...] def middleware(middleware, _field, _object), do: Enum.map(middleware, &Safe.add_error_handling/1) import_types Absinthe.Plug.Types import_types AbsintheErrorPayload.ValidationMessageTypes import_types AthenaWeb.Schema.Event import_types AthenaWeb.Schema.Item import_types AthenaWeb.Schema.ItemGroup import_types AthenaWeb.Schema.Location import_types AthenaWeb.Schema.Movement import_types AthenaWeb.Schema.StockEntry import_types AthenaWeb.Schema.Scalar.Date import_types AthenaWeb.Schema.Scalar.Datetime import_types AthenaWeb.Schema.Scalar.Map import_types AthenaWeb.Schema.Scalar.Ok import_types AthenaWeb.Schema.Scalar.URI node interface do end interface :resource do field :id, non_null(:id) field :inserted_at, non_null(:datetime) field :updated_at, non_null(:datetime) interface :node end query do node field do resolve(&Resolver.node/2) end import_fields :event_queries import_fields :location_queries end mutation do import_fields :movement_mutations end subscription do import_fields :location_subscriptions end end