mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-22 06:51:32 +03:00
4831c75d4b
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/5241 GitOrigin-RevId: 04b0031b81110d978f3f0e502dbe22485d54f950
87 lines
3.1 KiB
Haskell
87 lines
3.1 KiB
Haskell
{-# LANGUAGE OverloadedLists #-}
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
|
|
module Hasura.Backends.DataConnector.API.V0.Relationships
|
|
( TableRelationships (..),
|
|
trSourceTable,
|
|
trRelationships,
|
|
Relationship (..),
|
|
rTargetTable,
|
|
rRelationshipType,
|
|
rColumnMapping,
|
|
RelationshipName (..),
|
|
RelationshipType (..),
|
|
SourceColumnName,
|
|
TargetColumnName,
|
|
)
|
|
where
|
|
|
|
import Autodocodec.Extended
|
|
import Autodocodec.OpenAPI ()
|
|
import Control.DeepSeq (NFData)
|
|
import Control.Lens (makeLenses)
|
|
import Data.Aeson (FromJSON, FromJSONKey, ToJSON, ToJSONKey)
|
|
import Data.Data (Data)
|
|
import Data.HashMap.Strict qualified as M
|
|
import Data.Hashable (Hashable)
|
|
import Data.OpenApi (ToSchema)
|
|
import Data.Text (Text)
|
|
import GHC.Generics (Generic)
|
|
import Hasura.Backends.DataConnector.API.V0.Column qualified as API.V0
|
|
import Hasura.Backends.DataConnector.API.V0.Table qualified as API.V0
|
|
import Prelude
|
|
|
|
data TableRelationships = TableRelationships
|
|
{ _trSourceTable :: API.V0.TableName,
|
|
_trRelationships :: M.HashMap RelationshipName Relationship
|
|
}
|
|
deriving stock (Eq, Ord, Show, Generic, Data)
|
|
deriving (FromJSON, ToJSON, ToSchema) via Autodocodec TableRelationships
|
|
|
|
instance HasCodec TableRelationships where
|
|
codec =
|
|
object "TableRelationships" $
|
|
TableRelationships
|
|
<$> requiredField "source_table" "The name of the source table in the relationship" .= _trSourceTable
|
|
<*> requiredField "relationships" "A map of relationships from the source table to target tables. The key of the map is the relationship name" .= _trRelationships
|
|
|
|
data Relationship = Relationship
|
|
{ _rTargetTable :: API.V0.TableName,
|
|
_rRelationshipType :: RelationshipType,
|
|
_rColumnMapping :: M.HashMap SourceColumnName TargetColumnName
|
|
}
|
|
deriving stock (Eq, Ord, Show, Generic, Data)
|
|
deriving (FromJSON, ToJSON, ToSchema) via Autodocodec Relationship
|
|
|
|
instance HasCodec Relationship where
|
|
codec =
|
|
object "Relationship" $
|
|
Relationship
|
|
<$> requiredField "target_table" "The name of the target table in the relationship" .= _rTargetTable
|
|
<*> requiredField "relationship_type" "The type of the relationship" .= _rRelationshipType
|
|
<*> requiredField "column_mapping" "A mapping between columns on the source table to columns on the target table" .= _rColumnMapping
|
|
|
|
newtype RelationshipName = RelationshipName {unRelationshipName :: Text}
|
|
deriving stock (Data, Generic)
|
|
deriving newtype (Eq, Hashable, Ord, Show, ToJSONKey, FromJSONKey, NFData)
|
|
deriving (FromJSON, ToJSON, ToSchema) via Autodocodec Text
|
|
|
|
instance HasCodec RelationshipName where
|
|
codec = dimapCodec RelationshipName unRelationshipName codec
|
|
|
|
data RelationshipType = ObjectRelationship | ArrayRelationship
|
|
deriving stock (Eq, Ord, Show, Generic, Data, Enum, Bounded)
|
|
deriving (FromJSON, ToJSON, ToSchema) via Autodocodec RelationshipType
|
|
|
|
instance HasCodec RelationshipType where
|
|
codec =
|
|
named "RelationshipType" $
|
|
stringConstCodec [(ObjectRelationship, "object"), (ArrayRelationship, "array")]
|
|
|
|
type SourceColumnName = API.V0.ColumnName
|
|
|
|
type TargetColumnName = API.V0.ColumnName
|
|
|
|
$(makeLenses 'TableRelationships)
|
|
$(makeLenses 'Relationship)
|