mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-18 04:51:35 +03:00
7aa341944b
## Description This PR is a incremental step towards achieving the goal of #8344. It is a less ambitious version of #8484. This PR removes all references to `HasServerConfigCtx` from the cache build and removes `ServerConfigCtx` from `CacheBuildParams`, making `ServerConfigCtx` an argument being passed around manually instead. This has several benefits: by making it an arrow argument, we now properly integrate the fields that change over time in the dependency framework, as they should be, and we can clean up some of the top-level app code. ## Implementation In practice, this PR introduces a `HasServerConfigCtx` instance for `CacheRWT`, the monad we use to build the cache, so we can retrieve the `ServerConfigCtx` in the implementation of `CacheRWM`. This contributes to reducing the amount of `HasServerConfigCtx` in the code: we can remove `SchemaUpdateT` altogether, and we can remove the `HasServerConfigCtx` instance of `Handler`. This makes `HasServerConfigCtx` almost **an implementation detail of the Metadata API**. This first step is enough to achieve the goal of #8344: we can now build the schema cache in the app monad, since we no longer rely on `HasServerConfigCtx` to build it. ## Drawbacks This PR does not attempt to remove the use of `ServerConfigCtx` itself in the schema cache build: doing so would make this PR much much bigger. Ideally, to avoid having all the static fields given as arrow-ish arguments to the cache, we could depend on `HasAppEnv` in the cache build, and use `AppContext` as an arrow argument. But making the cache build depend on the full `AppEnv` and `AppContext` creates a lot of circular imports; and since removing `ServerConfigCtx` itself isn't required to achieve #8344, this PR keeps it wholesale and defers cleaning it to a future PR. A negative consequence of this is that we need an `Eq` instance on `ServerConfigCtx`, and that instance is inelegant. ## Future work There are several further steps we can take in parallel after this is merged. First, again, we can make a new version of #8344, removing `CacheBuild`, FINALLY. As for `ServerConfigCtx`, we can split it / rename it to make ad-hoc structures. If it turns out that `ServerConfigCtx` is only ever used for the schema cache build, we could split it between `CacheBuildEnv` and `CacheBuildContext`, which will be subsets of `AppEnv` and `AppContext`, avoiding import loops. PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8509 GitOrigin-RevId: 01b37cc3fd3490d6b117701e22fc4ac88b62b6b5
561 lines
21 KiB
Haskell
561 lines
21 KiB
Haskell
{-# LANGUAGE TemplateHaskell #-}
|
|
|
|
-- | The RQL query ('/v1/query')
|
|
module Hasura.Server.API.Query
|
|
( RQLQuery,
|
|
queryModifiesSchemaCache,
|
|
requiresAdmin,
|
|
runQuery,
|
|
)
|
|
where
|
|
|
|
import Control.Monad.Trans.Control (MonadBaseControl)
|
|
import Data.Aeson
|
|
import Data.Aeson.Casing
|
|
import Data.Aeson.TH
|
|
import Data.Environment qualified as Env
|
|
import Data.Has (Has)
|
|
import Hasura.App.State
|
|
import Hasura.Backends.Postgres.DDL.RunSQL
|
|
import Hasura.Base.Error
|
|
import Hasura.EncJSON
|
|
import Hasura.GraphQL.Execute.Backend
|
|
import Hasura.Logging qualified as L
|
|
import Hasura.Metadata.Class
|
|
import Hasura.Prelude
|
|
import Hasura.RQL.DDL.Action
|
|
import Hasura.RQL.DDL.ApiLimit
|
|
import Hasura.RQL.DDL.ComputedField
|
|
import Hasura.RQL.DDL.CustomTypes
|
|
import Hasura.RQL.DDL.Endpoint
|
|
import Hasura.RQL.DDL.EventTrigger
|
|
import Hasura.RQL.DDL.Metadata
|
|
import Hasura.RQL.DDL.Permission
|
|
import Hasura.RQL.DDL.QueryCollection
|
|
import Hasura.RQL.DDL.Relationship
|
|
import Hasura.RQL.DDL.Relationship.Rename
|
|
import Hasura.RQL.DDL.RemoteRelationship
|
|
import Hasura.RQL.DDL.ScheduledTrigger
|
|
import Hasura.RQL.DDL.Schema
|
|
import Hasura.RQL.DML.Count
|
|
import Hasura.RQL.DML.Delete
|
|
import Hasura.RQL.DML.Insert
|
|
import Hasura.RQL.DML.Select
|
|
import Hasura.RQL.DML.Types
|
|
import Hasura.RQL.DML.Update
|
|
import Hasura.RQL.Types.Allowlist
|
|
import Hasura.RQL.Types.Common
|
|
import Hasura.RQL.Types.CustomTypes
|
|
import Hasura.RQL.Types.Endpoint
|
|
import Hasura.RQL.Types.Metadata
|
|
import Hasura.RQL.Types.Permission
|
|
import Hasura.RQL.Types.QueryCollection
|
|
import Hasura.RQL.Types.ScheduledTrigger
|
|
import Hasura.RQL.Types.SchemaCache.Build
|
|
import Hasura.RQL.Types.Source
|
|
import Hasura.RemoteSchema.MetadataAPI
|
|
import Hasura.SQL.Backend
|
|
import Hasura.Server.Types
|
|
import Hasura.Server.Utils
|
|
import Hasura.Services
|
|
import Hasura.Session
|
|
import Hasura.Tracing qualified as Tracing
|
|
|
|
data RQLQueryV1
|
|
= RQAddExistingTableOrView !(TrackTable ('Postgres 'Vanilla))
|
|
| RQTrackTable !(TrackTable ('Postgres 'Vanilla))
|
|
| RQUntrackTable !(UntrackTable ('Postgres 'Vanilla))
|
|
| RQSetTableIsEnum !(SetTableIsEnum ('Postgres 'Vanilla))
|
|
| RQSetTableCustomization !(SetTableCustomization ('Postgres 'Vanilla))
|
|
| RQTrackFunction !(TrackFunction ('Postgres 'Vanilla))
|
|
| RQUntrackFunction !(UnTrackFunction ('Postgres 'Vanilla))
|
|
| RQCreateObjectRelationship !(CreateObjRel ('Postgres 'Vanilla))
|
|
| RQCreateArrayRelationship !(CreateArrRel ('Postgres 'Vanilla))
|
|
| RQDropRelationship !(DropRel ('Postgres 'Vanilla))
|
|
| RQSetRelationshipComment !(SetRelComment ('Postgres 'Vanilla))
|
|
| RQRenameRelationship !(RenameRel ('Postgres 'Vanilla))
|
|
| -- computed fields related
|
|
RQAddComputedField !(AddComputedField ('Postgres 'Vanilla))
|
|
| RQDropComputedField !(DropComputedField ('Postgres 'Vanilla))
|
|
| RQCreateRemoteRelationship !(CreateFromSourceRelationship ('Postgres 'Vanilla))
|
|
| RQUpdateRemoteRelationship !(CreateFromSourceRelationship ('Postgres 'Vanilla))
|
|
| RQDeleteRemoteRelationship !(DeleteFromSourceRelationship ('Postgres 'Vanilla))
|
|
| RQCreateInsertPermission !(CreatePerm InsPerm ('Postgres 'Vanilla))
|
|
| RQCreateSelectPermission !(CreatePerm SelPerm ('Postgres 'Vanilla))
|
|
| RQCreateUpdatePermission !(CreatePerm UpdPerm ('Postgres 'Vanilla))
|
|
| RQCreateDeletePermission !(CreatePerm DelPerm ('Postgres 'Vanilla))
|
|
| RQDropInsertPermission !(DropPerm ('Postgres 'Vanilla))
|
|
| RQDropSelectPermission !(DropPerm ('Postgres 'Vanilla))
|
|
| RQDropUpdatePermission !(DropPerm ('Postgres 'Vanilla))
|
|
| RQDropDeletePermission !(DropPerm ('Postgres 'Vanilla))
|
|
| RQSetPermissionComment !(SetPermComment ('Postgres 'Vanilla))
|
|
| RQGetInconsistentMetadata !GetInconsistentMetadata
|
|
| RQDropInconsistentMetadata !DropInconsistentMetadata
|
|
| RQInsert !InsertQuery
|
|
| RQSelect !SelectQuery
|
|
| RQUpdate !UpdateQuery
|
|
| RQDelete !DeleteQuery
|
|
| RQCount !CountQuery
|
|
| RQBulk ![RQLQuery]
|
|
| -- schema-stitching, custom resolver related
|
|
RQAddRemoteSchema !AddRemoteSchemaQuery
|
|
| RQUpdateRemoteSchema !AddRemoteSchemaQuery
|
|
| RQRemoveRemoteSchema !RemoteSchemaNameQuery
|
|
| RQReloadRemoteSchema !RemoteSchemaNameQuery
|
|
| RQIntrospectRemoteSchema !RemoteSchemaNameQuery
|
|
| RQCreateEventTrigger !(CreateEventTriggerQuery ('Postgres 'Vanilla))
|
|
| RQDeleteEventTrigger !(DeleteEventTriggerQuery ('Postgres 'Vanilla))
|
|
| RQRedeliverEvent !(RedeliverEventQuery ('Postgres 'Vanilla))
|
|
| RQInvokeEventTrigger !(InvokeEventTriggerQuery ('Postgres 'Vanilla))
|
|
| -- scheduled triggers
|
|
RQCreateCronTrigger !CreateCronTrigger
|
|
| RQDeleteCronTrigger !ScheduledTriggerName
|
|
| RQCreateScheduledEvent !CreateScheduledEvent
|
|
| -- query collections, allow list related
|
|
RQCreateQueryCollection !CreateCollection
|
|
| RQRenameQueryCollection !RenameCollection
|
|
| RQDropQueryCollection !DropCollection
|
|
| RQAddQueryToCollection !AddQueryToCollection
|
|
| RQDropQueryFromCollection !DropQueryFromCollection
|
|
| RQAddCollectionToAllowlist !AllowlistEntry
|
|
| RQDropCollectionFromAllowlist !DropCollectionFromAllowlist
|
|
| RQRunSql !RunSQL
|
|
| RQReplaceMetadata !ReplaceMetadata
|
|
| RQExportMetadata !ExportMetadata
|
|
| RQClearMetadata !ClearMetadata
|
|
| RQReloadMetadata !ReloadMetadata
|
|
| RQCreateAction !CreateAction
|
|
| RQDropAction !DropAction
|
|
| RQUpdateAction !UpdateAction
|
|
| RQCreateActionPermission !CreateActionPermission
|
|
| RQDropActionPermission !DropActionPermission
|
|
| RQCreateRestEndpoint !CreateEndpoint
|
|
| RQDropRestEndpoint !DropEndpoint
|
|
| RQDumpInternalState !DumpInternalState
|
|
| RQSetCustomTypes !CustomTypes
|
|
|
|
data RQLQueryV2
|
|
= RQV2TrackTable !(TrackTableV2 ('Postgres 'Vanilla))
|
|
| RQV2SetTableCustomFields !SetTableCustomFields -- deprecated
|
|
| RQV2TrackFunction !(TrackFunctionV2 ('Postgres 'Vanilla))
|
|
| RQV2ReplaceMetadata !ReplaceMetadataV2
|
|
|
|
data RQLQuery
|
|
= RQV1 !RQLQueryV1
|
|
| RQV2 !RQLQueryV2
|
|
|
|
-- Since at least one of the following mutually recursive instances is defined
|
|
-- via TH, after 9.0 they must all be defined within the same TH splice.
|
|
$( concat
|
|
<$> sequence
|
|
[ [d|
|
|
instance FromJSON RQLQuery where
|
|
parseJSON = withObject "Object" $ \o -> do
|
|
mVersion <- o .:? "version"
|
|
let version = fromMaybe VIVersion1 mVersion
|
|
val = Object o
|
|
case version of
|
|
VIVersion1 -> RQV1 <$> parseJSON val
|
|
VIVersion2 -> RQV2 <$> parseJSON val
|
|
|],
|
|
deriveFromJSON
|
|
defaultOptions
|
|
{ constructorTagModifier = snakeCase . drop 2,
|
|
sumEncoding = TaggedObject "type" "args"
|
|
}
|
|
''RQLQueryV1,
|
|
deriveFromJSON
|
|
defaultOptions
|
|
{ constructorTagModifier = snakeCase . drop 4,
|
|
sumEncoding = TaggedObject "type" "args",
|
|
tagSingleConstructors = True
|
|
}
|
|
''RQLQueryV2
|
|
]
|
|
)
|
|
|
|
runQuery ::
|
|
( MonadIO m,
|
|
MonadError QErr m,
|
|
HasAppEnv m,
|
|
Tracing.MonadTrace m,
|
|
MonadBaseControl IO m,
|
|
MonadMetadataStorageQueryAPI m,
|
|
MonadResolveSource m,
|
|
MonadQueryTags m,
|
|
MonadEventLogCleanup m,
|
|
ProvidesHasuraServices m,
|
|
MonadGetApiTimeLimit m,
|
|
UserInfoM m
|
|
) =>
|
|
AppContext ->
|
|
RebuildableSchemaCache ->
|
|
RQLQuery ->
|
|
m (EncJSON, RebuildableSchemaCache)
|
|
runQuery appContext sc query = do
|
|
appEnv@AppEnv {..} <- askAppEnv
|
|
let logger = _lsLogger appEnvLoggers
|
|
when ((appEnvEnableReadOnlyMode == ReadOnlyModeEnabled) && queryModifiesUserDB query) $
|
|
throw400 NotSupported "Cannot run write queries when read-only mode is enabled"
|
|
|
|
let exportsMetadata = \case
|
|
RQV1 (RQExportMetadata _) -> True
|
|
_ -> False
|
|
metadataDefaults =
|
|
if (exportsMetadata query)
|
|
then emptyMetadataDefaults
|
|
else acMetadataDefaults appContext
|
|
serverConfigCtx = buildServerConfigCtx appEnv appContext
|
|
|
|
(metadata, currentResourceVersion) <- liftEitherM fetchMetadata
|
|
((result, updatedMetadata), updatedCache, invalidations) <-
|
|
runQueryM (acEnvironment appContext) query
|
|
-- TODO: remove this straight runReaderT that provides no actual new info
|
|
& flip runReaderT logger
|
|
& runMetadataT metadata metadataDefaults
|
|
& runCacheRWT serverConfigCtx sc
|
|
when (queryModifiesSchemaCache query) $ do
|
|
case appEnvEnableMaintenanceMode of
|
|
MaintenanceModeDisabled -> do
|
|
-- set modified metadata in storage
|
|
newResourceVersion <- liftEitherM $ setMetadata currentResourceVersion updatedMetadata
|
|
-- notify schema cache sync
|
|
liftEitherM $ notifySchemaCacheSync newResourceVersion appEnvInstanceId invalidations
|
|
MaintenanceModeEnabled () ->
|
|
throw500 "metadata cannot be modified in maintenance mode"
|
|
pure (result, updatedCache)
|
|
|
|
-- | A predicate that determines whether the given query might modify/rebuild the schema cache. If
|
|
-- so, it needs to acquire the global lock on the schema cache so that other queries do not modify
|
|
-- it concurrently.
|
|
--
|
|
-- Ideally, we would enforce this using the type system — queries for which this function returns
|
|
-- 'False' should not be allowed to modify the schema cache. But for now we just ensure consistency
|
|
-- by hand.
|
|
queryModifiesSchemaCache :: RQLQuery -> Bool
|
|
queryModifiesSchemaCache (RQV1 qi) = case qi of
|
|
RQAddExistingTableOrView _ -> True
|
|
RQTrackTable _ -> True
|
|
RQUntrackTable _ -> True
|
|
RQTrackFunction _ -> True
|
|
RQUntrackFunction _ -> True
|
|
RQSetTableIsEnum _ -> True
|
|
RQCreateObjectRelationship _ -> True
|
|
RQCreateArrayRelationship _ -> True
|
|
RQDropRelationship _ -> True
|
|
RQSetRelationshipComment _ -> False
|
|
RQRenameRelationship _ -> True
|
|
RQAddComputedField _ -> True
|
|
RQDropComputedField _ -> True
|
|
RQCreateRemoteRelationship _ -> True
|
|
RQUpdateRemoteRelationship _ -> True
|
|
RQDeleteRemoteRelationship _ -> True
|
|
RQCreateInsertPermission _ -> True
|
|
RQCreateSelectPermission _ -> True
|
|
RQCreateUpdatePermission _ -> True
|
|
RQCreateDeletePermission _ -> True
|
|
RQDropInsertPermission _ -> True
|
|
RQDropSelectPermission _ -> True
|
|
RQDropUpdatePermission _ -> True
|
|
RQDropDeletePermission _ -> True
|
|
RQSetPermissionComment _ -> False
|
|
RQGetInconsistentMetadata _ -> False
|
|
RQDropInconsistentMetadata _ -> True
|
|
RQInsert _ -> False
|
|
RQSelect _ -> False
|
|
RQUpdate _ -> False
|
|
RQDelete _ -> False
|
|
RQCount _ -> False
|
|
RQAddRemoteSchema _ -> True
|
|
RQUpdateRemoteSchema _ -> True
|
|
RQRemoveRemoteSchema _ -> True
|
|
RQReloadRemoteSchema _ -> True
|
|
RQIntrospectRemoteSchema _ -> False
|
|
RQCreateEventTrigger _ -> True
|
|
RQDeleteEventTrigger _ -> True
|
|
RQRedeliverEvent _ -> False
|
|
RQInvokeEventTrigger _ -> False
|
|
RQCreateCronTrigger _ -> True
|
|
RQDeleteCronTrigger _ -> True
|
|
RQCreateScheduledEvent _ -> False
|
|
RQCreateQueryCollection _ -> True
|
|
RQRenameQueryCollection _ -> True
|
|
RQDropQueryCollection _ -> True
|
|
RQAddQueryToCollection _ -> True
|
|
RQDropQueryFromCollection _ -> True
|
|
RQAddCollectionToAllowlist _ -> True
|
|
RQDropCollectionFromAllowlist _ -> True
|
|
RQRunSql q -> isSchemaCacheBuildRequiredRunSQL q
|
|
RQReplaceMetadata _ -> True
|
|
RQExportMetadata _ -> False
|
|
RQClearMetadata _ -> True
|
|
RQReloadMetadata _ -> True
|
|
RQCreateRestEndpoint _ -> True
|
|
RQDropRestEndpoint _ -> True
|
|
RQCreateAction _ -> True
|
|
RQDropAction _ -> True
|
|
RQUpdateAction _ -> True
|
|
RQCreateActionPermission _ -> True
|
|
RQDropActionPermission _ -> True
|
|
RQDumpInternalState _ -> False
|
|
RQSetCustomTypes _ -> True
|
|
RQSetTableCustomization _ -> True
|
|
RQBulk qs -> any queryModifiesSchemaCache qs
|
|
queryModifiesSchemaCache (RQV2 qi) = case qi of
|
|
RQV2TrackTable _ -> True
|
|
RQV2SetTableCustomFields _ -> True
|
|
RQV2TrackFunction _ -> True
|
|
RQV2ReplaceMetadata _ -> True
|
|
|
|
-- | A predicate that determines whether the given query might modify user's Database. If
|
|
-- so, when the server is run in safe mode, we should not proceed with those operations.
|
|
queryModifiesUserDB :: RQLQuery -> Bool
|
|
queryModifiesUserDB (RQV1 qi) = case qi of
|
|
RQAddExistingTableOrView _ -> False
|
|
RQTrackTable _ -> False
|
|
RQUntrackTable _ -> False
|
|
RQTrackFunction _ -> False
|
|
RQUntrackFunction _ -> False
|
|
RQSetTableIsEnum _ -> False
|
|
RQCreateObjectRelationship _ -> False
|
|
RQCreateArrayRelationship _ -> False
|
|
RQDropRelationship _ -> False
|
|
RQSetRelationshipComment _ -> False
|
|
RQRenameRelationship _ -> False
|
|
RQAddComputedField _ -> False
|
|
RQDropComputedField _ -> False
|
|
RQCreateRemoteRelationship _ -> False
|
|
RQUpdateRemoteRelationship _ -> False
|
|
RQDeleteRemoteRelationship _ -> False
|
|
RQCreateInsertPermission _ -> False
|
|
RQCreateSelectPermission _ -> False
|
|
RQCreateUpdatePermission _ -> False
|
|
RQCreateDeletePermission _ -> False
|
|
RQDropInsertPermission _ -> False
|
|
RQDropSelectPermission _ -> False
|
|
RQDropUpdatePermission _ -> False
|
|
RQDropDeletePermission _ -> False
|
|
RQSetPermissionComment _ -> False
|
|
RQGetInconsistentMetadata _ -> False
|
|
RQDropInconsistentMetadata _ -> False
|
|
RQInsert _ -> True
|
|
RQSelect _ -> False
|
|
RQUpdate _ -> True
|
|
RQDelete _ -> True
|
|
RQCount _ -> False
|
|
RQAddRemoteSchema _ -> False
|
|
RQUpdateRemoteSchema _ -> False
|
|
RQRemoveRemoteSchema _ -> False
|
|
RQReloadRemoteSchema _ -> False
|
|
RQIntrospectRemoteSchema _ -> False
|
|
RQCreateEventTrigger _ -> True
|
|
RQDeleteEventTrigger _ -> True
|
|
RQRedeliverEvent _ -> False
|
|
RQInvokeEventTrigger _ -> False
|
|
RQCreateCronTrigger _ -> False
|
|
RQDeleteCronTrigger _ -> False
|
|
RQCreateScheduledEvent _ -> False
|
|
RQCreateQueryCollection _ -> False
|
|
RQRenameQueryCollection _ -> False
|
|
RQDropQueryCollection _ -> False
|
|
RQAddQueryToCollection _ -> False
|
|
RQDropQueryFromCollection _ -> False
|
|
RQAddCollectionToAllowlist _ -> False
|
|
RQDropCollectionFromAllowlist _ -> False
|
|
RQRunSql _ -> True
|
|
RQReplaceMetadata _ -> True
|
|
RQExportMetadata _ -> False
|
|
RQClearMetadata _ -> False
|
|
RQReloadMetadata _ -> False
|
|
RQCreateRestEndpoint _ -> False
|
|
RQDropRestEndpoint _ -> False
|
|
RQCreateAction _ -> False
|
|
RQDropAction _ -> False
|
|
RQUpdateAction _ -> False
|
|
RQCreateActionPermission _ -> False
|
|
RQDropActionPermission _ -> False
|
|
RQDumpInternalState _ -> False
|
|
RQSetCustomTypes _ -> False
|
|
RQSetTableCustomization _ -> False
|
|
RQBulk qs -> any queryModifiesUserDB qs
|
|
queryModifiesUserDB (RQV2 qi) = case qi of
|
|
RQV2TrackTable _ -> False
|
|
RQV2SetTableCustomFields _ -> False
|
|
RQV2TrackFunction _ -> False
|
|
RQV2ReplaceMetadata _ -> True
|
|
|
|
runQueryM ::
|
|
( CacheRWM m,
|
|
UserInfoM m,
|
|
MonadBaseControl IO m,
|
|
MonadIO m,
|
|
HasServerConfigCtx m,
|
|
Tracing.MonadTrace m,
|
|
MetadataM m,
|
|
MonadMetadataStorageQueryAPI m,
|
|
MonadQueryTags m,
|
|
MonadReader r m,
|
|
MonadError QErr m,
|
|
Has (L.Logger L.Hasura) r,
|
|
MonadEventLogCleanup m,
|
|
ProvidesHasuraServices m,
|
|
MonadGetApiTimeLimit m
|
|
) =>
|
|
Env.Environment ->
|
|
RQLQuery ->
|
|
m EncJSON
|
|
runQueryM env rq = withPathK "args" $ case rq of
|
|
RQV1 q -> runQueryV1M q
|
|
RQV2 q -> runQueryV2M q
|
|
where
|
|
runQueryV1M = \case
|
|
RQAddExistingTableOrView q -> runTrackTableQ q
|
|
RQTrackTable q -> runTrackTableQ q
|
|
RQUntrackTable q -> runUntrackTableQ q
|
|
RQSetTableIsEnum q -> runSetExistingTableIsEnumQ q
|
|
RQSetTableCustomization q -> runSetTableCustomization q
|
|
RQTrackFunction q -> runTrackFunc q
|
|
RQUntrackFunction q -> runUntrackFunc q
|
|
RQCreateObjectRelationship q -> runCreateRelationship ObjRel $ unCreateObjRel q
|
|
RQCreateArrayRelationship q -> runCreateRelationship ArrRel $ unCreateArrRel q
|
|
RQDropRelationship q -> runDropRel q
|
|
RQSetRelationshipComment q -> runSetRelComment q
|
|
RQRenameRelationship q -> runRenameRel q
|
|
RQAddComputedField q -> runAddComputedField q
|
|
RQDropComputedField q -> runDropComputedField q
|
|
RQCreateInsertPermission q -> runCreatePerm q
|
|
RQCreateSelectPermission q -> runCreatePerm q
|
|
RQCreateUpdatePermission q -> runCreatePerm q
|
|
RQCreateDeletePermission q -> runCreatePerm q
|
|
RQDropInsertPermission q -> runDropPerm PTInsert q
|
|
RQDropSelectPermission q -> runDropPerm PTSelect q
|
|
RQDropUpdatePermission q -> runDropPerm PTUpdate q
|
|
RQDropDeletePermission q -> runDropPerm PTDelete q
|
|
RQSetPermissionComment q -> runSetPermComment q
|
|
RQGetInconsistentMetadata q -> runGetInconsistentMetadata q
|
|
RQDropInconsistentMetadata q -> runDropInconsistentMetadata q
|
|
RQInsert q -> runInsert q
|
|
RQSelect q -> runSelect q
|
|
RQUpdate q -> runUpdate q
|
|
RQDelete q -> runDelete q
|
|
RQCount q -> runCount q
|
|
RQAddRemoteSchema q -> runAddRemoteSchema env q
|
|
RQUpdateRemoteSchema q -> runUpdateRemoteSchema env q
|
|
RQRemoveRemoteSchema q -> runRemoveRemoteSchema q
|
|
RQReloadRemoteSchema q -> runReloadRemoteSchema q
|
|
RQIntrospectRemoteSchema q -> runIntrospectRemoteSchema q
|
|
RQCreateRemoteRelationship q -> runCreateRemoteRelationship q
|
|
RQUpdateRemoteRelationship q -> runUpdateRemoteRelationship q
|
|
RQDeleteRemoteRelationship q -> runDeleteRemoteRelationship q
|
|
RQCreateEventTrigger q -> runCreateEventTriggerQuery q
|
|
RQDeleteEventTrigger q -> runDeleteEventTriggerQuery q
|
|
RQRedeliverEvent q -> runRedeliverEvent q
|
|
RQInvokeEventTrigger q -> runInvokeEventTrigger q
|
|
RQCreateCronTrigger q -> runCreateCronTrigger q
|
|
RQDeleteCronTrigger q -> runDeleteCronTrigger q
|
|
RQCreateScheduledEvent q -> runCreateScheduledEvent q
|
|
RQCreateQueryCollection q -> runCreateCollection q
|
|
RQRenameQueryCollection q -> runRenameCollection q
|
|
RQDropQueryCollection q -> runDropCollection q
|
|
RQAddQueryToCollection q -> runAddQueryToCollection q
|
|
RQDropQueryFromCollection q -> runDropQueryFromCollection q
|
|
RQAddCollectionToAllowlist q -> runAddCollectionToAllowlist q
|
|
RQDropCollectionFromAllowlist q -> runDropCollectionFromAllowlist q
|
|
RQReplaceMetadata q -> runReplaceMetadata q
|
|
RQClearMetadata q -> runClearMetadata q
|
|
RQExportMetadata q -> runExportMetadata q
|
|
RQReloadMetadata q -> runReloadMetadata q
|
|
RQCreateAction q -> runCreateAction q
|
|
RQDropAction q -> runDropAction q
|
|
RQUpdateAction q -> runUpdateAction q
|
|
RQCreateActionPermission q -> runCreateActionPermission q
|
|
RQDropActionPermission q -> runDropActionPermission q
|
|
RQCreateRestEndpoint q -> runCreateEndpoint q
|
|
RQDropRestEndpoint q -> runDropEndpoint q
|
|
RQDumpInternalState q -> runDumpInternalState q
|
|
RQRunSql q -> runRunSQL @'Vanilla q
|
|
RQSetCustomTypes q -> runSetCustomTypes q
|
|
RQBulk qs -> encJFromList <$> indexedMapM (runQueryM env) qs
|
|
|
|
runQueryV2M = \case
|
|
RQV2TrackTable q -> runTrackTableV2Q q
|
|
RQV2SetTableCustomFields q -> runSetTableCustomFieldsQV2 q
|
|
RQV2TrackFunction q -> runTrackFunctionV2 q
|
|
RQV2ReplaceMetadata q -> runReplaceMetadataV2 q
|
|
|
|
requiresAdmin :: RQLQuery -> Bool
|
|
requiresAdmin = \case
|
|
RQV1 q -> case q of
|
|
RQAddExistingTableOrView _ -> True
|
|
RQTrackTable _ -> True
|
|
RQUntrackTable _ -> True
|
|
RQSetTableIsEnum _ -> True
|
|
RQSetTableCustomization _ -> True
|
|
RQTrackFunction _ -> True
|
|
RQUntrackFunction _ -> True
|
|
RQCreateObjectRelationship _ -> True
|
|
RQCreateArrayRelationship _ -> True
|
|
RQDropRelationship _ -> True
|
|
RQSetRelationshipComment _ -> True
|
|
RQRenameRelationship _ -> True
|
|
RQAddComputedField _ -> True
|
|
RQDropComputedField _ -> True
|
|
RQCreateRemoteRelationship _ -> True
|
|
RQUpdateRemoteRelationship _ -> True
|
|
RQDeleteRemoteRelationship _ -> True
|
|
RQCreateInsertPermission _ -> True
|
|
RQCreateSelectPermission _ -> True
|
|
RQCreateUpdatePermission _ -> True
|
|
RQCreateDeletePermission _ -> True
|
|
RQDropInsertPermission _ -> True
|
|
RQDropSelectPermission _ -> True
|
|
RQDropUpdatePermission _ -> True
|
|
RQDropDeletePermission _ -> True
|
|
RQSetPermissionComment _ -> True
|
|
RQGetInconsistentMetadata _ -> True
|
|
RQDropInconsistentMetadata _ -> True
|
|
RQInsert _ -> False
|
|
RQSelect _ -> False
|
|
RQUpdate _ -> False
|
|
RQDelete _ -> False
|
|
RQCount _ -> False
|
|
RQAddRemoteSchema _ -> True
|
|
RQUpdateRemoteSchema _ -> True
|
|
RQRemoveRemoteSchema _ -> True
|
|
RQReloadRemoteSchema _ -> True
|
|
RQIntrospectRemoteSchema _ -> True
|
|
RQCreateEventTrigger _ -> True
|
|
RQDeleteEventTrigger _ -> True
|
|
RQRedeliverEvent _ -> True
|
|
RQInvokeEventTrigger _ -> True
|
|
RQCreateCronTrigger _ -> True
|
|
RQDeleteCronTrigger _ -> True
|
|
RQCreateScheduledEvent _ -> True
|
|
RQCreateQueryCollection _ -> True
|
|
RQRenameQueryCollection _ -> True
|
|
RQDropQueryCollection _ -> True
|
|
RQAddQueryToCollection _ -> True
|
|
RQDropQueryFromCollection _ -> True
|
|
RQAddCollectionToAllowlist _ -> True
|
|
RQDropCollectionFromAllowlist _ -> True
|
|
RQReplaceMetadata _ -> True
|
|
RQClearMetadata _ -> True
|
|
RQExportMetadata _ -> True
|
|
RQReloadMetadata _ -> True
|
|
RQCreateRestEndpoint _ -> True
|
|
RQDropRestEndpoint _ -> True
|
|
RQCreateAction _ -> True
|
|
RQDropAction _ -> True
|
|
RQUpdateAction _ -> True
|
|
RQCreateActionPermission _ -> True
|
|
RQDropActionPermission _ -> True
|
|
RQDumpInternalState _ -> True
|
|
RQSetCustomTypes _ -> True
|
|
RQRunSql _ -> True
|
|
RQBulk qs -> any requiresAdmin qs
|
|
RQV2 q -> case q of
|
|
RQV2TrackTable _ -> True
|
|
RQV2SetTableCustomFields _ -> True
|
|
RQV2TrackFunction _ -> True
|
|
RQV2ReplaceMetadata _ -> True
|