refactor(workflows): rework types and instances
This commit is contained in:
parent
386d3bfc49
commit
c2169423e6
@ -27,28 +27,28 @@ import Data.Aeson.Types (Parser)
|
|||||||
-- TODO remove
|
-- TODO remove
|
||||||
--import Data.ByteString.Lazy.Internal (ByteString)
|
--import Data.ByteString.Lazy.Internal (ByteString)
|
||||||
|
|
||||||
-- TODO: label type to newtype
|
|
||||||
|
|
||||||
|
|
||||||
----- WORKFLOW GRAPH -----
|
----- WORKFLOW GRAPH -----
|
||||||
|
|
||||||
data WorkflowGraph fileid userid = WorkflowGraph
|
data WorkflowGraph fileid userid = WorkflowGraph
|
||||||
{ wgNodes :: Map WorkflowGraphNodeLabel (WorkflowGraphNode fileid userid)
|
{ wgNodes :: Map WorkflowGraphNodeLabel (WorkflowGraphNode fileid userid)
|
||||||
, wgPayloadViewers :: Map WorkflowPayloadLabel (NonNull (Set WorkflowRole))
|
, wgPayloadViewers :: Map WorkflowPayloadLabel (NonNull (Set (WorkflowRole userid)))
|
||||||
}
|
}
|
||||||
deriving (Show, Eq)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
|
|
||||||
----- WORKFLOW GRAPH: NODES -----
|
----- WORKFLOW GRAPH: NODES -----
|
||||||
|
|
||||||
type WorkflowGraphNodeLabel = CI Text
|
newtype WorkflowGraphNodeLabel = WorkflowGraphNodeLabel (CI Text)
|
||||||
type WorkflowGraphEdgeLabel = CI Text
|
deriving newtype (Eq, Ord, Show, Read, Typeable, ToJSON, ToJSONKey, FromJSON, FromJSONKey, PersistField, PersistFieldSql)
|
||||||
|
newtype WorkflowGraphEdgeLabel = WorkflowGraphEdgeLabel (CI Text)
|
||||||
|
deriving newtype (Eq, Ord, Show, Read, Typeable, ToJSON, ToJSONKey, FromJSON, FromJSONKey, PersistField, PersistFieldSql)
|
||||||
|
|
||||||
data WorkflowGraphNode fileid userid = WGN
|
data WorkflowGraphNode fileid userid = WGN
|
||||||
{ wgnDisplayLabel :: Maybe Text
|
{ wgnDisplayLabel :: Maybe Text
|
||||||
, wgnInitial :: Bool
|
, wgnInitial :: Bool
|
||||||
, wgnFinished :: Bool
|
, wgnFinished :: Bool
|
||||||
, wgnViewers :: Set WorkflowRole
|
, wgnViewers :: Set (WorkflowRole userid)
|
||||||
, wgnEdges :: Map WorkflowGraphEdgeLabel (WorkflowGraphEdge fileid userid)
|
, wgnEdges :: Map WorkflowGraphEdgeLabel (WorkflowGraphEdge fileid userid)
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Generic, Typeable)
|
deriving (Eq, Ord, Show, Generic, Typeable)
|
||||||
@ -87,7 +87,8 @@ data WorkflowPayloadSpec fileid userid = forall payload. WorkflowPayloadSpec (Wo
|
|||||||
instance (Show fileid, Show userid) => Show (WorkflowPayloadSpec fileid userid) where
|
instance (Show fileid, Show userid) => Show (WorkflowPayloadSpec fileid userid) where
|
||||||
show (WorkflowPayloadSpec payloadField) = show payloadField
|
show (WorkflowPayloadSpec payloadField) = show payloadField
|
||||||
|
|
||||||
type WorkflowPayloadFieldLabel = CI Text
|
newtype WorkflowPayloadFieldLabel = WorkflowPayloadFieldLabel (CI Text)
|
||||||
|
deriving newtype (Eq, Ord, Show, Read, Typeable, ToJSON, ToJSONKey, FromJSON, FromJSONKey, PersistField, PersistFieldSql)
|
||||||
|
|
||||||
data WorkflowPayloadField fileid userid (payload :: Type) where
|
data WorkflowPayloadField fileid userid (payload :: Type) where
|
||||||
WorkflowPayloadFieldText :: { wpftLabel :: Text
|
WorkflowPayloadFieldText :: { wpftLabel :: Text
|
||||||
@ -193,7 +194,8 @@ data WorkflowInstanceScope' = WISGlobal' | WISTerm' | WISSchool' | WISCourse'
|
|||||||
|
|
||||||
----- WORKFLOW: PAYLOAD -----
|
----- WORKFLOW: PAYLOAD -----
|
||||||
|
|
||||||
type WorkflowPayloadLabel = CI Text
|
newtype WorkflowPayloadLabel = WorkflowPayloadLabel (CI Text)
|
||||||
|
deriving newtype (Eq, Ord, Show, Read, Typeable, ToJSON, ToJSONKey, FromJSON, FromJSONKey, PersistField, PersistFieldSql)
|
||||||
|
|
||||||
type WorkflowPayload fileid userid = Map WorkflowPayloadLabel (Seq (WorkflowPayload' fileid userid))
|
type WorkflowPayload fileid userid = Map WorkflowPayloadLabel (Seq (WorkflowPayload' fileid userid))
|
||||||
|
|
||||||
@ -256,18 +258,16 @@ instance (FromJSON userid) => FromJSON (WorkflowRole userid) where
|
|||||||
|
|
||||||
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowGraph fileid userid) where
|
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowGraph fileid userid) where
|
||||||
toJSON WorkflowGraph{..} = JSON.object
|
toJSON WorkflowGraph{..} = JSON.object
|
||||||
[ "nodes" JSON..= wgNodes
|
[ "nodes" JSON..= wgNodes
|
||||||
|
, "payload-viewers" JSON..= wgPayloadViewers
|
||||||
]
|
]
|
||||||
instance (FromJSON fileid, FromJSON userid
|
instance (FromJSON fileid, FromJSON userid
|
||||||
, Ord fileid, Ord userid
|
, Ord fileid, Ord userid
|
||||||
) => FromJSON (WorkflowGraph fileid userid) where
|
) => FromJSON (WorkflowGraph fileid userid) where
|
||||||
parseJSON = JSON.withObject "WorkflowGraph" $ \o -> do
|
parseJSON = JSON.withObject "WorkflowGraph" $ \o -> do
|
||||||
fieldTag <- o JSON..: "tag"
|
wgNodes <- (o JSON..: "nodes" :: Parser (Map WorkflowGraphNodeLabel (WorkflowGraphNode fileid userid)))
|
||||||
case fieldTag of
|
wgPayloadViewers <- o JSON..: "payload-viewers"
|
||||||
"workflow" -> do
|
return WorkflowGraph{..}
|
||||||
wgNodes <- (o JSON..: "nodes" :: Parser (Map WorkflowGraphNodeLabel WorkflowGraphNode))
|
|
||||||
return WorkflowGraph{..}
|
|
||||||
_ -> terror $ "WorkflowGraph parseJSON error: expected tag workflow, but got " <> fieldTag
|
|
||||||
|
|
||||||
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowGraphEdge fileid userid) where
|
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowGraphEdge fileid userid) where
|
||||||
toJSON (WGE{..}) = JSON.object
|
toJSON (WGE{..}) = JSON.object
|
||||||
@ -279,9 +279,10 @@ instance (FromJSON fileid, FromJSON userid
|
|||||||
, Ord fileid, Ord userid
|
, Ord fileid, Ord userid
|
||||||
) => FromJSON (WorkflowGraphEdge fileid userid) where
|
) => FromJSON (WorkflowGraphEdge fileid userid) where
|
||||||
parseJSON = JSON.withObject "WorkflowGraphEdge" $ \o -> do
|
parseJSON = JSON.withObject "WorkflowGraphEdge" $ \o -> do
|
||||||
wgeActors <- o JSON..: "actors"
|
wgeActors <- o JSON..: "actors"
|
||||||
wgeTarget <- o JSON..: "target"
|
wgeTarget <- o JSON..: "target"
|
||||||
wgeForm <- o JSON..: "form"
|
wgeAutomatic <- o JSON..: "automatic"
|
||||||
|
wgeForm <- o JSON..: "form"
|
||||||
return WGE{..}
|
return WGE{..}
|
||||||
|
|
||||||
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowPayloadSpec fileid userid) where
|
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowPayloadSpec fileid userid) where
|
||||||
@ -369,7 +370,9 @@ instance (FromJSON fileid, FromJSON userid
|
|||||||
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowGraphNode fileid userid) where
|
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowGraphNode fileid userid) where
|
||||||
toJSON WGN{..} = JSON.object
|
toJSON WGN{..} = JSON.object
|
||||||
[ "display-label" JSON..= wgnDisplayLabel
|
[ "display-label" JSON..= wgnDisplayLabel
|
||||||
|
, "initial" JSON..= wgnInitial
|
||||||
, "finished" JSON..= wgnFinished
|
, "finished" JSON..= wgnFinished
|
||||||
|
, "viewers" JSON..= wgnViewers
|
||||||
, "edges" JSON..= wgnEdges
|
, "edges" JSON..= wgnEdges
|
||||||
]
|
]
|
||||||
instance (FromJSON fileid, FromJSON userid
|
instance (FromJSON fileid, FromJSON userid
|
||||||
@ -377,7 +380,9 @@ instance (FromJSON fileid, FromJSON userid
|
|||||||
) => FromJSON (WorkflowGraphNode fileid userid) where
|
) => FromJSON (WorkflowGraphNode fileid userid) where
|
||||||
parseJSON = JSON.withObject "WorkflowGraphNode" $ \o -> do
|
parseJSON = JSON.withObject "WorkflowGraphNode" $ \o -> do
|
||||||
wgnDisplayLabel <- o JSON..: "display-label"
|
wgnDisplayLabel <- o JSON..: "display-label"
|
||||||
|
wgnInitial <- o JSON..: "initial"
|
||||||
wgnFinished <- o JSON..: "finished"
|
wgnFinished <- o JSON..: "finished"
|
||||||
|
wgnViewers <- o JSON..: "viewers"
|
||||||
wgnEdges <- o JSON..: "edges"
|
wgnEdges <- o JSON..: "edges"
|
||||||
return WGN{..}
|
return WGN{..}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user