module Data.Connect.Conditions
( Condition(..)
, ConditionType(..)
, ConditionSource(..)
, JIRACondition(..)
, ConfluenceCondition(..)
, staticJiraCondition
, staticConfluenceCondition
, remoteCondition
, invertCondition
) where
import Data.Aeson
import Data.Connect.AesonHelpers
import Data.Connect.OrphanInstances ()
import GHC.Generics
import qualified Data.HashMap.Strict as HM
data Condition
= SingleCondition
{ conditionSource :: ConditionSource
, conditionInverted :: Bool
, conditionParams :: HM.HashMap String String
}
| CompositeCondition
{ subConditions :: [Condition]
, conditionType :: ConditionType
}
deriving (Show)
staticJiraCondition :: JIRACondition -> Condition
staticJiraCondition c = SingleCondition { conditionSource = StaticJIRACondition c, conditionInverted = False, conditionParams = HM.empty }
staticConfluenceCondition :: ConfluenceCondition -> Condition
staticConfluenceCondition c = SingleCondition { conditionSource = StaticConfluenceCondition c, conditionInverted = False, conditionParams = HM.empty }
remoteCondition :: String -> Condition
remoteCondition conditionLocation = SingleCondition { conditionSource = RemoteCondition conditionLocation, conditionInverted = False, conditionParams = HM.empty }
invertCondition :: Condition -> Condition
invertCondition c@(SingleCondition {}) = c { conditionInverted = not . conditionInverted $ c }
invertCondition (CompositeCondition cs ct) = CompositeCondition (fmap invertCondition cs) (invertConditionType ct)
invertConditionType :: ConditionType -> ConditionType
invertConditionType AndCondition = OrCondition
invertConditionType OrCondition = AndCondition
instance ToJSON Condition where
toJSON sc@(SingleCondition {}) = object
[ "condition" .= conditionSource sc
, "invert" .= conditionInverted sc
, "params" .= conditionParams sc
]
toJSON cc@(CompositeCondition {}) = object [ "conditions" .= subConditions cc, "type" .= conditionType cc]
data ConditionType
= AndCondition
| OrCondition
deriving (Eq, Show)
instance ToJSON ConditionType where
toJSON AndCondition = String "AND"
toJSON OrCondition = String "OR"
data ConditionSource
= StaticJIRACondition JIRACondition
| StaticConfluenceCondition ConfluenceCondition
| RemoteCondition
{ remoteConditionPath :: String
}
deriving (Show, Eq)
instance ToJSON ConditionSource where
toJSON (StaticJIRACondition x) = toJSON x
toJSON (StaticConfluenceCondition x) = toJSON x
toJSON (RemoteCondition x) = toJSON x
data JIRACondition
= CanAttachFileToIssueJiraCondition
| CanManageAttachmentsJiraCondition
| FeatureFlagJiraCondition
| HasIssuePermissionJiraCondition
| HasProjectPermissionJiraCondition
| HasSelectedProjectPermissionJiraCondition
| HasSubTasksAvaliableJiraCondition
| HasVotedForIssueJiraCondition
| IsAdminModeJiraCondition
| IsIssueAssignedToCurrentUserJiraCondition
| IsIssueEditableJiraCondition
| IsIssueReportedByCurrentUserJiraCondition
| IsIssueUnresolvedJiraCondition
| IsSubTaskJiraCondition
| IsWatchingIssueJiraCondition
| LinkingEnabledJiraCondition
| SubTasksEnabledJiraCondition
| TimeTrackingEnabledJiraCondition
| UserHasIssueHistoryJiraCondition
| UserIsAdminJiraCondition
| UserIsLoggedInJiraCondition
| UserIsProjectAdminJiraCondition
| UserIsSysadminJiraCondition
| UserIsTheLoggedInUserJiraCondition
| VotingEnabledJiraCondition
| WatchingEnabledJiraCondition
deriving (Eq, Show, Generic)
instance ToJSON JIRACondition where
toJSON = toJSON . dropSuffixAndSnakeCase "JiraCondition" . show
data ConfluenceCondition
= ActiveThemeConfluenceCondition
| CanEditSpaceStylesConfluenceCondition
| CanSignupConfluenceCondition
| ContentHasAnyPermissionsSetConfluenceCondition
| CreateContentConfluenceCondition
| EmailAddressPublicConfluenceCondition
| FavouritePageConfluenceCondition
| FavouriteSpaceConfluenceCondition
| FeatureFlagConfluenceCondition
| FollowingTargetUserConfluenceCondition
| HasAttachmentConfluenceCondition
| HasBlogPostConfluenceCondition
| HasPageConfluenceCondition
| HasSpaceConfluenceCondition
| HasTemplateConfluenceCondition
| LatestVersionConfluenceCondition
| NotPersonalSpaceConfluenceCondition
| PrintableVersionConfluenceCondition
| ShowingPageAttachmentsConfluenceCondition
| SpaceFunctionPermissionConfluenceCondition
| SpaceSidebarConfluenceCondition
| TargetUserCanSetStatusConfluenceCondition
| TargetUserHasPersonalBlogConfluenceCondition
| TargetUserHasPersonalSpaceConfluenceCondition
| ThreadedCommentsConfluenceCondition
| TinyUrlSupportedConfluenceCondition
| UserCanCreatePersonalSpaceConfluenceCondition
| UserCanUpdateUserStatusConfluenceCondition
| UserCanUseConfluenceConfluenceCondition
| UserFavouritingTargetUserPersonalSpaceConfluenceCondition
| UserHasPersonalBlogConfluenceCondition
| UserHasPersonalSpaceConfluenceCondition
| UserIsAdminConfluenceCondition
| UserIsConfluenceAdministratorConfluenceCondition
| UserIsLoggedInConfluenceCondition
| UserIsSysadminConfluenceCondition
| UserLoggedInEditableConfluenceCondition
| UserWatchingPageConfluenceCondition
| UserWatchingSpaceConfluenceCondition
| UserWatchingSpaceForContentTypeConfluenceCondition
| ViewingContentConfluenceCondition
| ViewingOwnProfileConfluenceCondition
deriving (Eq, Show, Generic)
instance ToJSON ConfluenceCondition where
toJSON = toJSON . dropSuffixAndSnakeCase "ConfluenceCondition" . show