diff --git a/src/Model/Types/Workflow.hs b/src/Model/Types/Workflow.hs index c74fcdfd6..da71d6d2b 100644 --- a/src/Model/Types/Workflow.hs +++ b/src/Model/Types/Workflow.hs @@ -25,9 +25,14 @@ data WorkflowGraphNodeStatus = WGNS deriving (Eq, Ord, Show, Read, Data, Generic, Typeable) data WorkflowGraphNode = WGN - { wgnStatus :: WorkflowGraphNodeStatus + { wgnStatus :: WorkflowGraphNodeStatus } deriving (Eq, Ord, Show, Read, Data, Generic, Typeable) +data WorkflowGraphNode' userid fileid = WGN' + { wgn'Node :: WorkflowGraphNode + , wgn'Edges :: Set (WorkflowGraphEdge userid fileid) + } + deriving (Eq, Ord, Show, Generic, Typeable) type WorkflowGraphNodeLabel = CI Text @@ -173,17 +178,18 @@ instance (FromJSON userid) => FromJSON (WorkflowRole userid) where return $ WorkflowRoleInitiator iid _ -> terror $ "WorkflowRole parseJSON error: expected role (user|authorized|initiator), but got " <> fieldTag -instance (ToJSON userid, ToJSON fileid) => ToJSON (WorkflowGraph userid fileid) where +instance (ToJSON userid, ToJSON fileid, Ord userid) => ToJSON (WorkflowGraph userid fileid) where toJSON WorkflowGraph{..} = JSON.object [ "tag" JSON..= ("workflow" :: Text) - , "nodes" JSON..= wgNodes + , "nodes" JSON..= Map.map (\(wgn'Node,wgn'Edges) -> WGN'{..}) wgNodes ] instance (FromJSON userid, FromJSON fileid, Ord userid, Ord fileid) => FromJSON (WorkflowGraph userid fileid) where parseJSON = JSON.withObject "WorkflowGraph" $ \o -> do fieldTag <- o JSON..: "tag" case fieldTag of "workflow" -> do - wgNodes <- o JSON..: "nodes" + wgNodes' <- (o JSON..: "nodes" :: Parser (Map WorkflowGraphNodeLabel (WorkflowGraphNode' userid fileid))) + let wgNodes = Map.map (\WGN'{..} -> (wgn'Node, wgn'Edges)) wgNodes' return WorkflowGraph{..} _ -> terror $ "WorkflowGraph parseJSON error: expected tag workflow, but got " <> fieldTag @@ -286,6 +292,18 @@ deriveJSON defaultOptions { fieldLabelModifier = camelToPathPiece' 1 } ''WorkflowGraphNodeStatus +instance (ToJSON userid, ToJSON fileid, Ord userid) => ToJSON (WorkflowGraphNode' userid fileid) where + toJSON WGN'{..} = JSON.object + [ "node" JSON..= wgn'Node + , "edges" JSON..= wgn'Edges + ] +instance (FromJSON userid, FromJSON fileid, Ord userid, Ord fileid) => FromJSON (WorkflowGraphNode' userid fileid) where + parseJSON = JSON.withObject "WorkflowGraphNode'" $ \o -> do + wgn'Node <- o JSON..: "node" + wgn'Edges <- o JSON..: "edges" + return WGN'{..} + testGraph :: WorkflowGraph Text Text -testGraph = WorkflowGraph $ Map.fromList [("node1", (WGN (WGNS "id" True (Just "someLabel")), Set.fromList [WGE (Set.fromList [WorkflowRoleUser "user-id", WorkflowRoleInitiator "init-user-id"]) "node1" (Map.fromList [("sometext", impureNonNull $ Set.fromList [WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldText "text-label" "text-placeholder" (Just "text-tooltip") (Just "text-default")]),("someuser", impureNonNull $ Set.fromList [WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldUser "user-label" Nothing Nothing]),("someboolandnumber", impureNonNull $ Set.fromList [WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldBool "bool-label" Nothing (Just True), WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldNumber "number-label" "number-placeholder" Nothing (Just singleRes) singleRes])])]))] +--testGraph = WorkflowGraph $ Map.fromList [("node1", (WGN (WGNS "id" True (Just "someLabel")), Set.fromList [WGE (Set.fromList [WorkflowRoleUser "user-id", WorkflowRoleInitiator "init-user-id"]) "node1" (Map.fromList [("sometext", impureNonNull $ Set.fromList [WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldText "text-label" "text-placeholder" (Just "text-tooltip") (Just "text-default")]),("someuser", impureNonNull $ Set.fromList [WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldUser "user-label" Nothing Nothing]),("someboolandnumber", impureNonNull $ Set.fromList [WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldBool "bool-label" Nothing (Just True), WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldNumber "number-label" "number-placeholder" Nothing (Just singleRes) singleRes])])]))] +testGraph = WorkflowGraph $ Map.fromList [("node1", (WGN (WGNS "id" True (Just "someLabel")), Set.fromList [WGE (Set.fromList [WorkflowRoleUser "user-id", WorkflowRoleInitiator "init-user-id"]) "node1" (Map.fromList [("sometext", impureNonNull $ Set.fromList [WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldText "text-label" "text-placeholder" (Just "text-tooltip") (Just "text-default")]),("someuser", impureNonNull $ Set.fromList [WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldUser "user-label" Nothing Nothing]),("somebool", impureNonNull $ Set.fromList [WorkflowEdgePayloadSpecification $ WorkflowEdgePayloadFieldBool "bool-label" Nothing (Just True)])])]))]