mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-18 13:02:11 +03:00
61 lines
2.6 KiB
Haskell
61 lines
2.6 KiB
Haskell
|
module Hasura.GraphQL.Schema.RemoteSource
|
||
|
( remoteSourceField
|
||
|
) where
|
||
|
|
||
|
import Hasura.Prelude
|
||
|
|
||
|
import qualified Language.GraphQL.Draft.Syntax as G
|
||
|
|
||
|
import qualified Hasura.RQL.IR.Select as IR
|
||
|
|
||
|
import Hasura.GraphQL.Parser
|
||
|
import Hasura.GraphQL.Schema.Backend
|
||
|
import Hasura.GraphQL.Schema.Common
|
||
|
import Hasura.GraphQL.Schema.Instances ()
|
||
|
import Hasura.GraphQL.Schema.Select
|
||
|
import Hasura.GraphQL.Schema.Table
|
||
|
import Hasura.RQL.Types.Common (RelType (..))
|
||
|
import Hasura.RQL.Types.RemoteRelationship
|
||
|
import Hasura.SQL.AnyBackend
|
||
|
|
||
|
-- | TODO(jkachmar): Documentation.
|
||
|
remoteSourceField
|
||
|
:: forall b r m n
|
||
|
. MonadBuildSchema b r m n
|
||
|
=> AnyBackend (RemoteSourceRelationshipInfo b)
|
||
|
-> m [FieldParser n (AnnotatedField b)]
|
||
|
remoteSourceField remoteDB = dispatchAnyBackend @BackendSchema remoteDB buildField
|
||
|
where
|
||
|
buildField
|
||
|
:: forall src tgt
|
||
|
. BackendSchema tgt
|
||
|
=> RemoteSourceRelationshipInfo src tgt
|
||
|
-> m [FieldParser n (AnnotatedField src)]
|
||
|
buildField (RemoteSourceRelationshipInfo {..}) = do
|
||
|
tableInfo <- askTableInfo @tgt _rsriSource _rsriTable
|
||
|
fieldName <- textToName $ remoteRelationshipNameToText _rsriName
|
||
|
maybePerms <- tableSelectPermissions @tgt tableInfo
|
||
|
case maybePerms of
|
||
|
Nothing -> pure []
|
||
|
Just tablePerms -> do
|
||
|
parsers <- case _rsriType of
|
||
|
ObjRel -> do
|
||
|
selectionSetParser <- tableSelectionSet _rsriSource tableInfo tablePerms
|
||
|
pure $ pure $ subselection_ fieldName Nothing selectionSetParser <&> \fields ->
|
||
|
IR.SourceRelationshipObject
|
||
|
$ IR.AnnObjectSelectG fields _rsriTable
|
||
|
$ IR._tpFilter
|
||
|
$ tablePermissionsInfo tablePerms
|
||
|
ArrRel -> do
|
||
|
let aggFieldName = fieldName <> $$(G.litName "_aggregate")
|
||
|
selectionSetParser <- selectTable _rsriSource tableInfo fieldName Nothing tablePerms
|
||
|
aggSelectionSetParser <- selectTableAggregate _rsriSource tableInfo aggFieldName Nothing tablePerms
|
||
|
pure $ catMaybes
|
||
|
[ Just $ selectionSetParser <&> IR.SourceRelationshipArray
|
||
|
, aggSelectionSetParser <&> fmap IR.SourceRelationshipArrayAggregate
|
||
|
]
|
||
|
pure $ parsers <&> fmap \select -> IR.AFRemote
|
||
|
$ IR.RemoteSelectSource
|
||
|
$ mkAnyBackend @tgt
|
||
|
$ IR.RemoteSourceSelect _rsriSource _rsriSourceConfig select _rsriMapping
|