graphql-engine/server/src-lib/Hasura/Metadata/DTO/MetadataV3.hs
Jesse Hallett 1ad37eff31 server: codecs for network config, graphql introspection
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8132
GitOrigin-RevId: 6b800f35a76b6d38817862a4678644b8bf230a95
2023-03-17 17:46:16 +00:00

90 lines
5.3 KiB
Haskell

{-# LANGUAGE OverloadedLists #-}
module Hasura.Metadata.DTO.MetadataV3 (MetadataV3 (..)) where
import Autodocodec
( Autodocodec (Autodocodec),
HasCodec (codec),
object,
optionalField,
optionalFieldWithOmittedDefault,
optionalFieldWithOmittedDefault',
optionalFieldWithOmittedDefaultWith,
requiredFieldWith,
(.=),
)
import Autodocodec.OpenAPI ()
import Data.Aeson (FromJSON, ToJSON)
import Data.HashMap.Strict.InsOrd.Autodocodec (sortedElemsCodec)
import Data.OpenApi qualified as OpenApi
import Hasura.Metadata.DTO.Placeholder (PlaceholderObject)
import Hasura.Metadata.DTO.Utils (versionField)
import Hasura.Prelude
import Hasura.RQL.Types.Action (ActionMetadata (_amName))
import Hasura.RQL.Types.Allowlist (AllowlistEntry (aeCollection), MetadataAllowlist)
import Hasura.RQL.Types.ApiLimit (ApiLimit, emptyApiLimit)
import Hasura.RQL.Types.Common (MetricsConfig, emptyMetricsConfig)
import Hasura.RQL.Types.CustomTypes (CustomTypes, emptyCustomTypes)
import Hasura.RQL.Types.Endpoint (_ceName)
import Hasura.RQL.Types.GraphqlSchemaIntrospection (SetGraphqlIntrospectionOptions)
import Hasura.RQL.Types.Metadata.Common (Actions, CronTriggers, Endpoints, InheritedRoles, QueryCollections, RemoteSchemas, Sources, sourcesCodec)
import Hasura.RQL.Types.Network (Network, emptyNetwork)
import Hasura.RQL.Types.OpenTelemetry (OpenTelemetryConfig, emptyOpenTelemetryConfig)
import Hasura.RQL.Types.QueryCollection qualified as QC
import Hasura.RQL.Types.Roles (Role (_rRoleName))
import Hasura.RQL.Types.ScheduledTrigger (CronTriggerMetadata (ctName))
import Hasura.RemoteSchema.Metadata.Core (RemoteSchemaMetadataG (_rsmName))
-- | Revision 3 of the Metadata export format. Note that values of the types,
-- 'PlaceholderArray' and 'PlaceholderObject' will eventually be expanded to represent more detail.
data MetadataV3 = MetadataV3
{ metaV3Sources :: Sources,
metaV3RemoteSchemas :: RemoteSchemas,
metaV3QueryCollections :: QueryCollections,
metaV3Allowlist :: MetadataAllowlist,
metaV3Actions :: Actions,
metaV3CustomTypes :: CustomTypes,
metaV3CronTriggers :: CronTriggers,
metaV3RestEndpoints :: Endpoints,
metaV3ApiLimits :: ApiLimit,
metaV3MetricsConfig :: MetricsConfig,
metaV3InheritedRoles :: InheritedRoles,
metaV3GraphqlSchemaIntrospection :: SetGraphqlIntrospectionOptions,
metaV3Network :: Network,
metaV3BackendConfigs :: Maybe PlaceholderObject,
metaV3OpenTelemetryConfig :: OpenTelemetryConfig
}
deriving stock (Show, Eq, Generic)
deriving (FromJSON, ToJSON, OpenApi.ToSchema) via (Autodocodec MetadataV3)
-- | Codecs simultaneously provide serialization logic for a type, and
-- documentation. A codec can be used to generate a specification in OpenAPI or
-- another format that matches the JSON serialization of the same type.
-- Documentation strings (the second argument to 'optionalField' and to
-- 'requiredField') appear in the generated specification for users' reference.
instance HasCodec MetadataV3 where
codec =
object "MetadataV3" $
MetadataV3
<$ versionField 3
<*> requiredFieldWith "sources" sourcesCodec "configured databases" .= metaV3Sources
<*> optionalFieldWithOmittedDefaultWith "remote_schemas" (sortedElemsCodec _rsmName) [] "merge remote GraphQL schemas and provide a unified GraphQL API" .= metaV3RemoteSchemas
<*> optionalFieldWithOmittedDefaultWith
"query_collections"
(sortedElemsCodec QC._ccName)
mempty
"group queries using query collections"
.= metaV3QueryCollections
<*> optionalFieldWithOmittedDefaultWith "allowlist" (sortedElemsCodec aeCollection) [] "safe GraphQL operations - when allow lists are enabled only these operations are allowed" .= metaV3Allowlist
<*> optionalFieldWithOmittedDefaultWith "actions" (sortedElemsCodec _amName) mempty "action definitions which extend Hasura's schema with custom business logic using custom queries and mutations" .= metaV3Actions
<*> optionalFieldWithOmittedDefault "custom_types" emptyCustomTypes "custom type definitions" .= metaV3CustomTypes
<*> optionalFieldWithOmittedDefaultWith "cron_triggers" (sortedElemsCodec ctName) [] "reliably trigger HTTP endpoints to run custom business logic periodically based on a cron schedule" .= metaV3CronTriggers
<*> optionalFieldWithOmittedDefaultWith "rest_endpoints" (sortedElemsCodec _ceName) [] "REST interfaces to saved GraphQL queries and mutations" .= metaV3RestEndpoints
<*> optionalFieldWithOmittedDefault "api_limits" emptyApiLimit "limts to depth and/or rate of API requests" .= metaV3ApiLimits
<*> optionalFieldWithOmittedDefault' "metrics_config" emptyMetricsConfig .= metaV3MetricsConfig
<*> optionalFieldWithOmittedDefaultWith "inherited_roles" (sortedElemsCodec _rRoleName) [] "an inherited role is a way to create a new role which inherits permissions from two or more roles" .= metaV3InheritedRoles
<*> optionalFieldWithOmittedDefault' "graphql_schema_introspection" mempty .= metaV3GraphqlSchemaIntrospection
<*> optionalFieldWithOmittedDefault' "network" emptyNetwork .= metaV3Network
<*> optionalField "backend_configs" "TODO" .= metaV3BackendConfigs
<*> optionalFieldWithOmittedDefault' "opentelemetry" emptyOpenTelemetryConfig .= metaV3OpenTelemetryConfig