graphql-engine/server/src-lib/Hasura/RQL/DDL/Endpoint.hs
Antoine Leblanc 74513e351f Use an enum for EndpointMethod and fix incorrect response aggregation.
### Description

This small PR improves the representation of an endpoint method from `Text` to an enum of the supported methods. Additionally, it cleans some of the instances defined on surrounding types (such as Postgres-specific instances on Endpoint types).

Due to a name conflict, this makes `RQL.Types.Endpoint` impossible to re-export from `RQL.Types`, which in turn forces several other modules to import it explicitly, which I think is fine since we want to ultimately get rid of `RQL.Types`.

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/3965
GitOrigin-RevId: 33869007d0d818ddf486fb61d1f6099f9dad7570
2022-03-13 07:41:02 +00:00

62 lines
1.6 KiB
Haskell

module Hasura.RQL.DDL.Endpoint
( runCreateEndpoint,
runDropEndpoint,
dropEndpointInMetadata,
)
where
import Data.HashMap.Strict.InsOrd qualified as OMap
import Data.Text.Extended
import Hasura.Base.Error
import Hasura.EncJSON
import Hasura.Metadata.Class
import Hasura.Prelude
import Hasura.RQL.Types
import Hasura.RQL.Types.Endpoint
runCreateEndpoint ::
( CacheRWM m,
MetadataM m,
MonadMetadataStorageQueryAPI m
) =>
CreateEndpoint ->
m EncJSON
runCreateEndpoint endpoint@EndpointMetadata {..} = do
endpointsMap <- _metaRestEndpoints <$> getMetadata
OMap.lookup _ceName endpointsMap `for_` \_ ->
throw400 AlreadyExists $
"Endpoint with name: " <> toTxt _ceName <> " already exists"
withNewInconsistentObjsCheck $
buildSchemaCacheFor (MOEndpoint _ceName) $
MetadataModifier $
metaRestEndpoints %~ OMap.insert _ceName endpoint
return successMsg
runDropEndpoint ::
( CacheRWM m,
MetadataM m,
MonadMetadataStorageQueryAPI m
) =>
DropEndpoint ->
m EncJSON
runDropEndpoint DropEndpoint {..} = do
checkExists _deName
withNewInconsistentObjsCheck $
buildSchemaCache $
dropEndpointInMetadata _deName
return successMsg
dropEndpointInMetadata :: EndpointName -> MetadataModifier
dropEndpointInMetadata name =
MetadataModifier $ metaRestEndpoints %~ OMap.delete name
checkExists :: (MetadataM m, MonadError QErr m) => EndpointName -> m ()
checkExists name = do
endpointsMap <- _metaRestEndpoints <$> getMetadata
void $
onNothing (OMap.lookup name endpointsMap) $
throw400 NotExists $
"endpoint with name: " <> toTxt name <> " does not exist"