mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-18 04:51:35 +03:00
112d206fa6
https://github.com/hasura/graphql-engine-mono/pull/2038 Co-authored-by: Phil Freeman <630306+paf31@users.noreply.github.com> GitOrigin-RevId: 0843bd0610822469f727d768810694b748fec790
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
|