git.iko.soy/typeable/pagerduty
on develop help sign in
Adding common UserInfo and Overrides REST API
commit23ac67b5459e08ce3c533c5bd7c53483ccceaa0c authorBrendan Hay <brendan.g.hay@gmail.com> dateMon 6 Oct 2014, 15:40 (12 years ago) parent5b606a7
6 files changed+244−61
pagerduty.cabal+1−1 src/Network/PagerDuty/REST/EscalationPolicies.hs+2−27 src/Network/PagerDuty/REST/Schedules.hs+8−5 src/Network/PagerDuty/REST/Schedules/Overrides.hs+187 src/Network/PagerDuty/REST/Users.hs+45−28 src/Network/PagerDuty/Types.hs+1
pagerduty.cabal+1−1
@@ -40,7 +40,7 @@ library
4040 -- , Network.PagerDuty.REST.MaintenanceWindows
4141 -- , Network.PagerDuty.REST.Reports
4242 , Network.PagerDuty.REST.Schedules
43− -- , Network.PagerDuty.REST.Schedules.Overrides
43+ , Network.PagerDuty.REST.Schedules.Overrides
4444 -- , Network.PagerDuty.REST.Services
4545 -- , Network.PagerDuty.REST.Users
4646 -- , Network.PagerDuty.REST.Webhooks
src/Network/PagerDuty/REST/EscalationPolicies.hs+2−27
@@ -84,6 +84,7 @@ import qualified Data.Text as Text
8484import Data.Time
8585import Network.HTTP.Types
8686import Network.PagerDuty.REST.Services (Service)
87+import Network.PagerDuty.REST.Users
8788import Network.PagerDuty.TH
8889import Network.PagerDuty.Types
8990
@@ -103,35 +104,9 @@ makeLens "_stId" ''ScheduleTarget
103104-- | The name of the target.
104105makeLens "_stName" ''ScheduleTarget
105106
106−data UserTarget = UserTarget
107− { _utId :: UserId
108− , _utName :: Text
109− , _utEmail :: Address
110− , _utTimeZone :: TZ
111− , _utColor :: Text
112− } deriving (Eq, Show)
113−
114−deriveJSON ''UserTarget
115−
116−-- | The id of the user.
117−makeLens "_utId" ''UserTarget
118−
119−-- | The name of the user.
120−makeLens "_utName" ''UserTarget
121−
122−-- | The user's email address.
123−makeLens "_utEmail" ''UserTarget
124−
125−-- | The user's personal time zone.
126−utTimeZone :: Lens' UserTarget TimeZone
127−utTimeZone = lens _utTimeZone (\t x -> t { _utTimeZone = x }) . _TZ
128−
129−-- | The color used to represent the user in schedules.
130−makeLens "_utColor" ''UserTarget
131−
132107data Target
133108 = TSchedule ScheduleTarget
134− | TUser UserTarget
109+ | TUser UserInfo
135110 deriving (Eq, Show)
136111
137112makePrisms ''Target
src/Network/PagerDuty/REST/Schedules.hs+8−5
@@ -113,7 +113,7 @@ import Data.Aeson
113113import Data.ByteString.Builder (Builder)
114114import Data.Text (Text)
115115import Data.Time
116−import Network.HTTP.Types.QueryLike
116+import Network.HTTP.Types
117117import Network.PagerDuty.REST.Users (User)
118118import Network.PagerDuty.TH
119119import Network.PagerDuty.Types
@@ -489,7 +489,8 @@ createSchedule n z ls =
489489 , _csOverflow' = F
490490 , _csTimeZone' = TZ z
491491 , _csScheduleLayers' = ls
492− } & path .~ schedules
492+ } & meth .~ POST
493+ & path .~ schedules
493494
494495data UpdateSchedule = UpdateSchedule
495496 { _usOverflow' :: !Bool'
@@ -544,7 +545,8 @@ updateSchedule s z ls =
544545 { _usOverflow' = F
545546 , _usTimeZone' = TZ z
546547 , _usScheduleLayers' = ls
547− } & path .~ schedules % s
548+ } & meth .~ PUT
549+ & path .~ schedules % s
548550
549551data PreviewSchedule = PreviewSchedule
550552 { _psSince' :: Maybe Date
@@ -623,7 +625,8 @@ previewSchedule n z ls =
623625 , _psOverflow' = F
624626 , _psTimeZone' = TZ z
625627 , _psScheduleLayers' = ls
626− } & path .~ schedules % "preview"
628+ } & meth .~ POST
629+ & path .~ schedules % "preview"
627630
628631-- | Delete an on-call schedule.
629632--
@@ -631,4 +634,4 @@ previewSchedule n z ls =
631634--
632635-- _See:_ <http://developer.pagerduty.com/documentation/rest/schedules/delete>
633636deleteSchedule :: ScheduleId -> Request Empty s Empty
634−deleteSchedule s = empty & path .~ schedules % s
637+deleteSchedule s = empty & meth .~ DELETE & path .~ schedules % s
src/Network/PagerDuty/REST/Schedules/Overrides.hsnew file+187
@@ -0,0 +1,187 @@
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE ExtendedDefaultRules #-}
3+{-# LANGUAGE OverloadedStrings #-}
4+{-# LANGUAGE TemplateHaskell #-}
5+{-# LANGUAGE TypeFamilies #-}
6+
7+{-# OPTIONS_GHC -fno-warn-type-defaults #-}
8+
9+-- Module : Network.PagerDuty.REST.Schedules
10+-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
11+-- License : This Source Code Form is subject to the terms of
12+-- the Mozilla Public License, v. 2.0.
13+-- A copy of the MPL can be found in the LICENSE file or
14+-- you can obtain it at http://mozilla.org/MPL/2.0/.
15+-- Maintainer : Brendan Hay <brendan.g.hay@gmail.com>
16+-- Stability : experimental
17+-- Portability : non-portable (GHC extensions)
18+
19+-- | Schedule overrides are custom, non-recurring exceptions to your regular
20+-- on-call schedules. Use them when your team members go on vacation, swap shifts,
21+-- or when you simply cannot achieve your normal scheduling with recurring layers.
22+module Network.PagerDuty.REST.Schedules.Overrides
23+ (
24+ -- * List Overrides
25+ ListOverrides
26+ , listOverrides
27+ , lsSince
28+ , lsUntil
29+ , lsEditable
30+ , lsOverflow
31+
32+ -- * Create Override
33+ , CreateOverride
34+ , createOverride
35+ , coUserId
36+ , coStart
37+ , coEnd
38+
39+ -- * Delete Override
40+ , deleteOverride
41+
42+ -- * Types
43+ , HasUserInfo (..)
44+ , Override
45+ , oId
46+ , oStart
47+ , oEnd
48+ , oUser
49+ ) where
50+
51+import Control.Lens
52+import Data.Time
53+import Network.HTTP.Types
54+import Network.PagerDuty.REST.Users
55+import Network.PagerDuty.TH
56+import Network.PagerDuty.Types
57+
58+schedules, overrides :: Path
59+schedules = "schedules"
60+overrides = "overrides"
61+
62+data Override = Override
63+ { _oId :: Maybe OverrideId
64+ , _oStart :: Date
65+ , _oEnd :: Date
66+ , _oUser :: UserInfo
67+ } deriving (Eq, Show)
68+
69+deriveRecord ''Override
70+
71+instance HasUserInfo Override where
72+ userInfo = oUser
73+
74+data ListOverrides = ListOverrides
75+ { _lsSince' :: Date
76+ , _lsUntil' :: Date
77+ , _lsEditable' :: Bool'
78+ , _lsOverflow' :: Bool'
79+ } deriving (Eq, Show)
80+
81+queryRequest ''ListOverrides
82+
83+-- | The start time of the date range you want to retrieve override for.
84+--
85+-- The maximum date range queryable is 3 months.
86+lsSince :: Lens' (Request ListOverrides s b) UTCTime
87+lsSince = upd.lsSince'._D
88+
89+-- | The end time of the date range you want to retrieve override for.
90+lsUntil :: Lens' (Request ListOverrides s b) UTCTime
91+lsUntil = upd.lsUntil'._D
92+
93+-- | When 'True', only editable overrides will be returned.
94+--
95+-- The result will onlyinclude the id the override if this parameter is present.
96+-- Only future overrides are editable.
97+--
98+-- _Default:_ 'False.'
99+lsEditable :: Lens' (Request ListOverrides s b) Bool
100+lsEditable = upd.lsEditable'._B
101+
102+-- | Any on-call schedule entries that pass the date range bounds will be
103+-- truncated at the bounds, unless @lsEditable .~ True@ is specified.
104+--
105+-- _Default:_ 'False.'
106+lsOverflow :: Lens' (Request ListOverrides s b) Bool
107+lsOverflow = upd.lsOverflow'._B
108+
109+-- | List overrides for a given time range.
110+--
111+-- @GET \/schedules\/\:schedule_id\/overrides@
112+--
113+-- _See:_ <http://developer.pagerduty.com/documentation/rest/schedules/overrides/list>
114+listOverrides :: ScheduleId
115+ -> Date -- ^ 'lsSince'
116+ -> Date -- ^ 'lsUntil'
117+ -> Request ListOverrides s [Override]
118+listOverrides i s u =
119+ mk ListOverrides
120+ { _lsSince' = s
121+ , _lsUntil' = u
122+ , _lsEditable' = F
123+ , _lsOverflow' = F
124+ } & path .~ schedules % i % overrides
125+
126+data CreateOverride = CreateOverride
127+ { _coStart' :: Date
128+ , _coEnd' :: Date
129+ , _coUserId' :: UserId
130+ } deriving (Eq, Show)
131+
132+jsonRequest ''CreateOverride
133+
134+-- | The start date and time for the override.
135+coStart :: Lens' (Request CreateOverride s b) UTCTime
136+coStart = upd.coStart'._D
137+
138+-- | The end date and time for the override.
139+coEnd :: Lens' (Request CreateOverride s b) UTCTime
140+coEnd = upd.coEnd'._D
141+
142+-- | The ID of the user who will be on call for the duration of the override.
143+coUserId :: Lens' (Request CreateOverride s b) UserId
144+coUserId = upd.coUserId'
145+
146+-- | Create an override for a specific user covering the specified time range. If
147+-- you create an override on top of an existing one, the last created override
148+-- will have priority.
149+--
150+-- If no time zone information is present in the since and until parameters, the
151+-- schedule's time zone will be used.
152+--
153+-- _Note:_ You cannot create overrides in the past.
154+--
155+-- @POST \/schedules\/\:schedule_id\/overrides@
156+--
157+-- _See:_ <http://developer.pagerduty.com/documentation/rest/schedules/overrides/create>
158+createOverride :: ScheduleId
159+ -> UserId -- ^ 'coUserId'
160+ -> Date -- ^ 'coStart'
161+ -> Date -- ^ 'coEnd'
162+ -> Request CreateOverride s Override
163+createOverride i u s e =
164+ mk CreateOverride
165+ { _coUserId' = u
166+ , _coStart' = s
167+ , _coEnd' = e
168+ } & meth .~ POST
169+ & path .~ schedules % i % overrides
170+
171+-- | Remove an override.
172+--
173+-- You cannot remove a past override. If the override start
174+-- time is before the current time, but the end time is after the current time,
175+-- the override will be truncated to the current time. If the override is
176+-- truncated, the status code will be 200 OK, as opposed to a 204 No Content for a
177+-- successful delete.
178+--
179+-- @DELETE \/schedules\/\:schedule_id\/overrides\/\:id@
180+--
181+-- _See:_ <http://developer.pagerduty.com/documentation/rest/schedules/overrides/delete>
182+
183+-- FIXME: How to parse whether truncated or deleted?
184+deleteOverride :: ScheduleId -> OverrideId -> Request Empty s Empty
185+deleteOverride i o = empty
186+ & meth .~ DELETE
187+ & path .~ schedules % i % overrides % o
src/Network/PagerDuty/REST/Users.hs+45−28
@@ -18,12 +18,9 @@ module Network.PagerDuty.REST.Users
1818 (
1919
2020 -- * Types
21− User
22− , uId
23− , uName
24− , uEmail
25− , uTimeZone
26− , uColor
21+ HasUserInfo (..)
22+ , UserInfo
23+ , User
2724 , uRole
2825 , uAvatarUrl
2926 , uUrl
@@ -41,31 +38,51 @@ import Network.PagerDuty.Types
4138users :: Path
4239users = "users"
4340
44−data User = User
45− { _uId :: UserId
46− , _uName :: Text
47− , _uEmail :: Address
48− , _uTimeZone :: TZ
49− , _uColor :: Text
50− , _uRole :: Text
51− , _uAvatarUrl :: Text
52− , _uUrl :: Text
53− , _uInvitationSent :: Bool'
41+data UserInfo = UserInfo
42+ { _uId' :: UserId
43+ , _uName' :: Text
44+ , _uEmail' :: Address
45+ , _uColor' :: Text
46+ , _uTimeZone' :: Maybe TZ
5447 } deriving (Eq, Show)
5548
56−deriveJSON ''User
49+deriveRecord ''UserInfo
50+
51+class HasUserInfo a where
52+ userInfo :: Lens' a UserInfo
53+
54+ -- | The id of the user.
55+ uId :: Lens' a UserId
56+ -- | The name of the user.
57+ uName :: Lens' a Text
58+ -- | The user's email address.
59+ uEmail :: Lens' a Address
60+ -- | The color used to represent the user in schedules.
61+ uColor :: Lens' a Text
62+ -- | The user's personal time zone.
63+ uTimeZone :: Lens' a (Maybe TimeZone)
64+
65+ uId = userInfo.uId'
66+ uName = userInfo.uName'
67+ uEmail = userInfo.uEmail'
68+ uColor = userInfo.uColor'
69+ uTimeZone = userInfo.uTimeZone'.mapping _TZ
70+
71+instance HasUserInfo UserInfo where
72+ userInfo = id
73+
74+data User = User
75+ { _uInfo' :: UserInfo
76+ , _uRole :: Text
77+ , _uAvatarUrl :: Text
78+ , _uUrl :: Text
79+ , _uInvitationSent' :: !Bool'
80+ } deriving (Eq, Show)
5781
58−makeLens "_uId" ''User
59−makeLens "_uName" ''User
60−makeLens "_uEmail" ''User
61−makeLens "_uColor" ''User
62−makeLens "_uRole" ''User
63−makeLens "_uAvatarUrl" ''User
64−makeLens "_uUrl" ''User
82+deriveRecord ''User
6583
66−uTimeZone :: Lens' User TimeZone
67−uTimeZone = lens _uTimeZone (\u x -> u { _uTimeZone = x }) . _TZ
84+instance HasUserInfo User where
85+ userInfo = uInfo'
6886
6987uInvitationSent :: Lens' User Bool
70−uInvitationSent =
71− lens _uInvitationSent (\u x -> u { _uInvitationSent = x }) . _B
88+uInvitationSent = uInvitationSent'._B
src/Network/PagerDuty/Types.hs+1
@@ -382,6 +382,7 @@ instance QueryValueLike (Id a) where
382382type AlertId = Id "alert"
383383type EmailFilterId = Id "email-filter"
384384type LogEntryId = Id "log-entry"
385+type OverrideId = Id "schedule-override"
385386type PolicyId = Id "escalation-policy"
386387type RequesterId = Id "requester"
387388type RuleId = Id "rule"