diff --git a/models/workflows.model b/models/workflows.model index 5ce942991..ec061c039 100644 --- a/models/workflows.model +++ b/models/workflows.model @@ -1,14 +1,14 @@ WorkflowDefinition - graph (WorkflowGraph FileId) - initiator (WorkflowRole UserId AuthDNF) - -WorkflowInitiator - -- TODO descriptor of a "role" that can initiate an instance of a workflow in a specified scope + graph (WorkflowGraph UserId AuthDNF FileId) + scope WorkflowInstanceScope' WorkflowInstance definition WorkflowDefinition - initiator (WorkflowRole UserId AuthDNF) + graph (WorkflowGraph UserId AuthDNF FileId) + scope (WorkflowInstaceScope TermId SchoolId CourseId) Workflow instance WorkflowInstance - initiator UserId + graph (WorkflowGraph UserId AuthDNF FileId) + initiator UserId Maybe + payload (WorkflowPayload FileId) diff --git a/src/Model/Types/Workflow.hs b/src/Model/Types/Workflow.hs index a54b8d365..9bdd871b6 100644 --- a/src/Model/Types/Workflow.hs +++ b/src/Model/Types/Workflow.hs @@ -2,57 +2,94 @@ module Model.Types.Workflow where import Import.NoModel + +data WorkflowRole userid authdnf = WorkflowRoleUser userid + | WorkflowRoleAuthorized authdnf + | WorkflowRoleInitiator userid + + data WorkflowGraphNodeStatus = WGNS { wgnsIdent :: CI Text , wgnsFinished :: Bool , wgnsLabel :: Maybe Text } deriving (Eq, Ord, Show, Read, Data, Generic, Typeable) + deriveJSON defaultOptions ''WorkflowGraphNodeStatus -data WorkflowGraphNode = WGN - { wgnStatus :: WorkflowGraphNodeStatus + +data WorkflowGraphNode userid authdnf fileid = WGN + { wgnStatus :: WorkflowGraphNodeStatus + , wgnOutgoing :: Set (WorkflowGraphEdge userid authdnf fileid) } deriving (Eq, Ord, Show, Read, Data, Generic, Typeable) + deriveJSON defaultOptions ''WorkflowGraphNode + data WorkflowEdgePayload = WEPText Text | WEPBool Bool deriving (Eq, Ord, Show, Read, Data, Generic, Typeable) -deriveJSON defaultOptions - { constructorTagModifier = camelToPathPiece' 3 - } ''WorkflowEdgePayload + +deriveJSON defaultOptions ''WorkflowEdgePayload + data WorkflowEdgePayload' = WEPText' | WEPBool' deriving (Eq, Ord, Enum, Show, Read, Data, Generic, Typeable) type WorkflowEdgePayloadLabel = CI Text -data WorkflowGraphEdge fileid = WGE - { wgeActors :: () -- TODO - , wgeTarget :: WorkflowGraphNode + + +data WorkflowEdgePayloadField fileid userid (payload :: *) where + WorkflowEdgePayloadFieldText :: { wepftLabel :: Text + , wepftPlaceholder :: Text + , wepftTooltip :: Maybe Text + , wepftDefault :: Maybe Text + } -> WorkflowEdgePayloadField Text fileid + WorkflowEdgePayloadFieldNumber :: HasResolution prec => + { wepfnLabel :: Text + , wepfnPlaceholder :: Text + , wepfnTooltip :: Maybe Text + , wepfnDefault :: Maybe prec + } -> WorkflowEdgePayloadField (Fixed prec) fileid + WorkflowEdgePayloadFieldFile :: { wepffLabel :: Text + , wepffTooltip :: Maybe Text + , wepffDefault :: Maybe fileid + } -> WorkflowEdgePayloadField FileInfo fileid + WorkflowEdgePayloadFieldUser :: { wepfuLabel :: Text + , wepfuTooltip :: Maybe Text + , wepfuDefault :: Maybe userid + } + +data WorkflowEdgePayloadSpecification fileid = forall payload. (FromJSON payload, ToJSON payload) => WorkflowEdgePayloadSpecification (WorkflowEdgePayloadField fileid payload) + +data WorkflowPayload fileid = Map WorkflowEdgePayloadLabel (WorkflowEdgePayload) + +data WorkflowGraphEdge userid authdnf fileid = WGE + { wgeActors :: Set (WorkflowRole userid authdnf) + , wgeTarget :: WorkflowGraphNode userid authdnf fileid , wgeForm :: Map WorkflowEdgePayloadLabel (NonNull (Set (WorkflowEdgePayloadSpecification fileid))) } -data WorkflowEdgePayloadSpecification fileid = forall payload. (FromJSON payload, ToJSON payload) => WorkflowEdgePayloadSpecification (WorkflowEdgePayloadField payload fileid) -data WorkflowEdgePayloadField (payload :: *) fileid where - WorkflowEdgePayloadFieldText :: { wepftLabel :: Text, wepftPlaceholder :: Text, wepftTooltip :: Maybe Text, wepftDefault :: Maybe Text } -> WorkflowEdgePayloadField Text fileid - WorkflowEdgePayloadFieldNumber :: HasResolution prec => { wepfnLabel :: Text, wepfnPlaceholder :: Text, wepfnTooltip :: Maybe Text, wepfnDefault :: Maybe prec } -> WorkflowEdgePayloadField (Fixed prec) fileid - WorkflowEdgePayloadFieldFile :: { wepffLabel :: Text, wepffTooltip :: Maybe Text, wepffDefault :: Maybe fileid } -> WorkflowEdgePayloadField FileInfo fileid --- deriveJSON defaultOptions ''WorkflowGraphEdge -data WorkflowGraph fileid = WG - { wgNodes :: Set WorkflowGraphNode - , wgEdges :: Set (WorkflowGraphEdge fileid) +--deriveJSON defaultOptions ''WorkflowGraphEdge + + +data WorkflowGraph userid authdnf fileid = WG + { wgNodes :: Set (WorkflowGraphNode userid authdnf fileid) + , wgEdges :: Set (WorkflowGraphEdge userid authdnf fileid) } + -- deriveJSON defaultOptions ''WorkflowGraph + data WorkflowInstanceScope term school course = WISGlobal | WISTerm term | WISSchool school | WISCourse course deriving (Eq, Ord, Show, Read, Data, Generic, Typeable) + deriveJSON defaultOptions { constructorTagModifier = camelToPathPiece' 3 } ''WorkflowInstanceScope + data WorkflowInstanceScope' = WISTerm' | WISSchool' | WISCourse' deriving (Eq, Ord, Enum, Read, Show, Data, Generic, Typeable) -data WorkflowRole user authdnf = WorkflowRoleUser user - | WorkflowRoleAuthorized authdnf