graphql-engine/server/src-lib/Hasura/Function/Metadata.hs
Tom Harding e0c0043e76 Upgrade Ormolu to 0.7.0.0
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/9284
GitOrigin-RevId: 2f2cf2ad01900a54e4bdb970205ac0ef313c7e00
2023-05-24 13:53:53 +00:00

77 lines
2.2 KiB
Haskell

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}
-- | Types for storing user-defined-functions in metadata
module Hasura.Function.Metadata
( FunctionMetadata (..),
fmComment,
fmConfiguration,
fmFunction,
fmPermissions,
)
where
import Autodocodec hiding (object, (.=))
import Autodocodec qualified as AC
import Control.Lens hiding (set, (.=))
import Data.Aeson.Types
import Data.Text qualified as T
import Hasura.Function.Cache
import Hasura.Prelude
import Hasura.RQL.Types.Backend
import Hasura.RQL.Types.BackendTag (backendPrefix)
data FunctionMetadata b = FunctionMetadata
{ _fmFunction :: FunctionName b,
_fmConfiguration :: FunctionConfig b,
_fmPermissions :: [FunctionPermissionInfo],
_fmComment :: Maybe Text
}
deriving (Generic)
deriving instance (Backend b) => Show (FunctionMetadata b)
deriving instance (Backend b) => Eq (FunctionMetadata b)
instance (Backend b) => ToJSON (FunctionMetadata b) where
toJSON = genericToJSON hasuraJSON
$(makeLenses ''FunctionMetadata)
instance (Backend b) => FromJSON (FunctionMetadata b) where
parseJSON = withObject "FunctionMetadata" $ \o ->
FunctionMetadata
<$> o
.: "function"
<*> o
.:? "configuration"
.!= emptyFunctionConfig
<*> o
.:? "permissions"
.!= []
<*> o
.:? "comment"
instance (Backend b) => HasCodec (FunctionMetadata b) where
codec =
CommentCodec
( T.unlines
[ "A custom SQL function to add to the GraphQL schema with configuration.",
"",
"https://hasura.io/docs/latest/graphql/core/api-reference/schema-metadata-api/custom-functions.html#args-syntax"
]
)
$ AC.object (backendPrefix @b <> "FunctionMetadata")
$ FunctionMetadata
<$> requiredField "function" nameDoc
AC..= _fmFunction
<*> optionalFieldWithOmittedDefault "configuration" emptyFunctionConfig configDoc
AC..= _fmConfiguration
<*> optionalFieldWithOmittedDefault' "permissions" []
AC..= _fmPermissions
<*> optionalField' "comment"
AC..= _fmComment
where
nameDoc = "Name of the SQL function"
configDoc = "Configuration for the SQL function"