mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-21 14:31:55 +03:00
ce1e068813
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/9170 GitOrigin-RevId: 01258fbcde8471c1b693b06d37c3242fe4909107
51 lines
1.7 KiB
Haskell
51 lines
1.7 KiB
Haskell
-- | Common codecs shared between similar logical model resolvers.
|
|
module Hasura.LogicalModelResolver.Codec
|
|
( nativeQueryRelationshipsCodec,
|
|
)
|
|
where
|
|
|
|
import Autodocodec (HasCodec (), HasObjectCodec (..), bimapCodec)
|
|
import Autodocodec qualified as AC
|
|
import Data.Aeson (Value)
|
|
import Data.HashMap.Strict.InsOrd qualified as InsOrdHashMap
|
|
import Hasura.Prelude hiding (first)
|
|
import Hasura.RQL.Types.Backend (Backend (..))
|
|
import Hasura.RQL.Types.Common (RelName)
|
|
import Hasura.RQL.Types.Relationships.Local (RelDef, RelManualNativeQueryConfig)
|
|
|
|
-- | Codec for native-query-only relationships
|
|
nativeQueryRelationshipsCodec ::
|
|
forall b.
|
|
(Backend b) =>
|
|
AC.Codec
|
|
Value
|
|
(InsOrdHashMap.InsOrdHashMap RelName (RelDef (RelManualNativeQueryConfig b)))
|
|
(InsOrdHashMap.InsOrdHashMap RelName (RelDef (RelManualNativeQueryConfig b)))
|
|
nativeQueryRelationshipsCodec =
|
|
AC.dimapCodec
|
|
( InsOrdHashMap.fromList
|
|
. fmap
|
|
( \(MergedObject (NameField name) nst) ->
|
|
(name, nst)
|
|
)
|
|
)
|
|
( fmap (\(fld, nst) -> MergedObject (NameField fld) nst) . InsOrdHashMap.toList
|
|
)
|
|
( AC.listCodec $
|
|
AC.object "RelDefRelManualNativeQueryConfig" $
|
|
AC.objectCodec @(MergedObject (NameField RelName) (RelDef (RelManualNativeQueryConfig b)))
|
|
)
|
|
|
|
data MergedObject a b = MergedObject
|
|
{ moFst :: a,
|
|
moSnd :: b
|
|
}
|
|
|
|
instance (HasObjectCodec a, HasObjectCodec b) => HasObjectCodec (MergedObject a b) where
|
|
objectCodec = MergedObject <$> bimapCodec Right moFst objectCodec <*> bimapCodec Right moSnd objectCodec
|
|
|
|
newtype NameField a = NameField {nameField :: a}
|
|
|
|
instance (HasCodec a) => HasObjectCodec (NameField a) where
|
|
objectCodec = NameField <$> AC.requiredField "name" "name" AC..= nameField
|