fix(workflow-types): fix Int64 workaround; update test defs
This commit is contained in:
parent
8995248bff
commit
ce9648e47a
@ -9,14 +9,15 @@ module Model.Types.Workflow
|
|||||||
|
|
||||||
import Import.NoModel
|
import Import.NoModel
|
||||||
|
|
||||||
import Model.Types.Security (AuthDNF)
|
--import Model.Types.Security (AuthDNF)
|
||||||
|
import Model.Types.Security (AuthDNF, PredDNF(..), AuthTag(..), PredLiteral(..))
|
||||||
|
|
||||||
import Database.Persist.Sql (PersistFieldSql(..))
|
import Database.Persist.Sql (PersistFieldSql(..))
|
||||||
|
|
||||||
import qualified Data.Set as Set (toList)
|
import qualified Data.Set as Set (toList)
|
||||||
--import qualified Data.Set as Set (toList, fromList)
|
import qualified Data.Set as Set (toList, fromList)
|
||||||
--import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
--import qualified Data.Sequence as Seq
|
import qualified Data.Sequence as Seq
|
||||||
import Data.Scientific
|
import Data.Scientific
|
||||||
import Data.Maybe (fromJust)
|
import Data.Maybe (fromJust)
|
||||||
|
|
||||||
@ -24,14 +25,14 @@ import qualified Data.Aeson as JSON
|
|||||||
import Data.Aeson.Types (Parser)
|
import Data.Aeson.Types (Parser)
|
||||||
|
|
||||||
-- TODO remove
|
-- TODO remove
|
||||||
--import Data.ByteString.Lazy.Internal (ByteString)
|
import Data.ByteString.Lazy.Internal (ByteString)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
----- WORKFLOW GRAPH -----
|
----- WORKFLOW GRAPH -----
|
||||||
|
|
||||||
data WorkflowGraph = WorkflowGraph
|
data WorkflowGraph fileid userid = WorkflowGraph
|
||||||
{ wgNodes :: Map WorkflowGraphNodeLabel WorkflowGraphNode
|
{ wgNodes :: Map WorkflowGraphNodeLabel (WorkflowGraphNode fileid userid)
|
||||||
}
|
}
|
||||||
deriving (Show, Eq)
|
deriving (Show, Eq)
|
||||||
|
|
||||||
@ -40,33 +41,34 @@ data WorkflowGraph = WorkflowGraph
|
|||||||
|
|
||||||
type WorkflowGraphNodeLabel = CI Text
|
type WorkflowGraphNodeLabel = CI Text
|
||||||
|
|
||||||
data WorkflowGraphNode = WGN
|
data WorkflowGraphNode fileid userid = WGN
|
||||||
{ wgnDisplayLabel :: Maybe Text
|
{ wgnDisplayLabel :: Maybe Text
|
||||||
, wgnFinished :: Bool
|
, wgnFinished :: Bool
|
||||||
, wgnEdges :: Set WorkflowGraphEdge
|
, wgnEdges :: Set (WorkflowGraphEdge fileid userid)
|
||||||
}
|
}
|
||||||
deriving (Eq, Ord, Show, Generic, Typeable)
|
deriving (Eq, Ord, Show, Generic, Typeable)
|
||||||
|
|
||||||
|
|
||||||
----- WORKFLOW GRAPH: EDGES -----
|
----- WORKFLOW GRAPH: EDGES -----
|
||||||
|
|
||||||
data WorkflowGraphEdge = WGE
|
data WorkflowGraphEdge fileid userid = WGE
|
||||||
{ wgeTarget :: WorkflowGraphNodeLabel
|
{ wgeTarget :: WorkflowGraphNodeLabel
|
||||||
, wgeActors :: Set WorkflowRole
|
, wgeActors :: Set (WorkflowRole userid)
|
||||||
, wgeForm :: Map WorkflowPayloadLabel (NonNull (Set WorkflowPayloadSpec))
|
, wgeForm :: Map WorkflowPayloadLabel (NonNull (Set (WorkflowPayloadSpec fileid userid)))
|
||||||
}
|
}
|
||||||
deriving Show
|
deriving Show
|
||||||
|
|
||||||
instance Eq WorkflowGraphEdge where
|
instance (Eq fileid, Eq userid) => Eq (WorkflowGraphEdge fileid userid) where
|
||||||
e1@WGE{} == e2@WGE{} = wgeTarget e1 == wgeTarget e2 && wgeActors e1 == wgeActors e2 && wgeForm e1 == wgeForm e2
|
e1@WGE{} == e2@WGE{} = wgeTarget e1 == wgeTarget e2 && wgeActors e1 == wgeActors e2 && wgeForm e1 == wgeForm e2
|
||||||
|
|
||||||
instance Ord WorkflowGraphEdge where
|
instance (Ord fileid, Ord userid) => Ord (WorkflowGraphEdge fileid userid) where
|
||||||
compare = mconcat [comparing wgeTarget, comparing wgeActors, comparing wgeForm]
|
compare = mconcat [comparing wgeTarget, comparing wgeActors, comparing wgeForm]
|
||||||
|
|
||||||
|
|
||||||
----- WORKFLOW GRAPH: ROLES / ACTORS -----
|
----- WORKFLOW GRAPH: ROLES / ACTORS -----
|
||||||
|
|
||||||
data WorkflowRole = WorkflowRoleUser Int64 -- UserId
|
data WorkflowRole userid
|
||||||
|
= WorkflowRoleUser userid
|
||||||
| WorkflowRoleAuthorized AuthDNF
|
| WorkflowRoleAuthorized AuthDNF
|
||||||
| WorkflowRoleInitiator
|
| WorkflowRoleInitiator
|
||||||
deriving (Eq, Ord, Show, Read, Generic, Typeable)
|
deriving (Eq, Ord, Show, Read, Generic, Typeable)
|
||||||
@ -74,20 +76,20 @@ data WorkflowRole = WorkflowRoleUser Int64 -- UserId
|
|||||||
|
|
||||||
----- WORKFLOW GRAPH: PAYLOAD SPECIFICATION -----
|
----- WORKFLOW GRAPH: PAYLOAD SPECIFICATION -----
|
||||||
|
|
||||||
data WorkflowPayloadSpec = forall payload. WorkflowPayloadSpec (WorkflowPayloadField payload)
|
data WorkflowPayloadSpec fileid userid = forall payload. WorkflowPayloadSpec (WorkflowPayloadField fileid userid payload)
|
||||||
|
|
||||||
instance Show WorkflowPayloadSpec where
|
instance (Show fileid, Show userid) => Show (WorkflowPayloadSpec fileid userid) where
|
||||||
show (WorkflowPayloadSpec payloadField) = show payloadField
|
show (WorkflowPayloadSpec payloadField) = show payloadField
|
||||||
|
|
||||||
type WorkflowPayloadFieldLabel = Text
|
type WorkflowPayloadFieldLabel = Text
|
||||||
|
|
||||||
data WorkflowPayloadField (payload :: Type) where
|
data WorkflowPayloadField fileid userid (payload :: Type) where
|
||||||
WorkflowPayloadFieldText :: { wpftLabel :: WorkflowPayloadFieldLabel
|
WorkflowPayloadFieldText :: { wpftLabel :: WorkflowPayloadFieldLabel
|
||||||
, wpftPlaceholder :: Text
|
, wpftPlaceholder :: Text
|
||||||
, wpftTooltip :: Maybe Text
|
, wpftTooltip :: Maybe Text
|
||||||
, wpftDefault :: Maybe Text
|
, wpftDefault :: Maybe Text
|
||||||
, wpftOptional :: Maybe Bool
|
, wpftOptional :: Maybe Bool
|
||||||
} -> WorkflowPayloadField Text
|
} -> WorkflowPayloadField fileid userid Text
|
||||||
WorkflowPayloadFieldNumber :: { wpfnLabel :: WorkflowPayloadFieldLabel
|
WorkflowPayloadFieldNumber :: { wpfnLabel :: WorkflowPayloadFieldLabel
|
||||||
, wpfnPlaceholder :: Text
|
, wpfnPlaceholder :: Text
|
||||||
, wpfnTooltip :: Maybe Text
|
, wpfnTooltip :: Maybe Text
|
||||||
@ -96,23 +98,23 @@ data WorkflowPayloadField (payload :: Type) where
|
|||||||
, wpfnMax :: Maybe Scientific
|
, wpfnMax :: Maybe Scientific
|
||||||
, wpfnStep :: Scientific
|
, wpfnStep :: Scientific
|
||||||
, wpfnOptional :: Maybe Bool
|
, wpfnOptional :: Maybe Bool
|
||||||
} -> WorkflowPayloadField Scientific
|
} -> WorkflowPayloadField fileid userid Scientific
|
||||||
WorkflowPayloadFieldBool :: { wpfbLabel :: WorkflowPayloadFieldLabel
|
WorkflowPayloadFieldBool :: { wpfbLabel :: WorkflowPayloadFieldLabel
|
||||||
, wpfbTooltip :: Maybe Text
|
, wpfbTooltip :: Maybe Text
|
||||||
, wpfbDefault :: Maybe Bool
|
, wpfbDefault :: Maybe Bool
|
||||||
} -> WorkflowPayloadField Bool
|
} -> WorkflowPayloadField fileid userid Bool
|
||||||
WorkflowPayloadFieldFile :: { wpffLabel :: WorkflowPayloadFieldLabel
|
WorkflowPayloadFieldFile :: { wpffLabel :: WorkflowPayloadFieldLabel
|
||||||
, wpffTooltip :: Maybe Text
|
, wpffTooltip :: Maybe Text
|
||||||
, wpffDefault :: Maybe Int64 -- FileId
|
, wpffDefault :: Maybe fileid
|
||||||
, wpffOptional :: Maybe Bool
|
, wpffOptional :: Maybe Bool
|
||||||
} -> WorkflowPayloadField FileInfo
|
} -> WorkflowPayloadField fileid userid FileInfo
|
||||||
WorkflowPayloadFieldUser :: { wpfuLabel :: WorkflowPayloadFieldLabel
|
WorkflowPayloadFieldUser :: { wpfuLabel :: WorkflowPayloadFieldLabel
|
||||||
, wpfuTooltip :: Maybe Text
|
, wpfuTooltip :: Maybe Text
|
||||||
, wpfuDefault :: Maybe Int64 -- UserId
|
, wpfuDefault :: Maybe userid
|
||||||
, wpfuOptional :: Maybe Bool
|
, wpfuOptional :: Maybe Bool
|
||||||
} -> WorkflowPayloadField Int64
|
} -> WorkflowPayloadField fileid userid userid
|
||||||
|
|
||||||
instance Show (WorkflowPayloadField payload) where
|
instance (Show fileid, Show userid) => Show (WorkflowPayloadField fileid userid payload) where
|
||||||
show (WorkflowPayloadFieldText{..} ) = "TextField{label = " <> show wpftLabel
|
show (WorkflowPayloadFieldText{..} ) = "TextField{label = " <> show wpftLabel
|
||||||
<> ", placeholder = " <> show wpftPlaceholder
|
<> ", placeholder = " <> show wpftPlaceholder
|
||||||
<> ", tooltip = " <> show wpftTooltip
|
<> ", tooltip = " <> show wpftTooltip
|
||||||
@ -143,7 +145,7 @@ instance Show (WorkflowPayloadField payload) where
|
|||||||
<> ", optional = " <> show wpfuOptional
|
<> ", optional = " <> show wpfuOptional
|
||||||
<> "}"
|
<> "}"
|
||||||
|
|
||||||
instance Eq WorkflowPayloadSpec where
|
instance (Eq fileid, Eq userid) => Eq (WorkflowPayloadSpec fileid userid) where
|
||||||
(WorkflowPayloadSpec f1@WorkflowPayloadFieldText{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldText{}) = wpftLabel f1 == wpftLabel f2 && wpftPlaceholder f1 == wpftPlaceholder f2 && wpftTooltip f1 == wpftTooltip f2 && wpftDefault f1 == wpftDefault f2 && wpftOptional f1 == wpftOptional f2
|
(WorkflowPayloadSpec f1@WorkflowPayloadFieldText{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldText{}) = wpftLabel f1 == wpftLabel f2 && wpftPlaceholder f1 == wpftPlaceholder f2 && wpftTooltip f1 == wpftTooltip f2 && wpftDefault f1 == wpftDefault f2 && wpftOptional f1 == wpftOptional f2
|
||||||
(WorkflowPayloadSpec f1@WorkflowPayloadFieldNumber{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldNumber{}) = wpfnLabel f1 == wpfnLabel f2 && wpfnPlaceholder f1 == wpfnPlaceholder f2 && wpfnTooltip f1 == wpfnTooltip f2 && wpfnDefault f1 == wpfnDefault f2 && wpfnOptional f1 == wpfnOptional f2
|
(WorkflowPayloadSpec f1@WorkflowPayloadFieldNumber{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldNumber{}) = wpfnLabel f1 == wpfnLabel f2 && wpfnPlaceholder f1 == wpfnPlaceholder f2 && wpfnTooltip f1 == wpfnTooltip f2 && wpfnDefault f1 == wpfnDefault f2 && wpfnOptional f1 == wpfnOptional f2
|
||||||
(WorkflowPayloadSpec f1@WorkflowPayloadFieldBool{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldBool{}) = wpfbLabel f1 == wpfbLabel f2 && wpfbTooltip f1 == wpfbTooltip f2 && wpfbDefault f1 == wpfbDefault f2
|
(WorkflowPayloadSpec f1@WorkflowPayloadFieldBool{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldBool{}) = wpfbLabel f1 == wpfbLabel f2 && wpfbTooltip f1 == wpfbTooltip f2 && wpfbDefault f1 == wpfbDefault f2
|
||||||
@ -151,7 +153,7 @@ instance Eq WorkflowPayloadSpec where
|
|||||||
(WorkflowPayloadSpec f1@WorkflowPayloadFieldUser{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldUser{}) = wpfuLabel f1 == wpfuLabel f2 && wpfuTooltip f1 == wpfuTooltip f2 && wpfuDefault f1 == wpfuDefault f2 && wpfuOptional f1 == wpfuOptional f2
|
(WorkflowPayloadSpec f1@WorkflowPayloadFieldUser{}) == (WorkflowPayloadSpec f2@WorkflowPayloadFieldUser{}) = wpfuLabel f1 == wpfuLabel f2 && wpfuTooltip f1 == wpfuTooltip f2 && wpfuDefault f1 == wpfuDefault f2 && wpfuOptional f1 == wpfuOptional f2
|
||||||
_ == _ = False
|
_ == _ = False
|
||||||
|
|
||||||
instance Ord WorkflowPayloadSpec where
|
instance (Ord fileid, Ord userid) => Ord (WorkflowPayloadSpec fileid userid) where
|
||||||
compare (WorkflowPayloadSpec f1@WorkflowPayloadFieldText{}) (WorkflowPayloadSpec f2@WorkflowPayloadFieldText{}) = mconcat [comparing wpftLabel, comparing wpftPlaceholder, comparing wpftTooltip, comparing wpftDefault, comparing wpftOptional] f1 f2
|
compare (WorkflowPayloadSpec f1@WorkflowPayloadFieldText{}) (WorkflowPayloadSpec f2@WorkflowPayloadFieldText{}) = mconcat [comparing wpftLabel, comparing wpftPlaceholder, comparing wpftTooltip, comparing wpftDefault, comparing wpftOptional] f1 f2
|
||||||
compare (WorkflowPayloadSpec f1@WorkflowPayloadFieldNumber{}) (WorkflowPayloadSpec f2@WorkflowPayloadFieldNumber{}) = mconcat [comparing wpfnLabel, comparing wpfnPlaceholder, comparing wpfnTooltip, comparing wpfnDefault, comparing wpfnMin, comparing wpfnMax, comparing wpfnStep, comparing wpfnOptional] f1 f2
|
compare (WorkflowPayloadSpec f1@WorkflowPayloadFieldNumber{}) (WorkflowPayloadSpec f2@WorkflowPayloadFieldNumber{}) = mconcat [comparing wpfnLabel, comparing wpfnPlaceholder, comparing wpfnTooltip, comparing wpfnDefault, comparing wpfnMin, comparing wpfnMax, comparing wpfnStep, comparing wpfnOptional] f1 f2
|
||||||
compare (WorkflowPayloadSpec f1@WorkflowPayloadFieldBool{}) (WorkflowPayloadSpec f2@WorkflowPayloadFieldBool{}) = mconcat [comparing wpfbLabel, comparing wpfbTooltip, comparing wpfbDefault] f1 f2
|
compare (WorkflowPayloadSpec f1@WorkflowPayloadFieldBool{}) (WorkflowPayloadSpec f2@WorkflowPayloadFieldBool{}) = mconcat [comparing wpfbLabel, comparing wpfbTooltip, comparing wpfbDefault] f1 f2
|
||||||
@ -172,10 +174,11 @@ instance Ord WorkflowPayloadSpec where
|
|||||||
|
|
||||||
----- WORKFLOW INSTANCE -----
|
----- WORKFLOW INSTANCE -----
|
||||||
|
|
||||||
data WorkflowInstanceScope = WISGlobal
|
data WorkflowInstanceScope termid schoolid courseid
|
||||||
| WISTerm Int64 -- TermId
|
= WISGlobal
|
||||||
| WISSchool Int64 -- SchoolId
|
| WISTerm termid
|
||||||
| WISCourse Int64 -- CourseId
|
| WISSchool schoolid
|
||||||
|
| WISCourse courseid
|
||||||
deriving (Eq, Ord, Show, Read, Data, Generic, Typeable)
|
deriving (Eq, Ord, Show, Read, Data, Generic, Typeable)
|
||||||
|
|
||||||
data WorkflowInstanceScope' = WISGlobal' | WISTerm' | WISSchool' | WISCourse'
|
data WorkflowInstanceScope' = WISGlobal' | WISTerm' | WISSchool' | WISCourse'
|
||||||
@ -186,7 +189,7 @@ data WorkflowInstanceScope' = WISGlobal' | WISTerm' | WISSchool' | WISCourse'
|
|||||||
|
|
||||||
type WorkflowPayloadLabel = CI Text
|
type WorkflowPayloadLabel = CI Text
|
||||||
|
|
||||||
data WorkflowPayload = WorkflowPayload (Map WorkflowPayloadLabel (Seq WorkflowPayload'))
|
type WorkflowPayload fileid userid = Map WorkflowPayloadLabel (Seq (WorkflowPayload' fileid userid))
|
||||||
|
|
||||||
data WorkflowPayload' = WorkflowPayload'
|
data WorkflowPayload' = WorkflowPayload'
|
||||||
{ wpPayload :: Map WorkflowPayloadFieldLabel WorkflowFieldPayload
|
{ wpPayload :: Map WorkflowPayloadFieldLabel WorkflowFieldPayload
|
||||||
@ -196,14 +199,14 @@ data WorkflowPayload' = WorkflowPayload'
|
|||||||
|
|
||||||
data WorkflowFieldPayload = forall payload. WorkflowFieldPayload (WorkflowFieldPayload' payload)
|
data WorkflowFieldPayload = forall payload. WorkflowFieldPayload (WorkflowFieldPayload' payload)
|
||||||
|
|
||||||
data WorkflowFieldPayload' (payload :: Type) where
|
data WorkflowFieldPayload fileid userid (payload :: Type) where
|
||||||
WFPText :: Text -> WorkflowFieldPayload' Text
|
WFPText :: Text -> WorkflowFieldPayload fileid userid Text
|
||||||
WFPNumber :: Scientific -> WorkflowFieldPayload' Scientific
|
WFPNumber :: Scientific -> WorkflowFieldPayload fileid userid Scientific
|
||||||
WFPBool :: Bool -> WorkflowFieldPayload' Bool
|
WFPBool :: Bool -> WorkflowFieldPayload fileid userid Bool
|
||||||
WFPFile :: Int64 -> WorkflowFieldPayload' Int64 -- FileId
|
WFPFile :: fileid -> WorkflowFieldPayload fileid userid fileid
|
||||||
WFPUser :: Int64 -> WorkflowFieldPayload' Int64 -- UserId
|
WFPUser :: userid -> WorkflowFieldPayload fileid userid userid
|
||||||
|
|
||||||
instance Show (WorkflowFieldPayload' payload) where
|
instance (Show fileid, Show userid) => Show (WorkflowFieldPayload fileid userid payload) where
|
||||||
show (WFPText wfptText ) = "WFPText{text = " <> show wfptText <> "}"
|
show (WFPText wfptText ) = "WFPText{text = " <> show wfptText <> "}"
|
||||||
show (WFPNumber wfpnNumber) = "WFPNumber{number = " <> show wfpnNumber <> "}"
|
show (WFPNumber wfpnNumber) = "WFPNumber{number = " <> show wfpnNumber <> "}"
|
||||||
show (WFPBool wfpbBool ) = "WFPBool{bool = " <> show wfpbBool <> "}"
|
show (WFPBool wfpbBool ) = "WFPBool{bool = " <> show wfpbBool <> "}"
|
||||||
@ -216,7 +219,7 @@ data WorkflowFieldPayload'' = WFPText' | WFPNumber' | WFPBool' | WFPFile' | WFPU
|
|||||||
|
|
||||||
----- ToJSON / FromJSON instances -----
|
----- ToJSON / FromJSON instances -----
|
||||||
|
|
||||||
instance ToJSON WorkflowRole where
|
instance (ToJSON userid) => ToJSON (WorkflowRole userid) where
|
||||||
toJSON (WorkflowRoleUser uid) = JSON.object
|
toJSON (WorkflowRoleUser uid) = JSON.object
|
||||||
[ "tag" JSON..= ("user" :: Text)
|
[ "tag" JSON..= ("user" :: Text)
|
||||||
, "user" JSON..= uid
|
, "user" JSON..= uid
|
||||||
@ -228,7 +231,7 @@ instance ToJSON WorkflowRole where
|
|||||||
toJSON WorkflowRoleInitiator = JSON.object
|
toJSON WorkflowRoleInitiator = JSON.object
|
||||||
[ "tag" JSON..= ("initiator" :: Text)
|
[ "tag" JSON..= ("initiator" :: Text)
|
||||||
]
|
]
|
||||||
instance FromJSON WorkflowRole where
|
instance (FromJSON userid) => FromJSON (WorkflowRole userid) where
|
||||||
parseJSON = JSON.withObject "WorkflowRole" $ \o -> do
|
parseJSON = JSON.withObject "WorkflowRole" $ \o -> do
|
||||||
fieldTag <- (o JSON..: "tag" :: Parser Text)
|
fieldTag <- (o JSON..: "tag" :: Parser Text)
|
||||||
case fieldTag of
|
case fieldTag of
|
||||||
@ -241,11 +244,13 @@ instance FromJSON WorkflowRole where
|
|||||||
"initiator" -> return WorkflowRoleInitiator
|
"initiator" -> return WorkflowRoleInitiator
|
||||||
_ -> terror $ "WorkflowRole parseJSON error: expected role (user|authorized|initiator), but got " <> fieldTag
|
_ -> terror $ "WorkflowRole parseJSON error: expected role (user|authorized|initiator), but got " <> fieldTag
|
||||||
|
|
||||||
instance ToJSON WorkflowGraph 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
|
||||||
]
|
]
|
||||||
instance FromJSON WorkflowGraph where
|
instance (FromJSON fileid, FromJSON userid
|
||||||
|
, Ord fileid, Ord userid
|
||||||
|
) => FromJSON (WorkflowGraph fileid userid) where
|
||||||
parseJSON = JSON.withObject "WorkflowGraph" $ \o -> do
|
parseJSON = JSON.withObject "WorkflowGraph" $ \o -> do
|
||||||
fieldTag <- o JSON..: "tag"
|
fieldTag <- o JSON..: "tag"
|
||||||
case fieldTag of
|
case fieldTag of
|
||||||
@ -254,20 +259,22 @@ instance FromJSON WorkflowGraph where
|
|||||||
return WorkflowGraph{..}
|
return WorkflowGraph{..}
|
||||||
_ -> terror $ "WorkflowGraph parseJSON error: expected tag workflow, but got " <> fieldTag
|
_ -> terror $ "WorkflowGraph parseJSON error: expected tag workflow, but got " <> fieldTag
|
||||||
|
|
||||||
instance ToJSON WorkflowGraphEdge where
|
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowGraphEdge fileid userid) where
|
||||||
toJSON (WGE{..}) = JSON.object
|
toJSON (WGE{..}) = JSON.object
|
||||||
[ "actors" JSON..= Set.toList wgeActors
|
[ "actors" JSON..= Set.toList wgeActors
|
||||||
, "target" JSON..= wgeTarget
|
, "target" JSON..= wgeTarget
|
||||||
, "form" JSON..= wgeForm
|
, "form" JSON..= wgeForm
|
||||||
]
|
]
|
||||||
instance FromJSON WorkflowGraphEdge where
|
instance (FromJSON fileid, FromJSON userid
|
||||||
|
, Ord fileid, Ord userid
|
||||||
|
) => 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"
|
wgeForm <- o JSON..: "form"
|
||||||
return WGE{..}
|
return WGE{..}
|
||||||
|
|
||||||
instance ToJSON WorkflowPayloadSpec where
|
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowPayloadSpec fileid userid) where
|
||||||
toJSON (WorkflowPayloadSpec WorkflowPayloadFieldText{..}) = JSON.object
|
toJSON (WorkflowPayloadSpec WorkflowPayloadFieldText{..}) = JSON.object
|
||||||
[ "tag" JSON..= ("text" :: Text)
|
[ "tag" JSON..= ("text" :: Text)
|
||||||
, "label" JSON..= wpftLabel
|
, "label" JSON..= wpftLabel
|
||||||
@ -307,7 +314,9 @@ instance ToJSON WorkflowPayloadSpec where
|
|||||||
, "default" JSON..= wpfuDefault
|
, "default" JSON..= wpfuDefault
|
||||||
, "optional" JSON..= wpfuOptional
|
, "optional" JSON..= wpfuOptional
|
||||||
]
|
]
|
||||||
instance FromJSON WorkflowPayloadSpec where
|
instance (FromJSON fileid, FromJSON userid
|
||||||
|
, Ord fileid, Ord userid
|
||||||
|
) => FromJSON (WorkflowPayloadSpec fileid userid) where
|
||||||
parseJSON = JSON.withObject "WorkflowPayloadSpec" $ \o -> do
|
parseJSON = JSON.withObject "WorkflowPayloadSpec" $ \o -> do
|
||||||
fieldTag <- (o JSON..: "tag" :: Parser Text)
|
fieldTag <- (o JSON..: "tag" :: Parser Text)
|
||||||
case fieldTag of
|
case fieldTag of
|
||||||
@ -336,97 +345,32 @@ instance FromJSON WorkflowPayloadSpec where
|
|||||||
"file" -> do
|
"file" -> do
|
||||||
wpffLabel <- o JSON..: "label"
|
wpffLabel <- o JSON..: "label"
|
||||||
wpffTooltip <- o JSON..:? "tooltip"
|
wpffTooltip <- o JSON..:? "tooltip"
|
||||||
wpffDefault <- (o JSON..:? "default" :: Parser (Maybe Int64))
|
wpffDefault <- (o JSON..:? "default" :: Parser (Maybe fileid))
|
||||||
wpffOptional <- o JSON..:? "optional"
|
wpffOptional <- o JSON..:? "optional"
|
||||||
return $ WorkflowPayloadSpec WorkflowPayloadFieldFile{..}
|
return $ WorkflowPayloadSpec WorkflowPayloadFieldFile{..}
|
||||||
"user" -> do
|
"user" -> do
|
||||||
wpfuLabel <- o JSON..: "label"
|
wpfuLabel <- o JSON..: "label"
|
||||||
wpfuTooltip <- o JSON..:? "tooltip"
|
wpfuTooltip <- o JSON..:? "tooltip"
|
||||||
wpfuDefault <- (o JSON..:? "default" :: Parser (Maybe Int64))
|
wpfuDefault <- (o JSON..:? "default" :: Parser (Maybe userid))
|
||||||
wpfuOptional <- o JSON..:? "optional"
|
wpfuOptional <- o JSON..:? "optional"
|
||||||
return $ WorkflowPayloadSpec WorkflowPayloadFieldUser{..}
|
return $ WorkflowPayloadSpec WorkflowPayloadFieldUser{..}
|
||||||
_ -> terror $ "WorkflowPayloadSpec parseJSON error: expected field tag (text|number|bool|file|user), but got " <> fieldTag
|
_ -> terror $ "WorkflowPayloadSpec parseJSON error: expected field tag (text|number|bool|file|user), but got " <> fieldTag
|
||||||
|
|
||||||
instance ToJSON WorkflowGraphNode 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
|
||||||
, "finished" JSON..= wgnFinished
|
, "finished" JSON..= wgnFinished
|
||||||
, "edges" JSON..= wgnEdges
|
, "edges" JSON..= wgnEdges
|
||||||
]
|
]
|
||||||
instance FromJSON WorkflowGraphNode where
|
instance (FromJSON fileid, FromJSON userid
|
||||||
|
, Ord fileid, Ord userid
|
||||||
|
) => 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"
|
||||||
wgnFinished <- o JSON..: "finished"
|
wgnFinished <- o JSON..: "finished"
|
||||||
wgnEdges <- o JSON..: "edges"
|
wgnEdges <- o JSON..: "edges"
|
||||||
return WGN{..}
|
return WGN{..}
|
||||||
|
|
||||||
derivePersistFieldJSON ''WorkflowGraph
|
|
||||||
|
|
||||||
deriveJSON defaultOptions ''WorkflowInstanceScope
|
|
||||||
derivePersistFieldJSON ''WorkflowInstanceScope
|
|
||||||
|
|
||||||
deriveJSON defaultOptions ''WorkflowInstanceScope'
|
|
||||||
derivePersistFieldJSON ''WorkflowInstanceScope'
|
|
||||||
|
|
||||||
instance ToJSON WorkflowFieldPayload where
|
|
||||||
toJSON (WorkflowFieldPayload (WFPText txt)) = JSON.object
|
|
||||||
[ "tag" JSON..= ("text" :: Text)
|
|
||||||
, "text" JSON..= txt
|
|
||||||
]
|
|
||||||
toJSON (WorkflowFieldPayload (WFPNumber n)) = JSON.object
|
|
||||||
[ "tag" JSON..= ("number" :: Text)
|
|
||||||
, "number" JSON..= n
|
|
||||||
]
|
|
||||||
toJSON (WorkflowFieldPayload (WFPBool b)) = JSON.object
|
|
||||||
[ "tag" JSON..= ("bool" :: Text)
|
|
||||||
, "bool" JSON..= b
|
|
||||||
]
|
|
||||||
toJSON (WorkflowFieldPayload (WFPFile fid)) = JSON.object
|
|
||||||
[ "tag" JSON..= ("file" :: Text)
|
|
||||||
, "file" JSON..= fid
|
|
||||||
]
|
|
||||||
toJSON (WorkflowFieldPayload (WFPUser uid)) = JSON.object
|
|
||||||
[ "tag" JSON..= ("user" :: Text)
|
|
||||||
, "user" JSON..= uid
|
|
||||||
]
|
|
||||||
instance FromJSON WorkflowFieldPayload where
|
|
||||||
parseJSON = JSON.withObject "WorkflowFieldPayload" $ \o -> do
|
|
||||||
fieldTag <- (o JSON..: "tag" :: Parser Text)
|
|
||||||
case fieldTag of
|
|
||||||
"text" -> do
|
|
||||||
txt <- o JSON..: "text"
|
|
||||||
return $ WorkflowFieldPayload $ WFPText txt
|
|
||||||
"number" -> do
|
|
||||||
n <- (o JSON..: "number" :: Parser Scientific)
|
|
||||||
return $ WorkflowFieldPayload $ WFPNumber n
|
|
||||||
"bool" -> do
|
|
||||||
b <- (o JSON..: "bool" :: Parser Bool)
|
|
||||||
return $ WorkflowFieldPayload $ WFPBool b
|
|
||||||
"file" -> do
|
|
||||||
fid <- (o JSON..: "file" :: Parser Int64)
|
|
||||||
return $ WorkflowFieldPayload $ WFPFile fid
|
|
||||||
"user" -> do
|
|
||||||
uid <- (o JSON..: "user" :: Parser Int64)
|
|
||||||
return $ WorkflowFieldPayload $ WFPUser uid
|
|
||||||
_ -> terror $ "WorkflowFieldPayload parseJSON error: expected payload type (text|number|bool|file|user), but got " <> fieldTag
|
|
||||||
|
|
||||||
instance ToJSON WorkflowPayload' where
|
|
||||||
toJSON WorkflowPayload'{..} = JSON.object
|
|
||||||
[ "payload" JSON..= wpPayload
|
|
||||||
, "actor" JSON..= wpActor
|
|
||||||
, "action-time" JSON..= wpActionTime
|
|
||||||
]
|
|
||||||
instance FromJSON WorkflowPayload' where
|
|
||||||
parseJSON = JSON.withObject "WorkflowPayload'" $ \o -> do
|
|
||||||
wpPayload <- o JSON..: "payload"
|
|
||||||
wpActor <- o JSON..:? "actor"
|
|
||||||
wpActionTime <- o JSON..: "action-time"
|
|
||||||
return WorkflowPayload'{..}
|
|
||||||
|
|
||||||
deriveJSON defaultOptions ''WorkflowPayload
|
|
||||||
derivePersistFieldJSON ''WorkflowPayload
|
|
||||||
|
|
||||||
|
|
||||||
instance (ToJSON termid, ToJSON schoolid, ToJSON courseid) => ToJSON (WorkflowInstanceScope termid schoolid courseid) where
|
instance (ToJSON termid, ToJSON schoolid, ToJSON courseid) => ToJSON (WorkflowInstanceScope termid schoolid courseid) where
|
||||||
toJSON WISGlobal = JSON.object
|
toJSON WISGlobal = JSON.object
|
||||||
[ "tag" JSON..= ("global" :: Text)
|
[ "tag" JSON..= ("global" :: Text)
|
||||||
@ -463,7 +407,6 @@ instance (FromJSON termid, FromJSON schoolid, FromJSON courseid) => FromJSON (Wo
|
|||||||
deriveJSON defaultOptions
|
deriveJSON defaultOptions
|
||||||
{ constructorTagModifier = camelToPathPiece' 1 . fromJust . stripSuffix "'"
|
{ constructorTagModifier = camelToPathPiece' 1 . fromJust . stripSuffix "'"
|
||||||
} ''WorkflowInstanceScope'
|
} ''WorkflowInstanceScope'
|
||||||
derivePersistFieldJSON ''WorkflowInstanceScope'
|
|
||||||
|
|
||||||
|
|
||||||
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowPayload' fileid userid) where
|
instance (ToJSON fileid, ToJSON userid) => ToJSON (WorkflowPayload' fileid userid) where
|
||||||
@ -548,6 +491,7 @@ instance ( ToJSON termid, ToJSON schoolid, ToJSON courseid
|
|||||||
) => PersistFieldSql (WorkflowInstanceScope termid schoolid courseid) where
|
) => PersistFieldSql (WorkflowInstanceScope termid schoolid courseid) where
|
||||||
sqlType _ = SqlString
|
sqlType _ = SqlString
|
||||||
|
|
||||||
|
derivePersistFieldJSON ''WorkflowInstanceScope'
|
||||||
|
|
||||||
instance ( ToJSON fileid, ToJSON userid
|
instance ( ToJSON fileid, ToJSON userid
|
||||||
, FromJSON fileid, FromJSON userid
|
, FromJSON fileid, FromJSON userid
|
||||||
@ -562,11 +506,10 @@ instance ( ToJSON fileid, ToJSON userid
|
|||||||
|
|
||||||
----- TEST DEFS (TODO remove) -----
|
----- TEST DEFS (TODO remove) -----
|
||||||
|
|
||||||
--testGraph :: WorkflowGraph Text Text
|
testGraph :: WorkflowGraph Text Text
|
||||||
--testGraph = WorkflowGraph $ Map.fromList [("node1", WGN (Just "someLabel") True (Set.fromList [WGE "node1" (Set.fromList [WorkflowRoleUser "user-id", WorkflowRoleInitiator]) (Map.fromList [("sometext", impureNonNull $ Set.fromList [WorkflowPayloadSpec $ WorkflowPayloadFieldText "text-label" "text-placeholder" (Just "text-tooltip") (Just "text-default") Nothing]),("someuser", impureNonNull $ Set.fromList [WorkflowPayloadSpec $ WorkflowPayloadFieldUser "user-label" Nothing Nothing Nothing]),("someboolandnumber-opt", impureNonNull $ Set.fromList [WorkflowPayloadSpec $ WorkflowPayloadFieldBool "bool-label" Nothing (Just True), WorkflowPayloadSpec $ WorkflowPayloadFieldNumber "number-label" "number-placeholder" Nothing Nothing (Just 1) (Just 5) 0.01 (Just True)])])]))]
|
testGraph = WorkflowGraph $ Map.fromList [("node1", WGN (Just "someLabel") True (Set.fromList [WGE "node1" (Set.fromList [WorkflowRoleUser "user-id", WorkflowRoleInitiator, WorkflowRoleAuthorized $ PredDNF $ Set.fromList [impureNonNull $ Set.fromList [PLVariable AuthLecturer, PLNegated AuthParticipant]]]) (Map.fromList [("sometext", impureNonNull $ Set.fromList [WorkflowPayloadSpec $ WorkflowPayloadFieldText "text-label" "text-placeholder" (Just "text-tooltip") (Just "text-default") Nothing]),("someuser", impureNonNull $ Set.fromList [WorkflowPayloadSpec $ WorkflowPayloadFieldUser "user-label" Nothing Nothing Nothing]),("someboolandnumber-opt", impureNonNull $ Set.fromList [WorkflowPayloadSpec $ WorkflowPayloadFieldBool "bool-label" Nothing (Just True), WorkflowPayloadSpec $ WorkflowPayloadFieldNumber "number-label" "number-placeholder" Nothing Nothing (Just 1) (Just 5) 0.01 (Just True)])])]))]
|
||||||
|
|
||||||
--testGraphStr :: Data.ByteString.Lazy.Internal.ByteString
|
testGraphStr :: Data.ByteString.Lazy.Internal.ByteString
|
||||||
--testGraphStr = "{\"tag\":\"workflow\",\"nodes\":{\"node1\":{\"display-label\":\"node-label\",\"finished\":true,\"edges\":[{\"actors\":[{\"tag\":\"initiator\"},{\"tag\":\"user\",\"user\":\"user-id\"},{\"tag\":\"authorized\",\"authorized\":{\"dnf\":{\"dnfTerms\":[[{\"plVar\":\"lecturer\",\"val\":\"variable\"},{\"plVar\":\"participant\",\"val\":\"negated\"}]]}}}],\"form\":{\"some-number\":[{\"tag\":\"number\",\"step\":0.01,\"label\":\"number-label\",\"placeholder\":\"number-placeholder\"}]},\"target\":\"node1\"}]}}}"
|
testGraphStr = "{\"nodes\":{\"node1\":{\"display-label\":\"node-label\",\"finished\":true,\"edges\":[{\"actors\":[{\"tag\":\"initiator\"},{\"tag\":\"user\",\"user\":\"user-id\"},{\"tag\":\"authorized\",\"authorized\":{\"dnf\":{\"dnfTerms\":[[{\"plVar\":\"lecturer\",\"val\":\"variable\"},{\"plVar\":\"participant\",\"val\":\"negated\"}]]}}}],\"form\":{\"some-number\":[{\"tag\":\"number\",\"step\":0.01,\"label\":\"number-label\",\"placeholder\":\"number-placeholder\"}]},\"target\":\"node1\"}]}}}"
|
||||||
|
|
||||||
--testPayload :: WorkflowPayload Text Text
|
testPayload = Map.fromList [("sometext" :: WorkflowPayloadLabel, Seq.singleton (WorkflowPayload' (Map.fromList [("text-label", WorkflowFieldPayloadW $ WFPText "hello world!")]) (Just "actor-user-id" :: Maybe Text) (UTCTime (ModifiedJulianDay 58946) 57250)))]
|
||||||
--testPayload = Map.fromList [("sometext" :: WorkflowPayloadLabel, (Seq.singleton (WorkflowPayload' (Map.fromList [("text-label", WFPText "hello world!")]) (Just "actor-user-id" :: Maybe Text) (UTCTime (ModifiedJulianDay 58946) 57250))))]
|
|
||||||
|
|||||||
Reference in New Issue
Block a user