Excise query tags from backend schema

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/2960
GitOrigin-RevId: ff6418609117abc8e0410c0897f2af9779cecf16
This commit is contained in:
Philip Lykke Carlsen 2021-11-25 22:07:53 +01:00 committed by hasura-bot
parent 169902f88a
commit 63ee663626
7 changed files with 136 additions and 244 deletions

View File

@ -68,98 +68,84 @@ instance BackendSchema 'BigQuery where
bqBuildTableRelayQueryFields ::
MonadBuildSchema 'BigQuery r m n =>
SourceName ->
SourceConfig 'BigQuery ->
Maybe QueryTagsConfig ->
TableName 'BigQuery ->
TableInfo 'BigQuery ->
G.Name ->
NESeq (ColumnInfo 'BigQuery) ->
SelPermInfo 'BigQuery ->
m [FieldParser n (QueryRootField UnpreparedValue)]
bqBuildTableRelayQueryFields _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _pkeyColumns _selPerms =
m [a]
bqBuildTableRelayQueryFields _sourceName _tableName _tableInfo _gqlName _pkeyColumns _selPerms =
pure []
bqBuildTableInsertMutationFields ::
MonadBuildSchema 'BigQuery r m n =>
SourceName ->
SourceConfig 'BigQuery ->
Maybe QueryTagsConfig ->
TableName 'BigQuery ->
TableInfo 'BigQuery ->
G.Name ->
InsPermInfo 'BigQuery ->
Maybe (SelPermInfo 'BigQuery) ->
Maybe (UpdPermInfo 'BigQuery) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
bqBuildTableInsertMutationFields _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _insPerms _selPerms _updPerms =
m [a]
bqBuildTableInsertMutationFields _sourceName _tableName _tableInfo _gqlName _insPerms _selPerms _updPerms =
pure []
bqBuildTableUpdateMutationFields ::
MonadBuildSchema 'BigQuery r m n =>
SourceName ->
SourceConfig 'BigQuery ->
Maybe QueryTagsConfig ->
TableName 'BigQuery ->
TableInfo 'BigQuery ->
G.Name ->
UpdPermInfo 'BigQuery ->
Maybe (SelPermInfo 'BigQuery) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
bqBuildTableUpdateMutationFields _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _updPerns _selPerms =
m [a]
bqBuildTableUpdateMutationFields _sourceName _tableName _tableInfo _gqlName _updPerns _selPerms =
pure []
bqBuildTableDeleteMutationFields ::
MonadBuildSchema 'BigQuery r m n =>
SourceName ->
SourceConfig 'BigQuery ->
Maybe QueryTagsConfig ->
TableName 'BigQuery ->
TableInfo 'BigQuery ->
G.Name ->
DelPermInfo 'BigQuery ->
Maybe (SelPermInfo 'BigQuery) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
bqBuildTableDeleteMutationFields _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _delPerns _selPerms =
m [a]
bqBuildTableDeleteMutationFields _sourceName _tableName _tableInfo _gqlName _delPerns _selPerms =
pure []
bqBuildFunctionQueryFields ::
MonadBuildSchema 'BigQuery r m n =>
SourceName ->
SourceConfig 'BigQuery ->
Maybe QueryTagsConfig ->
FunctionName 'BigQuery ->
FunctionInfo 'BigQuery ->
TableName 'BigQuery ->
SelPermInfo 'BigQuery ->
m [FieldParser n (QueryRootField UnpreparedValue)]
bqBuildFunctionQueryFields _ _ _ _ _ _ _ =
m [a]
bqBuildFunctionQueryFields _ _ _ _ _ =
pure []
bqBuildFunctionRelayQueryFields ::
MonadBuildSchema 'BigQuery r m n =>
SourceName ->
SourceConfig 'BigQuery ->
Maybe QueryTagsConfig ->
FunctionName 'BigQuery ->
FunctionInfo 'BigQuery ->
TableName 'BigQuery ->
NESeq (ColumnInfo 'BigQuery) ->
SelPermInfo 'BigQuery ->
m [FieldParser n (QueryRootField UnpreparedValue)]
bqBuildFunctionRelayQueryFields _sourceName _sourceInfo _queryTagsConfig _functionName _functionInfo _tableName _pkeyColumns _selPerms =
m [a]
bqBuildFunctionRelayQueryFields _sourceName _functionName _functionInfo _tableName _pkeyColumns _selPerms =
pure []
bqBuildFunctionMutationFields ::
MonadBuildSchema 'BigQuery r m n =>
SourceName ->
SourceConfig 'BigQuery ->
Maybe QueryTagsConfig ->
FunctionName 'BigQuery ->
FunctionInfo 'BigQuery ->
TableName 'BigQuery ->
SelPermInfo 'BigQuery ->
m [FieldParser n (MutationRootField UnpreparedValue)]
bqBuildFunctionMutationFields _ _ _ _ _ _ _ =
m [a]
bqBuildFunctionMutationFields _ _ _ _ _ =
pure []
----------------------------------------------------------------

View File

@ -77,34 +77,28 @@ supportsInserts = isJust . _tciPrimaryKey . _tiCoreInfo
msBuildTableRelayQueryFields ::
MonadBuildSchema 'MSSQL r m n =>
SourceName ->
SourceConfig 'MSSQL ->
Maybe QueryTagsConfig ->
TableName 'MSSQL ->
TableInfo 'MSSQL ->
G.Name ->
NESeq (ColumnInfo 'MSSQL) ->
SelPermInfo 'MSSQL ->
m [FieldParser n (QueryRootField UnpreparedValue)]
msBuildTableRelayQueryFields _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _pkeyColumns _selPerms =
m [a]
msBuildTableRelayQueryFields _sourceName _tableName _tableInfo _gqlName _pkeyColumns _selPerms =
pure []
msBuildTableInsertMutationFields ::
forall r m n.
MonadBuildSchema 'MSSQL r m n =>
SourceName ->
SourceConfig 'MSSQL ->
Maybe QueryTagsConfig ->
TableName 'MSSQL ->
TableInfo 'MSSQL ->
G.Name ->
InsPermInfo 'MSSQL ->
Maybe (SelPermInfo 'MSSQL) ->
Maybe (UpdPermInfo 'MSSQL) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
m [FieldParser n (AnnInsert 'MSSQL (RemoteSelect UnpreparedValue) (UnpreparedValue 'MSSQL))]
msBuildTableInsertMutationFields
sourceName
sourceInfo
queryTagsConfig
tableName
tableInfo
gqlName
@ -114,8 +108,6 @@ msBuildTableInsertMutationFields
| supportsInserts tableInfo =
GSB.buildTableInsertMutationFields
sourceName
sourceInfo
queryTagsConfig
tableName
tableInfo
gqlName
@ -127,69 +119,59 @@ msBuildTableInsertMutationFields
msBuildTableUpdateMutationFields ::
MonadBuildSchema 'MSSQL r m n =>
SourceName ->
SourceConfig 'MSSQL ->
Maybe QueryTagsConfig ->
TableName 'MSSQL ->
TableInfo 'MSSQL ->
G.Name ->
UpdPermInfo 'MSSQL ->
Maybe (SelPermInfo 'MSSQL) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
msBuildTableUpdateMutationFields _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _updPerns _selPerms =
m [a]
msBuildTableUpdateMutationFields _sourceName _tableName _tableInfo _gqlName _updPerns _selPerms =
pure []
msBuildTableDeleteMutationFields ::
MonadBuildSchema 'MSSQL r m n =>
SourceName ->
SourceConfig 'MSSQL ->
Maybe QueryTagsConfig ->
TableName 'MSSQL ->
TableInfo 'MSSQL ->
G.Name ->
DelPermInfo 'MSSQL ->
Maybe (SelPermInfo 'MSSQL) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
msBuildTableDeleteMutationFields _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _delPerns _selPerms =
m [a]
msBuildTableDeleteMutationFields _sourceName _tableName _tableInfo _gqlName _delPerns _selPerms =
pure []
msBuildFunctionQueryFields ::
MonadBuildSchema 'MSSQL r m n =>
SourceName ->
SourceConfig 'MSSQL ->
Maybe QueryTagsConfig ->
FunctionName 'MSSQL ->
FunctionInfo 'MSSQL ->
TableName 'MSSQL ->
SelPermInfo 'MSSQL ->
m [FieldParser n (QueryRootField UnpreparedValue)]
msBuildFunctionQueryFields _ _ _ _ _ _ _ =
m [a]
msBuildFunctionQueryFields _ _ _ _ _ =
pure []
msBuildFunctionRelayQueryFields ::
MonadBuildSchema 'MSSQL r m n =>
SourceName ->
SourceConfig 'MSSQL ->
Maybe QueryTagsConfig ->
FunctionName 'MSSQL ->
FunctionInfo 'MSSQL ->
TableName 'MSSQL ->
NESeq (ColumnInfo 'MSSQL) ->
SelPermInfo 'MSSQL ->
m [FieldParser n (QueryRootField UnpreparedValue)]
msBuildFunctionRelayQueryFields _sourceName _sourceInfo _queryTagsConfig _functionName _functionInfo _tableName _pkeyColumns _selPerms =
m [a]
msBuildFunctionRelayQueryFields _sourceName _functionName _functionInfo _tableName _pkeyColumns _selPerms =
pure []
msBuildFunctionMutationFields ::
MonadBuildSchema 'MSSQL r m n =>
SourceName ->
SourceConfig 'MSSQL ->
Maybe QueryTagsConfig ->
FunctionName 'MSSQL ->
FunctionInfo 'MSSQL ->
TableName 'MSSQL ->
SelPermInfo 'MSSQL ->
m [FieldParser n (MutationRootField UnpreparedValue)]
msBuildFunctionMutationFields _ _ _ _ _ _ _ =
m [a]
msBuildFunctionMutationFields _ _ _ _ _ =
pure []
----------------------------------------------------------------

View File

@ -75,98 +75,84 @@ mysqlTableArgs sourceName tableInfo selectPermissions = do
buildTableRelayQueryFields' ::
MonadBuildSchema 'MySQL r m n =>
SourceName ->
RQL.SourceConfig 'MySQL ->
Maybe RQL.QueryTagsConfig ->
RQL.TableName 'MySQL ->
TableInfo 'MySQL ->
G.Name ->
NESeq (ColumnInfo 'MySQL) ->
SelPermInfo 'MySQL ->
m [FieldParser n (QueryRootField UnpreparedValue)]
buildTableRelayQueryFields' _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _pkeyColumns _selPerms =
m [a]
buildTableRelayQueryFields' _sourceName _tableName _tableInfo _gqlName _pkeyColumns _selPerms =
pure []
buildTableInsertMutationFields' ::
MonadBuildSchema 'MySQL r m n =>
SourceName ->
RQL.SourceConfig 'MySQL ->
Maybe RQL.QueryTagsConfig ->
RQL.TableName 'MySQL ->
TableInfo 'MySQL ->
G.Name ->
InsPermInfo 'MySQL ->
Maybe (SelPermInfo 'MySQL) ->
Maybe (UpdPermInfo 'MySQL) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
buildTableInsertMutationFields' _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _insPerms _selPerms _updPerms =
m [a]
buildTableInsertMutationFields' _sourceName _tableName _tableInfo _gqlName _insPerms _selPerms _updPerms =
pure []
buildTableUpdateMutationFields' ::
MonadBuildSchema 'MySQL r m n =>
SourceName ->
RQL.SourceConfig 'MySQL ->
Maybe RQL.QueryTagsConfig ->
RQL.TableName 'MySQL ->
TableInfo 'MySQL ->
G.Name ->
UpdPermInfo 'MySQL ->
Maybe (SelPermInfo 'MySQL) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
buildTableUpdateMutationFields' _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _updPerns _selPerms =
m [a]
buildTableUpdateMutationFields' _sourceName _tableName _tableInfo _gqlName _updPerns _selPerms =
pure []
buildTableDeleteMutationFields' ::
MonadBuildSchema 'MySQL r m n =>
SourceName ->
RQL.SourceConfig 'MySQL ->
Maybe RQL.QueryTagsConfig ->
RQL.TableName 'MySQL ->
TableInfo 'MySQL ->
G.Name ->
DelPermInfo 'MySQL ->
Maybe (SelPermInfo 'MySQL) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
buildTableDeleteMutationFields' _sourceName _sourceInfo _queryTagsConfig _tableName _tableInfo _gqlName _delPerns _selPerms =
m [a]
buildTableDeleteMutationFields' _sourceName _tableName _tableInfo _gqlName _delPerns _selPerms =
pure []
buildFunctionQueryFields' ::
MonadBuildSchema 'MySQL r m n =>
SourceName ->
RQL.SourceConfig 'MySQL ->
Maybe RQL.QueryTagsConfig ->
FunctionName 'MySQL ->
FunctionInfo 'MySQL ->
RQL.TableName 'MySQL ->
SelPermInfo 'MySQL ->
m [FieldParser n (QueryRootField UnpreparedValue)]
buildFunctionQueryFields' _ _ _ _ _ _ _ =
m [a]
buildFunctionQueryFields' _ _ _ _ _ =
pure []
buildFunctionRelayQueryFields' ::
MonadBuildSchema 'MySQL r m n =>
SourceName ->
RQL.SourceConfig 'MySQL ->
Maybe RQL.QueryTagsConfig ->
FunctionName 'MySQL ->
FunctionInfo 'MySQL ->
RQL.TableName 'MySQL ->
NESeq (ColumnInfo 'MySQL) ->
SelPermInfo 'MySQL ->
m [FieldParser n (QueryRootField UnpreparedValue)]
buildFunctionRelayQueryFields' _sourceName _sourceInfo _queryTagsConfig _functionName _functionInfo _tableName _pkeyColumns _selPerms =
m [a]
buildFunctionRelayQueryFields' _sourceName _functionName _functionInfo _tableName _pkeyColumns _selPerms =
pure []
buildFunctionMutationFields' ::
MonadBuildSchema 'MySQL r m n =>
SourceName ->
RQL.SourceConfig 'MySQL ->
Maybe RQL.QueryTagsConfig ->
FunctionName 'MySQL ->
FunctionInfo 'MySQL ->
RQL.TableName 'MySQL ->
SelPermInfo 'MySQL ->
m [FieldParser n (MutationRootField UnpreparedValue)]
buildFunctionMutationFields' _ _ _ _ _ _ _ =
m [a]
buildFunctionMutationFields' _ _ _ _ _ =
pure []
bsParser :: MonadParse m => Parser 'Both m ByteString

View File

@ -40,7 +40,6 @@ import Hasura.Prelude
import Hasura.RQL.IR
import Hasura.RQL.IR.Select qualified as IR
import Hasura.RQL.Types
import Hasura.SQL.AnyBackend qualified as AB
import Hasura.SQL.Types
import Language.GraphQL.Draft.Syntax qualified as G
@ -60,25 +59,21 @@ class PostgresSchema (pgKind :: PostgresKind) where
pgkBuildTableRelayQueryFields ::
BS.MonadBuildSchema ('Postgres pgKind) r m n =>
SourceName ->
SourceConfig ('Postgres pgKind) ->
Maybe QueryTagsConfig ->
TableName ('Postgres pgKind) ->
TableInfo ('Postgres pgKind) ->
G.Name ->
NESeq (ColumnInfo ('Postgres pgKind)) ->
SelPermInfo ('Postgres pgKind) ->
m [FieldParser n (QueryRootField UnpreparedValue)]
m [FieldParser n (QueryDB ('Postgres pgKind) (RemoteSelect UnpreparedValue) (UnpreparedValue ('Postgres pgKind)))]
pgkBuildFunctionRelayQueryFields ::
BS.MonadBuildSchema ('Postgres pgKind) r m n =>
SourceName ->
SourceConfig ('Postgres pgKind) ->
Maybe QueryTagsConfig ->
FunctionName ('Postgres pgKind) ->
FunctionInfo ('Postgres pgKind) ->
TableName ('Postgres pgKind) ->
NESeq (ColumnInfo ('Postgres pgKind)) ->
SelPermInfo ('Postgres pgKind) ->
m [FieldParser n (QueryRootField UnpreparedValue)]
m [FieldParser n (QueryDB ('Postgres pgKind) (RemoteSelect UnpreparedValue) (UnpreparedValue ('Postgres pgKind)))]
pgkRelayExtension ::
Maybe (XRelay ('Postgres pgKind))
pgkNode ::
@ -106,8 +101,8 @@ instance PostgresSchema 'Vanilla where
pgkNode = nodePG
instance PostgresSchema 'Citus where
pgkBuildTableRelayQueryFields _ _ _ _ _ _ _ _ = pure []
pgkBuildFunctionRelayQueryFields _ _ _ _ _ _ _ _ = pure []
pgkBuildTableRelayQueryFields _ _ _ _ _ _ = pure []
pgkBuildFunctionRelayQueryFields _ _ _ _ _ _ = pure []
pgkRelayExtension = Nothing
pgkNode = undefined
@ -161,47 +156,33 @@ buildTableRelayQueryFields ::
forall pgKind m n r.
MonadBuildSchema ('Postgres pgKind) r m n =>
SourceName ->
SourceConfig ('Postgres pgKind) ->
Maybe QueryTagsConfig ->
TableName ('Postgres pgKind) ->
TableInfo ('Postgres pgKind) ->
G.Name ->
NESeq (ColumnInfo ('Postgres pgKind)) ->
SelPermInfo ('Postgres pgKind) ->
m [FieldParser n (QueryRootField UnpreparedValue)]
buildTableRelayQueryFields sourceName sourceInfo queryTagsConfig tableName tableInfo gqlName pkeyColumns selPerms = do
let mkRF =
RFDB sourceName
. AB.mkAnyBackend
. SourceConfigWith sourceInfo queryTagsConfig
. QDBR
fieldDesc = Just $ G.Description $ "fetch data from the table: " <>> tableName
m [FieldParser n (QueryDB ('Postgres pgKind) (RemoteSelect UnpreparedValue) (UnpreparedValue ('Postgres pgKind)))]
buildTableRelayQueryFields sourceName tableName tableInfo gqlName pkeyColumns selPerms = do
let fieldDesc = Just $ G.Description $ "fetch data from the table: " <>> tableName
fieldName <- mkRootFieldName $ gqlName <> $$(G.litName "_connection")
fmap afold $
optionalFieldParser (mkRF . QDBConnection) $
optionalFieldParser (QDBConnection) $
selectTableConnection sourceName tableInfo fieldName fieldDesc pkeyColumns selPerms
buildFunctionRelayQueryFields ::
forall pgKind m n r.
MonadBuildSchema ('Postgres pgKind) r m n =>
SourceName ->
SourceConfig ('Postgres pgKind) ->
Maybe QueryTagsConfig ->
FunctionName ('Postgres pgKind) ->
FunctionInfo ('Postgres pgKind) ->
TableName ('Postgres pgKind) ->
NESeq (ColumnInfo ('Postgres pgKind)) ->
SelPermInfo ('Postgres pgKind) ->
m [FieldParser n (QueryRootField UnpreparedValue)]
buildFunctionRelayQueryFields sourceName sourceInfo queryTagsConfig functionName functionInfo tableName pkeyColumns selPerms = do
let mkRF =
RFDB sourceName
. AB.mkAnyBackend
. SourceConfigWith sourceInfo queryTagsConfig
. QDBR
fieldDesc = Just $ G.Description $ "execute function " <> functionName <<> " which returns " <>> tableName
m [FieldParser n (QueryDB ('Postgres pgKind) (RemoteSelect UnpreparedValue) (UnpreparedValue ('Postgres pgKind)))]
buildFunctionRelayQueryFields sourceName functionName functionInfo tableName pkeyColumns selPerms = do
let fieldDesc = Just $ G.Description $ "execute function " <> functionName <<> " which returns " <>> tableName
fmap afold $
optionalFieldParser (mkRF . QDBConnection) $
optionalFieldParser (QDBConnection) $
selectFunctionConnection sourceName functionInfo fieldDesc pkeyColumns selPerms
----------------------------------------------------------------

View File

@ -40,6 +40,7 @@ import Hasura.Prelude
import Hasura.RQL.IR
import Hasura.RQL.Types
import Hasura.SQL.AnyBackend qualified as AB
import Hasura.SQL.Tag (HasTag)
import Hasura.Session
import Language.GraphQL.Draft.Syntax qualified as G
@ -522,7 +523,7 @@ buildQueryFields sourceName sourceConfig tables (takeExposedAs FEAQuery -> funct
tableGQLName <- getTableGQLName @b tableInfo
-- FIXME: retrieve permissions directly from tableInfo to avoid a sourceCache lookup
selectPerms <- tableSelectPermissions tableInfo
for selectPerms $ buildTableQueryFields sourceName sourceConfig queryTagsConfig tableName tableInfo tableGQLName
for selectPerms $ mkRF . buildTableQueryFields sourceName tableName tableInfo tableGQLName
functionSelectExpParsers <- for (Map.toList functions) \(functionName, functionInfo) -> runMaybeT $ do
guard $
roleName == adminRoleName
@ -531,8 +532,10 @@ buildQueryFields sourceName sourceConfig tables (takeExposedAs FEAQuery -> funct
let targetTableName = _fiReturnType functionInfo
targetTableInfo <- askTableInfo sourceName targetTableName
selectPerms <- MaybeT $ tableSelectPermissions targetTableInfo
lift $ buildFunctionQueryFields sourceName sourceConfig queryTagsConfig functionName functionInfo targetTableName selectPerms
lift $ mkRF $ buildFunctionQueryFields sourceName functionName functionInfo targetTableName selectPerms
pure $ concat $ catMaybes $ tableSelectExpParsers <> functionSelectExpParsers
where
mkRF = mkRootField sourceName sourceConfig queryTagsConfig QDBR
buildRelayQueryFields ::
forall b r m n.
@ -549,15 +552,17 @@ buildRelayQueryFields sourceName sourceConfig tables (takeExposedAs FEAQuery ->
pkeyColumns <- hoistMaybe $ tableInfo ^? tiCoreInfo . tciPrimaryKey . _Just . pkColumns
-- FIXME: retrieve permissions directly from tableInfo to avoid a sourceCache lookup
selectPerms <- MaybeT $ tableSelectPermissions tableInfo
lift $ buildTableRelayQueryFields sourceName sourceConfig queryTagsConfig tableName tableInfo tableGQLName pkeyColumns selectPerms
lift $ mkRF $ buildTableRelayQueryFields sourceName tableName tableInfo tableGQLName pkeyColumns selectPerms
functionConnectionFields <- for (Map.toList functions) $ \(functionName, functionInfo) -> runMaybeT do
let returnTableName = _fiReturnType functionInfo
-- FIXME: only extract the TableInfo once to avoid redundant cache lookups
returnTableInfo <- lift $ askTableInfo sourceName returnTableName
pkeyColumns <- MaybeT $ (^? tiCoreInfo . tciPrimaryKey . _Just . pkColumns) <$> pure returnTableInfo
selectPerms <- MaybeT $ tableSelectPermissions returnTableInfo
lift $ buildFunctionRelayQueryFields sourceName sourceConfig queryTagsConfig functionName functionInfo returnTableName pkeyColumns selectPerms
lift $ mkRF $ buildFunctionRelayQueryFields sourceName functionName functionInfo returnTableName pkeyColumns selectPerms
pure $ concat $ catMaybes $ tableConnectionFields <> functionConnectionFields
where
mkRF = mkRootField sourceName sourceConfig queryTagsConfig QDBR
buildMutationFields ::
forall b r m n.
@ -586,24 +591,15 @@ buildMutationFields scenario sourceName sourceConfig tables (takeExposedAs FEAMu
then Nothing
else Just insertPerms
lift $
buildTableInsertMutationFields
sourceName
sourceConfig
queryTagsConfig
tableName
tableInfo
tableGQLName
insertPerms
_permSel
_permUpd
mkRF (MDBR . MDBInsert) $ buildTableInsertMutationFields sourceName tableName tableInfo tableGQLName insertPerms _permSel _permUpd
updates <- runMaybeT $ do
guard $ isMutable viIsUpdatable viewInfo
updatePerms <- hoistMaybe _permUpd
lift $ buildTableUpdateMutationFields sourceName sourceConfig queryTagsConfig tableName tableInfo tableGQLName updatePerms _permSel
lift $ mkRF (MDBR . MDBUpdate) $ buildTableUpdateMutationFields @b sourceName tableName tableInfo tableGQLName updatePerms _permSel
deletes <- runMaybeT $ do
guard $ isMutable viIsDeletable viewInfo
deletePerms <- hoistMaybe _permDel
lift $ buildTableDeleteMutationFields sourceName sourceConfig queryTagsConfig tableName tableInfo tableGQLName deletePerms _permSel
lift $ mkRF (MDBR . MDBDelete) $ buildTableDeleteMutationFields sourceName tableName tableInfo tableGQLName deletePerms _permSel
pure $ concat $ catMaybes [inserts, updates, deletes]
functionMutations <- for (Map.toList functions) \(functionName, functionInfo) -> runMaybeT $ do
let targetTableName = _fiReturnType functionInfo
@ -615,8 +611,11 @@ buildMutationFields scenario sourceName sourceConfig tables (takeExposedAs FEAMu
-- when function permissions are inferred, we don't expose the
-- mutation functions for non-admin roles. See Note [Function Permissions]
roleName == adminRoleName || roleName `Map.member` (_fiPermissions functionInfo)
lift $ buildFunctionMutationFields sourceName sourceConfig queryTagsConfig functionName functionInfo targetTableName selectPerms
lift $ mkRF MDBR $ buildFunctionMutationFields sourceName functionName functionInfo targetTableName selectPerms
pure $ concat $ catMaybes $ tableMutations <> functionMutations
where
mkRF :: forall a db remote action raw. (a -> db b) -> m [FieldParser n a] -> m [FieldParser n (RootField db remote action raw)]
mkRF = mkRootField sourceName sourceConfig queryTagsConfig
----------------------------------------------------------------
-- Building root parser from fields
@ -770,6 +769,34 @@ buildMutationParser allRemotes allActions nonObjectCustomTypes mutationFields =
----------------------------------------------------------------
-- local helpers
-- | All the 'BackendSchema' methods produce something of the form @m
-- [FieldParser n a]@, where @a@ is something specific to what is being parsed
-- by the given method.
--
-- In order to build the complete schema these must be
-- homogenised and be annotated with query-tag data, which this function makes
-- easy.
mkRootField ::
forall b m n a db remote action raw.
(HasTag b, Functor m, Functor n) =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
(a -> db b) ->
m [FieldParser n a] ->
m [FieldParser n (RootField db remote action raw)]
mkRootField sourceName sourceConfig queryTagsConfig inj =
fmap
( map
( fmap
( RFDB sourceName
. AB.mkAnyBackend @b
. SourceConfigWith sourceConfig queryTagsConfig
. inj
)
)
)
takeExposedAs :: FunctionExposedAs -> FunctionCache b -> FunctionCache b
takeExposedAs x = Map.filter ((== x) . _fiExposedAs)

View File

@ -91,36 +91,32 @@ class Backend b => BackendSchema (b :: BackendType) where
buildTableQueryFields ::
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
TableName b ->
TableInfo b ->
G.Name ->
SelPermInfo b ->
m [FieldParser n (QueryRootField UnpreparedValue)]
m [FieldParser n (QueryDB b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildTableRelayQueryFields ::
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
TableName b ->
TableInfo b ->
G.Name ->
NESeq (ColumnInfo b) ->
SelPermInfo b ->
m [FieldParser n (QueryRootField UnpreparedValue)]
m [FieldParser n (QueryDB b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildTableInsertMutationFields ::
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
TableName b ->
TableInfo b ->
G.Name ->
InsPermInfo b ->
Maybe (SelPermInfo b) ->
Maybe (UpdPermInfo b) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
m [FieldParser n (AnnInsert b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
-- | This method is responsible for building the GraphQL Schema for mutations
-- backed by @UPDATE@ statements on some table, as described in
@ -132,10 +128,6 @@ class Backend b => BackendSchema (b :: BackendType) where
MonadBuildSchema b r m n =>
-- | The source that the table lives in
SourceName ->
-- | The associated 'SourceConfig'
SourceConfig b ->
-- TODO: What are Query Tags?
Maybe QueryTagsConfig ->
-- | The name of the table being acted on
TableName b ->
-- | table info
@ -146,50 +138,45 @@ class Backend b => BackendSchema (b :: BackendType) where
UpdPermInfo b ->
-- | select permissions of the table (if any)
Maybe (SelPermInfo b) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
m [FieldParser n (AnnotatedUpdateG b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildTableDeleteMutationFields ::
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
TableName b ->
TableInfo b ->
G.Name ->
DelPermInfo b ->
Maybe (SelPermInfo b) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
m [FieldParser n (AnnDelG b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildFunctionQueryFields ::
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
FunctionName b ->
FunctionInfo b ->
TableName b ->
SelPermInfo b ->
m [FieldParser n (QueryRootField UnpreparedValue)]
m [FieldParser n (QueryDB b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildFunctionRelayQueryFields ::
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
FunctionName b ->
FunctionInfo b ->
TableName b ->
NESeq (ColumnInfo b) ->
SelPermInfo b ->
m [FieldParser n (QueryRootField UnpreparedValue)]
m [FieldParser n (QueryDB b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildFunctionMutationFields ::
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
FunctionName b ->
FunctionInfo b ->
TableName b ->
SelPermInfo b ->
m [FieldParser n (MutationRootField UnpreparedValue)]
m [FieldParser n (MutationDB b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
-- table components
tableArguments ::

View File

@ -62,27 +62,19 @@ import Hasura.GraphQL.Schema.Select
import Hasura.Prelude
import Hasura.RQL.IR
import Hasura.RQL.Types
import Hasura.SQL.AnyBackend qualified as AB
import Language.GraphQL.Draft.Syntax qualified as G
buildTableQueryFields ::
forall b r m n.
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
TableName b ->
TableInfo b ->
G.Name ->
SelPermInfo b ->
m [FieldParser n (QueryRootField UnpreparedValue)]
buildTableQueryFields sourceName sourceInfo queryTagsConfig tableName tableInfo gqlName selPerms = do
let mkRF =
RFDB sourceName
. AB.mkAnyBackend
. SourceConfigWith sourceInfo queryTagsConfig
. QDBR
customRootFields = _tcCustomRootFields $ _tciCustomConfig $ _tiCoreInfo tableInfo
(m [FieldParser n (QueryDB b (RemoteSelect UnpreparedValue) (UnpreparedValue b))])
buildTableQueryFields sourceName tableName tableInfo gqlName selPerms = do
let customRootFields = _tcCustomRootFields $ _tciCustomConfig $ _tiCoreInfo tableInfo
-- select table
selectDesc = Just $ G.Description $ "fetch data from the table: " <>> tableName
-- select table by pk
@ -94,28 +86,24 @@ buildTableQueryFields sourceName sourceInfo queryTagsConfig tableName tableInfo
selectAggName <- mkRootFieldName $ fromMaybe (gqlName <> $$(G.litName "_aggregate")) $ _tcrfSelectAggregate customRootFields
catMaybes
<$> sequenceA
[ requiredFieldParser (mkRF . QDBMultipleRows) $ selectTable sourceName tableInfo selectName selectDesc selPerms,
optionalFieldParser (mkRF . QDBSingleRow) $ selectTableByPk sourceName tableInfo selectPKName selectPKDesc selPerms,
optionalFieldParser (mkRF . QDBAggregation) $ selectTableAggregate sourceName tableInfo selectAggName selectAggDesc selPerms
[ requiredFieldParser QDBMultipleRows $ selectTable sourceName tableInfo selectName selectDesc selPerms,
optionalFieldParser QDBSingleRow $ selectTableByPk sourceName tableInfo selectPKName selectPKDesc selPerms,
optionalFieldParser QDBAggregation $ selectTableAggregate sourceName tableInfo selectAggName selectAggDesc selPerms
]
buildTableInsertMutationFields ::
forall b r m n.
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
TableName b ->
TableInfo b ->
G.Name ->
InsPermInfo b ->
Maybe (SelPermInfo b) ->
Maybe (UpdPermInfo b) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
m [FieldParser n (AnnInsert b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildTableInsertMutationFields
sourceName
sourceInfo
queryTagsConfig
tableName
tableInfo
gqlName
@ -123,20 +111,7 @@ buildTableInsertMutationFields
mSelPerms
mUpdPerms =
do
let mkRF ::
FieldParser
n
(AnnInsert b (RemoteSelect UnpreparedValue) (UnpreparedValue b)) ->
FieldParser n (MutationRootField UnpreparedValue)
mkRF =
fmap
( RFDB sourceName
. AB.mkAnyBackend
. SourceConfigWith sourceInfo queryTagsConfig
. MDBR
. MDBInsert
)
customRootFields = _tcCustomRootFields $ _tciCustomConfig $ _tiCoreInfo tableInfo
let customRootFields = _tcCustomRootFields $ _tciCustomConfig $ _tiCoreInfo tableInfo
-- insert into table
insertDesc = Just $ G.Description $ "insert data into the table: " <>> tableName
-- insert one into table
@ -149,7 +124,7 @@ buildTableInsertMutationFields
-- user doesn't have select permissions.
insertOne <- for mSelPerms \selPerms ->
insertOneIntoTable sourceName tableInfo insertOneName insertOneDesc insPerms selPerms mUpdPerms
pure $ map mkRF (insert : maybeToList insertOne)
pure $ insert : maybeToList insertOne
-- | This function is the basic building block for update mutations. It
-- implements the mutation schema in the general shape described in
@ -183,10 +158,6 @@ buildTableUpdateMutationFields ::
) ->
-- | The source that the table lives in
SourceName ->
-- | The associated 'SourceConfig'
SourceConfig b ->
-- TODO: What are Query Tags?
Maybe QueryTagsConfig ->
-- | The name of the table being acted on
TableName b ->
-- | table info
@ -197,14 +168,9 @@ buildTableUpdateMutationFields ::
UpdPermInfo b ->
-- | select permissions of the table (if any)
Maybe (SelPermInfo b) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
buildTableUpdateMutationFields mkBackendUpdate sourceName sourceInfo queryTagsConfig tableName tableInfo gqlName updPerms mSelPerms = do
let mkRF =
RFDB sourceName
. AB.mkAnyBackend
. SourceConfigWith sourceInfo queryTagsConfig
. MDBR
customRootFields = _tcCustomRootFields $ _tciCustomConfig $ _tiCoreInfo tableInfo
m [FieldParser n (AnnotatedUpdateG b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildTableUpdateMutationFields mkBackendUpdate sourceName tableName tableInfo gqlName updPerms mSelPerms = do
let customRootFields = _tcCustomRootFields $ _tciCustomConfig $ _tiCoreInfo tableInfo
-- update table
updateDesc = Just $ G.Description $ "update data of the table: " <>> tableName
-- update table by pk
@ -217,27 +183,20 @@ buildTableUpdateMutationFields mkBackendUpdate sourceName sourceInfo queryTagsCo
-- exists on the table and if the user has select permissions on all columns
-- that make up the key.
updateByPk <- fmap join $ for mSelPerms $ updateTableByPk backendUpdate sourceName tableInfo updatePKName updatePKDesc updPerms
pure $ fmap (mkRF . MDBUpdate) <$> update : catMaybes [updateByPk]
pure $ update : catMaybes [updateByPk]
buildTableDeleteMutationFields ::
forall b r m n.
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
TableName b ->
TableInfo b ->
G.Name ->
DelPermInfo b ->
Maybe (SelPermInfo b) ->
m [FieldParser n (MutationRootField UnpreparedValue)]
buildTableDeleteMutationFields sourceName sourceInfo queryTagsConfig tableName tableInfo gqlName delPerms mSelPerms = do
let mkRF =
RFDB sourceName
. AB.mkAnyBackend
. SourceConfigWith sourceInfo queryTagsConfig
. MDBR
customRootFields = _tcCustomRootFields $ _tciCustomConfig $ _tiCoreInfo tableInfo
m [FieldParser n (AnnDelG b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildTableDeleteMutationFields sourceName tableName tableInfo gqlName delPerms mSelPerms = do
let customRootFields = _tcCustomRootFields $ _tciCustomConfig $ _tiCoreInfo tableInfo
-- delete from table
deleteDesc = Just $ G.Description $ "delete data from the table: " <>> tableName
-- delete from table by pk
@ -249,27 +208,19 @@ buildTableDeleteMutationFields sourceName sourceInfo queryTagsConfig tableName t
-- select permissions for them, which at the very least requires select
-- permissions.
deleteByPk <- fmap join $ for mSelPerms $ deleteFromTableByPk sourceName tableInfo deletePKName deletePKDesc delPerms
pure $ fmap (mkRF . MDBDelete) <$> delete : maybeToList deleteByPk
pure $ delete : maybeToList deleteByPk
buildFunctionQueryFields ::
forall b r m n.
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
FunctionName b ->
FunctionInfo b ->
TableName b ->
SelPermInfo b ->
m [FieldParser n (QueryRootField UnpreparedValue)]
buildFunctionQueryFields sourceName sourceInfo queryTagsConfig functionName functionInfo tableName selPerms = do
let mkRF =
RFDB sourceName
. AB.mkAnyBackend
. SourceConfigWith sourceInfo queryTagsConfig
. QDBR
-- select function
m [FieldParser n (QueryDB b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildFunctionQueryFields sourceName functionName functionInfo tableName selPerms = do
let -- select function
funcDesc =
Just . G.Description $
flip fromMaybe (_fiComment functionInfo) $ "execute function " <> functionName <<> " which returns " <>> tableName
@ -284,33 +235,25 @@ buildFunctionQueryFields sourceName sourceInfo queryTagsConfig functionName func
catMaybes
<$> sequenceA
[ requiredFieldParser (mkRF . queryResultType) $ selectFunction sourceName functionInfo funcDesc selPerms,
optionalFieldParser (mkRF . QDBAggregation) $ selectFunctionAggregate sourceName functionInfo funcAggDesc selPerms
[ requiredFieldParser (queryResultType) $ selectFunction sourceName functionInfo funcDesc selPerms,
optionalFieldParser (QDBAggregation) $ selectFunctionAggregate sourceName functionInfo funcAggDesc selPerms
]
buildFunctionMutationFields ::
forall b r m n.
MonadBuildSchema b r m n =>
SourceName ->
SourceConfig b ->
Maybe QueryTagsConfig ->
FunctionName b ->
FunctionInfo b ->
TableName b ->
SelPermInfo b ->
m [FieldParser n (MutationRootField UnpreparedValue)]
buildFunctionMutationFields sourceName sourceInfo queryTagsConfig functionName functionInfo tableName selPerms = do
let mkRF =
RFDB sourceName
. AB.mkAnyBackend
. SourceConfigWith sourceInfo queryTagsConfig
. MDBR
funcDesc = Just $ G.Description $ "execute VOLATILE function " <> functionName <<> " which returns " <>> tableName
m [FieldParser n (MutationDB b (RemoteSelect UnpreparedValue) (UnpreparedValue b))]
buildFunctionMutationFields sourceName functionName functionInfo tableName selPerms = do
let funcDesc = Just $ G.Description $ "execute VOLATILE function " <> functionName <<> " which returns " <>> tableName
jsonAggSelect = _fiJsonAggSelect functionInfo
catMaybes
<$> sequenceA
[ requiredFieldParser (mkRF . MDBFunction jsonAggSelect) $ selectFunction sourceName functionInfo funcDesc selPerms
[ requiredFieldParser (MDBFunction jsonAggSelect) $ selectFunction sourceName functionInfo funcDesc selPerms
-- TODO: do we want aggregate mutation functions?
]