refactor(workflow): more on types

This commit is contained in:
Sarah Vaupel 2020-04-02 17:01:42 +02:00 committed by Gregor Kleen
parent 5ff48d9b60
commit 0eea74b8b3
2 changed files with 63 additions and 26 deletions

View File

@ -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)

View File

@ -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