module Network.PagerDuty.REST.Incidents
(
ListIncidents
, listIncidents
, lsSince
, lsUntil
, lsDateRange
, lsStatus
, lsIncidentKey
, lsService
, lsAssignedToUser
, lsTimeZone
, lsSortBy
, CountIncidents
, countIncidents
, cSince
, cUntil
, cDateRange
, cStatus
, cIncidentKey
, cService
, cAssignedToUser
, getIncident
, UpdateIncidents
, updateIncidents
, updateIncidentsBasic
, uiIncidents
, resolveIncident
, resolveIncidentBasic
, acknowledgeIncident
, acknowledgeIncidentBasic
, ReassignIncident
, reassignIncident
, riEscalationPolicy
, riEscalationLevel
, riAssignedToUser
, Sort (..)
, _Desc
, _Asc
, Field (..)
, IncidentStatus (..)
, UpdateStatus (..)
, UpdateIncident
, iiId
, iiStatus
, iiEscalationLevel
, iiEscalationPolicy
, iiAssignedToUser
, UpdatedIncidents
, uiId
, uiStatus
, uiIncidentNumber
, uiUrl
, uiError
, Assignee
, aAt
, aObject
, HasIncident (..)
, Incident
) where
import Control.Applicative hiding (empty)
import Control.Lens hiding (Empty)
import Data.Aeson
import Data.ByteString.Conversion (ToByteString (..),
toByteString')
import Data.Default.Class
import Data.Maybe
import Data.Monoid hiding (All)
import Data.Text (Text)
import qualified Data.Text.Encoding as Text
import Data.Time
import Network.HTTP.Types
import Network.PagerDuty.Internal.Query
import Network.PagerDuty.Internal.TH
import Network.PagerDuty.Internal.Types
default (Path)
incidents :: Path
incidents = "incidents"
data Sort a
= Desc a
| Asc a
deriving (Eq, Show)
makePrisms ''Sort
data Field
= IncidentNumber
| CreatedOn
| ResolvedOn
deriving (Eq, Show)
instance QueryValues (Sort Field) where
queryValues s = case s of
Desc f -> ["desc:" <> field f]
Asc f -> ["asc:" <> field f]
where
field IncidentNumber = "incidentNumber"
field CreatedOn = "createdOn"
field ResolvedOn = "resolvedOn"
data Range = All
deriving (Eq, Show)
instance QueryValues Range where
queryValues All = ["all"]
data IncidentStatus
= ITriggered
| IAcknowledged
| IResolved
| IOther Text
deriving (Eq, Show)
instance ToByteString IncidentStatus where
builder = \case
ITriggered -> "triggered"
IAcknowledged -> "acknowledged"
IResolved -> "resolved"
IOther t -> builder t
instance FromJSON IncidentStatus where
parseJSON = withText "status" $ pure . \case
"triggered" -> ITriggered
"acknowledged" -> IAcknowledged
"resolved" -> IResolved
t -> IOther t
instance ToJSON IncidentStatus where
toJSON = String . Text.decodeUtf8 . toByteString'
data Assignee = Assignee
{ _aAt :: Date
, _aObject :: Object
} deriving (Eq, Show)
deriveRecord ''Assignee
data Incident = Incident
{ _iIncidentNumber' :: !Int
, _iStatus' :: !IncidentStatus
, _iCreatedOn' :: Date
, _iHtmlUrl' :: Text
, _iIncidentKey' :: Maybe IncidentKey
, _iService' :: Object
, _iEscalationPolicy' :: Maybe Object
, _iAssignedTo' :: [Assignee]
, _iAcknowledgers' :: [Assignee]
, _iLastStatusChangeBy' :: Maybe Assignee
, _iLastStatusChangeOn' :: Maybe Date
, _iTriggerSummaryData' :: Object
, _iTriggerDetailsHtmlUrl' :: Text
} deriving (Eq, Show)
deriveRecord ''Incident
class HasIncident a where
incident :: Lens' a Incident
iIncidentNumber :: Lens' a Int
iStatus :: Lens' a IncidentStatus
iCreatedOn :: Lens' a UTCTime
iHtmlUrl :: Lens' a Text
iIncidentKey :: Lens' a (Maybe IncidentKey)
iService :: Lens' a Object
iEscalationPolicy :: Lens' a (Maybe Object)
iAssignedTo :: Lens' a [Assignee]
iAcknowledgers :: Lens' a [Assignee]
iLastStatusChangeBy :: Lens' a (Maybe Assignee)
iLastStatusChangeOn :: Lens' a (Maybe UTCTime)
iTriggerSummaryData :: Lens' a Object
iTriggerDetailsHtmlUrl :: Lens' a Text
iIncidentNumber = incident.iIncidentNumber'
iStatus = incident.iStatus'
iCreatedOn = incident.iCreatedOn'._D
iHtmlUrl = incident.iHtmlUrl'
iIncidentKey = incident.iIncidentKey'
iService = incident.iService'
iEscalationPolicy = incident.iEscalationPolicy'
iAssignedTo = incident.iAssignedTo'
iAcknowledgers = incident.iAcknowledgers'
iLastStatusChangeBy = incident.iLastStatusChangeBy'
iLastStatusChangeOn = incident.iLastStatusChangeOn'.mapping _D
iTriggerSummaryData = incident.iTriggerSummaryData'
iTriggerDetailsHtmlUrl = incident.iTriggerDetailsHtmlUrl'
instance HasIncident Incident where
incident = id
data ListIncidents = ListIncidents
{ _lsSince' :: Maybe Date
, _lsUntil' :: Maybe Date
, _lsDateRange' :: Maybe Range
, _lsStatus' :: Maybe (CSV IncidentStatus)
, _lsIncidentKey' :: Maybe IncidentKey
, _lsService' :: Maybe (CSV ServiceId)
, _lsAssignedToUser' :: Maybe (CSV UserId)
, _lsTimeZone' :: !TZ
, _lsSortBy' :: Maybe (Sort Field)
} deriving (Eq, Show)
queryRequest ''ListIncidents
instance Paginate ListIncidents
lsSince :: Lens' (Request ListIncidents s b) (Maybe UTCTime)
lsSince = upd.lsSince'.mapping _D
lsUntil :: Lens' (Request ListIncidents s b) (Maybe UTCTime)
lsUntil = upd.lsUntil'.mapping _D
lsDateRange :: Lens' (Request ListIncidents s b) Bool
lsDateRange = upd.lens get_ (flip set_)
where
get_ = (Just All ==) . view lsDateRange'
set_ x = lsDateRange' .~ listToMaybe [All | x]
lsStatus :: Lens' (Request ListIncidents s b) (Maybe [IncidentStatus])
lsStatus = upd.lsStatus'.mapping _CSV
lsIncidentKey :: Lens' (Request ListIncidents s b) (Maybe IncidentKey)
lsIncidentKey = upd.lsIncidentKey'
lsService :: Lens' (Request ListIncidents s b) (Maybe [ServiceId])
lsService = upd.lsService'.mapping _CSV
lsAssignedToUser :: Lens' (Request ListIncidents s b) (Maybe [UserId])
lsAssignedToUser = upd.lsAssignedToUser'.mapping _CSV
lsTimeZone :: Lens' (Request ListIncidents s b) TimeZone
lsTimeZone = upd.lsTimeZone'._TZ
lsSortBy :: Lens' (Request ListIncidents s b) (Maybe (Sort Field))
lsSortBy = upd.lsSortBy'
listIncidents :: Request ListIncidents s [Incident]
listIncidents =
mk ListIncidents
{ _lsSince' = Nothing
, _lsUntil' = Nothing
, _lsDateRange' = Nothing
, _lsStatus' = Nothing
, _lsIncidentKey' = Nothing
, _lsService' = Nothing
, _lsAssignedToUser' = Nothing
, _lsTimeZone' = def
, _lsSortBy' = Nothing
} & path .~ incidents
getIncident :: IncidentId -> Request Empty s Incident
getIncident i = empty & path .~ incidents % i
data CountIncidents = CountIncidents
{ _cSince' :: Maybe Date
, _cUntil' :: Maybe Date
, _cDateRange' :: Maybe Range
, _cStatus' :: Maybe (CSV IncidentStatus)
, _cIncidentKey' :: Maybe IncidentKey
, _cService' :: Maybe (CSV ServiceId)
, _cAssignedToUser' :: Maybe (CSV UserId)
} deriving (Eq, Show)
queryRequest ''CountIncidents
cSince :: Lens' (Request CountIncidents s b) (Maybe UTCTime)
cSince = upd.cSince'.mapping _D
cUntil :: Lens' (Request CountIncidents s b) (Maybe UTCTime)
cUntil = upd.cUntil'.mapping _D
cDateRange :: Lens' (Request CountIncidents s b) Bool
cDateRange = upd.lens get_ (flip set_)
where
get_ = (Just All ==) . view cDateRange'
set_ x = cDateRange' .~ listToMaybe [All | x]
cStatus :: Lens' (Request CountIncidents s b) (Maybe [IncidentStatus])
cStatus = upd.cStatus'.mapping _CSV
cIncidentKey :: Lens' (Request CountIncidents s b) (Maybe IncidentKey)
cIncidentKey = upd.cIncidentKey'
cService :: Lens' (Request CountIncidents s b) (Maybe [ServiceId])
cService = upd.cService'.mapping _CSV
cAssignedToUser :: Lens' (Request CountIncidents s b) (Maybe [UserId])
cAssignedToUser = upd.cAssignedToUser'.mapping _CSV
newtype Count = Count Int
deriving (Eq, Ord, Show, Bounded, Enum, Num, Integral, Real)
instance FromJSON Count where
parseJSON = withObject "count" $ \o -> Count <$> o .: "total"
countIncidents :: Request CountIncidents s Count
countIncidents =
mk CountIncidents
{ _cSince' = Nothing
, _cUntil' = Nothing
, _cDateRange' = Nothing
, _cStatus' = Nothing
, _cIncidentKey' = Nothing
, _cService' = Nothing
, _cAssignedToUser' = Nothing
} & path .~ incidents % "count"
data UpdateStatus
= UAcknowledged
| UResolved
deriving (Eq, Show)
deriveNullary ''UpdateStatus
data UpdateIncident = UpdateIncident
{ _iiId :: IncidentId
, _iiStatus :: Maybe UpdateStatus
, _iiEscalationLevel :: Maybe Int
, _iiEscalationPolicy :: Maybe EscalationPolicyId
, _iiAssignedToUser :: Maybe (CSV UserId)
} deriving (Eq, Show)
deriveJSON ''UpdateIncident
makeLens "_iiId" ''UpdateIncident
makeLens "_iiStatus" ''UpdateIncident
makeLens "_iiEscalationLevel" ''UpdateIncident
makeLens "_iiEscalationPolicy" ''UpdateIncident
makeLens "_iiAssignedToUser" ''UpdateIncident
data UpdatedIncidents = UpdatedIncidents
{ _uiId :: IncidentId
, _uiStatus :: IncidentStatus
, _uiIncidentNumber :: !Int
, _uiUrl :: Text
, _uiError :: Maybe Object
} deriving (Eq, Show)
deriveRecord ''UpdatedIncidents
data UpdateIncidents = UpdateIncidents
{ _uiIncidents' :: [UpdateIncident]
} deriving (Eq, Show)
jsonRequest ''UpdateIncidents
uiIncidents :: Lens' (Request UpdateIncidents s b) [UpdateIncident]
uiIncidents = upd.uiIncidents'
updateIncidents :: RequesterId -> Request UpdateIncidents s [UpdatedIncidents]
updateIncidents r = auth updateIncidentsBasic & query .~ [("requester_id", r)]
updateIncidentsBasic :: Request UpdateIncidents 'Basic [UpdatedIncidents]
updateIncidentsBasic =
mk UpdateIncidents
{ _uiIncidents' = []
} & meth .~ PUT
& path .~ incidents
resolveIncident :: IncidentId
-> RequesterId
-> Request Empty s Empty
resolveIncident i r =
auth (resolveIncidentBasic i) & query .~ [("requester_id", r)]
resolveIncidentBasic :: IncidentId -> Request Empty s Empty
resolveIncidentBasic i = empty & meth .~ PUT & path .~ incidents % i % "resolve"
acknowledgeIncident :: IncidentId
-> RequesterId
-> Request Empty s Empty
acknowledgeIncident i r =
auth (acknowledgeIncidentBasic i) & query .~ [("requester_id", r)]
acknowledgeIncidentBasic :: IncidentId -> Request Empty s Empty
acknowledgeIncidentBasic i =
empty & meth .~ PUT & path .~ incidents % i % "acknowledge"
data ReassignIncident = ReassignIncident
{ _riEscalationPolicy' :: Maybe EscalationPolicyId
, _riEscalationLevel' :: Maybe Int
, _riAssignedToUser' :: Maybe (CSV UserId)
} deriving (Eq, Show)
jsonRequest ''ReassignIncident
riEscalationPolicy :: Lens' (Request ReassignIncident s b) (Maybe EscalationPolicyId)
riEscalationPolicy = upd.riEscalationPolicy'
riEscalationLevel :: Lens' (Request ReassignIncident s b) (Maybe Int)
riEscalationLevel = upd.riEscalationLevel'
riAssignedToUser :: Lens' (Request ReassignIncident s b) (Maybe [UserId])
riAssignedToUser = upd.riAssignedToUser'.mapping _CSV
reassignIncident :: IncidentId
-> RequesterId
-> Request ReassignIncident s Empty
reassignIncident i r =
auth (reassignIncidentBasic i) & query .~ [("requester_id", r)]
reassignIncidentBasic :: IncidentId -> Request ReassignIncident s Empty
reassignIncidentBasic i =
mk ReassignIncident
{ _riEscalationPolicy' = Nothing
, _riEscalationLevel' = Nothing
, _riAssignedToUser' = Nothing
} & meth .~ PUT
& path .~ incidents % i % "reassign"