graphql-engine/server/src-lib/Hasura/GraphQL/Schema/RemoteSource.hs

61 lines
2.6 KiB
Haskell
Raw Normal View History

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