mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-17 12:31:52 +03:00
b84db36ebb
* basic doc for actions * custom_types, sync and async actions * switch to graphql-parser-hs on github * update docs * metadata import/export * webhook calls are now supported * relationships in sync actions * initialise.sql is now in sync with the migration file * fix metadata tests * allow specifying arguments of actions * fix blacklist check on check_build_worthiness job * track custom_types and actions related tables * handlers are now triggered on async actions * default to pgjson unless a field is involved in relationships, for generating definition list * use 'true' for action filter for non admin role * fix create_action_permission sql query * drop permissions when dropping an action * add a hdb_role view (and relationships) to fetch all roles in the system * rename 'webhook' key in action definition to 'handler' * allow templating actions wehook URLs with env vars * add 'update_action' /v1/query type * allow forwarding client headers by setting `forward_client_headers` in action definition * add 'headers' configuration in action definition * handle webhook error response based on status codes * support array relationships for custom types * implement single row mutation, see https://github.com/hasura/graphql-engine/issues/3731 * single row mutation: rename 'pk_columns' -> 'columns' and no-op refactor * use top level primary key inputs for delete_by_pk & account select permissions for single row mutations * use only REST semantics to resolve the webhook response * use 'pk_columns' instead of 'columns' for update_by_pk input * add python basic tests for single row mutations * add action context (name) in webhook payload * Async action response is accessible for non admin roles only if the request session vars equals to action's * clean nulls, empty arrays for actions, custom types in export metadata * async action mutation returns only the UUID of the action * unit tests for URL template parser * Basic sync actions python tests * fix output in async query & add async tests * add admin secret header in async actions python test * document async action architecture in Resolve/Action.hs file * support actions returning array of objects * tests for list type response actions * update docs with actions and custom types metadata API reference * update actions python tests as per #f8e1330 Co-authored-by: Tirumarai Selvan <tirumarai.selvan@gmail.com> Co-authored-by: Aravind Shankar <face11301@gmail.com> Co-authored-by: Rakesh Emmadi <12475069+rakeshkky@users.noreply.github.com>
82 lines
2.5 KiB
Haskell
82 lines
2.5 KiB
Haskell
module Hasura.GraphQL.Schema.Builder
|
|
( TyAgg(..)
|
|
, FieldMap
|
|
, taTypes
|
|
, taFields
|
|
, taScalars
|
|
, taOrdBy
|
|
, addFieldsToTyAgg
|
|
, addTypeInfoToTyAgg
|
|
, addScalarToTyAgg
|
|
, RootFields(..)
|
|
, addQueryField
|
|
, addMutationField
|
|
) where
|
|
|
|
import Control.Lens
|
|
|
|
import qualified Data.HashMap.Strict as Map
|
|
import qualified Data.HashSet as Set
|
|
import qualified Language.GraphQL.Draft.Syntax as G
|
|
|
|
import Hasura.GraphQL.Resolve.Types
|
|
import Hasura.GraphQL.Validate.Types
|
|
import Hasura.Prelude
|
|
import Hasura.SQL.Types
|
|
|
|
-- | A /types aggregate/, which holds role-specific information about visible GraphQL types.
|
|
-- Importantly, it holds more than just the information needed by GraphQL: it also includes how the
|
|
-- GraphQL types relate to Postgres types, which is used to validate literals provided for
|
|
-- Postgres-specific scalars.
|
|
data TyAgg
|
|
= TyAgg
|
|
{ _taTypes :: !TypeMap
|
|
, _taFields :: !FieldMap
|
|
, _taScalars :: !(Set.HashSet PGScalarType)
|
|
, _taOrdBy :: !OrdByCtx
|
|
} deriving (Show, Eq)
|
|
$(makeLenses ''TyAgg)
|
|
|
|
addFieldsToTyAgg :: FieldMap -> TyAgg -> TyAgg
|
|
addFieldsToTyAgg fields =
|
|
over taFields (Map.union fields)
|
|
|
|
addTypeInfoToTyAgg :: TypeInfo -> TyAgg -> TyAgg
|
|
addTypeInfoToTyAgg typeInfo tyAgg =
|
|
tyAgg & taTypes.at (getNamedTy typeInfo) ?~ typeInfo
|
|
|
|
addScalarToTyAgg :: PGScalarType -> TyAgg -> TyAgg
|
|
addScalarToTyAgg pgScalarType =
|
|
over taScalars (Set.insert pgScalarType)
|
|
|
|
instance Semigroup TyAgg where
|
|
(TyAgg t1 f1 s1 o1) <> (TyAgg t2 f2 s2 o2) =
|
|
TyAgg (Map.union t1 t2) (Map.union f1 f2)
|
|
(Set.union s1 s2) (Map.union o1 o2)
|
|
|
|
instance Monoid TyAgg where
|
|
mempty = TyAgg Map.empty Map.empty Set.empty Map.empty
|
|
|
|
-- | A role-specific mapping from root field names to allowed operations.
|
|
data RootFields
|
|
= RootFields
|
|
{ _rootQueryFields :: !(Map.HashMap G.Name (QueryCtx, ObjFldInfo))
|
|
, _rootMutationFields :: !(Map.HashMap G.Name (MutationCtx, ObjFldInfo))
|
|
} deriving (Show, Eq)
|
|
$(makeLenses ''RootFields)
|
|
|
|
addQueryField :: (QueryCtx, ObjFldInfo) -> RootFields -> RootFields
|
|
addQueryField v rootFields =
|
|
rootFields & rootQueryFields.at (_fiName $ snd v) ?~ v
|
|
|
|
addMutationField :: (MutationCtx, ObjFldInfo) -> RootFields -> RootFields
|
|
addMutationField v rootFields =
|
|
rootFields & rootMutationFields.at (_fiName $ snd v) ?~ v
|
|
|
|
instance Semigroup RootFields where
|
|
RootFields a1 b1 <> RootFields a2 b2
|
|
= RootFields (Map.union a1 a2) (Map.union b1 b2)
|
|
|
|
instance Monoid RootFields where
|
|
mempty = RootFields Map.empty Map.empty
|