git.iko.soy/typeable/pagerduty
on develop help sign in
Adding Schedules REST API
commit5b606a7a23919f2d6188ddb72385f9a0ba757a95 authorBrendan Hay <brendan.g.hay@gmail.com> dateMon 6 Oct 2014, 14:31 (12 years ago) parent1f45b21
10 files changed+394−73
pagerduty.cabal+8−8 src/Network/PagerDuty/REST/Alerts.hs+1−1 src/Network/PagerDuty/REST/EscalationPolicies.hs+4−4 src/Network/PagerDuty/REST/LogEntries.hs+3−3 src/Network/PagerDuty/REST/MaintenanceWindows.hs+3−3 src/Network/PagerDuty/REST/Reports.hs+1−1 src/Network/PagerDuty/REST/Schedules.hs+346−32 src/Network/PagerDuty/REST/Services.hs+3−3 src/Network/PagerDuty/TH.hs+21−18 src/Network/PagerDuty/Types.hs+4
pagerduty.cabal+8−8
@@ -32,16 +32,16 @@ library
3232 exposed-modules:
3333 Control.Monad.Trans.PagerDuty
3434 , Network.PagerDuty.Integration
35− , Network.PagerDuty.REST
36− , Network.PagerDuty.REST.Alerts
37− , Network.PagerDuty.REST.EscalationPolicies
35+ -- , Network.PagerDuty.REST
36+ -- , Network.PagerDuty.REST.Alerts
37+ -- , Network.PagerDuty.REST.EscalationPolicies
3838 -- , Network.PagerDuty.REST.Incidents
39− , Network.PagerDuty.REST.LogEntries
40− , Network.PagerDuty.REST.MaintenanceWindows
41− , Network.PagerDuty.REST.Reports
42− -- , Network.PagerDuty.REST.Schedules
39+ -- , Network.PagerDuty.REST.LogEntries
40+ -- , Network.PagerDuty.REST.MaintenanceWindows
41+ -- , Network.PagerDuty.REST.Reports
42+ , Network.PagerDuty.REST.Schedules
4343 -- , Network.PagerDuty.REST.Schedules.Overrides
44− , Network.PagerDuty.REST.Services
44+ -- , Network.PagerDuty.REST.Services
4545 -- , Network.PagerDuty.REST.Users
4646 -- , Network.PagerDuty.REST.Webhooks
4747
src/Network/PagerDuty/REST/Alerts.hs+1−1
@@ -81,7 +81,7 @@ data ListAlerts = ListAlerts
8181
8282instance Paginate ListAlerts
8383
84−deriveQuery ''ListAlerts
84+queryRequest ''ListAlerts
8585
8686-- | List existing alerts for a given time range, optionally filtered by type
8787-- (SMS, Email, Phone, or Push).
src/Network/PagerDuty/REST/EscalationPolicies.hs+4−4
@@ -202,7 +202,7 @@ newtype ListPolicies = ListPolicies
202202
203203instance Paginate ListPolicies
204204
205−deriveQuery ''ListPolicies
205+queryRequest ''ListPolicies
206206
207207-- | Filters the result, showing only the escalation policies
208208-- whose names match the query.
@@ -228,7 +228,7 @@ data CreatePolicy = CreatePolicy
228228 , _cpEscalationRules' :: [Rule] -- ^ Should be List1
229229 } deriving (Eq, Show)
230230
231−deriveBody ''CreatePolicy
231+jsonRequest ''CreatePolicy
232232
233233-- | The name of the escalation policy.
234234cpName :: Lens' (Request CreatePolicy s b) Text
@@ -261,7 +261,7 @@ createPolicy :: PolicyId
261261createPolicy i n rs =
262262 mk CreatePolicy
263263 { _cpName' = n
264− , _cpRepeatEnabled' = B False
264+ , _cpRepeatEnabled' = F
265265 , _cpNumLoops' = Nothing
266266 , _cpEscalationRules' = rs
267267 } & meth .~ PUT
@@ -283,7 +283,7 @@ data UpdatePolicy = UpdatePolicy
283283 , _upEscalationRules' :: [Rule]
284284 } deriving (Eq, Show)
285285
286−deriveBody ''UpdatePolicy
286+jsonRequest ''UpdatePolicy
287287
288288-- | The name of the escalation policy.
289289upName :: Lens' (Request UpdatePolicy s b) (Maybe Text)
src/Network/PagerDuty/REST/LogEntries.hs+3−3
@@ -432,7 +432,7 @@ data ListLogs = ListLogs
432432
433433instance Paginate ListLogs
434434
435−deriveQuery ''ListLogs
435+queryRequest ''ListLogs
436436
437437-- | Time zone in which dates in the result will be rendered.
438438--
@@ -465,7 +465,7 @@ listLogs =
465465 { _llTimeZone' = def
466466 , _llSince' = Nothing
467467 , _llUntil' = Nothing
468− , _llIsOverview' = B False
468+ , _llIsOverview' = F
469469 } & path .~ logs
470470 & query .~ includes
471471 & unwrap .~ key "log_entries"
@@ -490,7 +490,7 @@ newtype GetLog = GetLog
490490 { _glTimeZone' :: TZ
491491 } deriving (Eq, Show)
492492
493−deriveQuery ''GetLog
493+queryRequest ''GetLog
494494
495495-- | Time zone in which dates in the result will be rendered.
496496--
src/Network/PagerDuty/REST/MaintenanceWindows.hs+3−3
@@ -109,7 +109,7 @@ data ListWindows = ListWindows
109109 , _lwFilter' :: Maybe Text
110110 }
111111
112−deriveQuery ''ListWindows
112+queryRequest ''ListWindows
113113
114114-- | Filters the results, showing only the maintenance windows whose
115115-- descriptions contain the query.
@@ -171,7 +171,7 @@ data CreateWindow = CreateWindow
171171 , _cwMaintenanceWindow' :: CreateWindow'
172172 } deriving (Eq, Show)
173173
174−deriveBody ''CreateWindow
174+jsonRequest ''CreateWindow
175175
176176-- | This maintenance window's start time. This is when the services will stop
177177-- creating incidents. If this date is in the past, it will be updated to be the
@@ -240,7 +240,7 @@ data UpdateWindow = UpdateWindow
240240 , _uwServiceIds' :: Maybe [ServiceId]
241241 } deriving (Eq, Show)
242242
243−deriveBody ''UpdateWindow
243+jsonRequest ''UpdateWindow
244244
245245-- | The maintenance window's start time. Can only be updated on future
246246-- maintenance windows. If the start_time is set to a date in the past, it will be
src/Network/PagerDuty/REST/Reports.hs+1−1
@@ -82,7 +82,7 @@ data Report = Report
8282 , _rRollup' :: !Rollup
8383 } deriving (Eq, Show)
8484
85−deriveQuery ''Report
85+queryRequest ''Report
8686
8787-- | Start of the date range over which you want to search. The time element
8888-- is optional.
src/Network/PagerDuty/REST/Schedules.hs+346−32
@@ -1,5 +1,10 @@
1−{-# LANGUAGE OverloadedStrings #-}
2−{-# LANGUAGE TemplateHaskell #-}
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE ExtendedDefaultRules #-}
3+{-# LANGUAGE OverloadedStrings #-}
4+{-# LANGUAGE TemplateHaskell #-}
5+{-# LANGUAGE TypeFamilies #-}
6+
7+{-# OPTIONS_GHC -fno-warn-type-defaults #-}
38
49-- Module : Network.PagerDuty.REST.Schedules
510-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
@@ -17,9 +22,104 @@
1722-- This API allows users to manipulate on-call schedules.
1823module Network.PagerDuty.REST.Schedules
1924 (
20−
25+ -- * List Schedules
26+ ListSchedules
27+ , listSchedules
28+ , lsQuery
29+
30+ -- * Get Schedule
31+ , GetSchedule
32+ , getSchedule
33+ , gsSince
34+ , gsUntil
35+ , gsTimeZone
36+
37+ -- * Get Schedule Users
38+ , GetScheduleUsers
39+ , getScheduleUsers
40+ , gsuSince
41+ , gsuUntil
42+
43+ -- * Get Schedule Entries
44+ , GetScheduleEntries
45+ , getScheduleEntries
46+ , gseSince
47+ , gseUntil
48+ , gseOverflow
49+ , gseTimeZone
50+ , gseUserId
51+
52+ -- * Create Schedule
53+ , CreateSchedule
54+ , createSchedule
55+ , csName
56+ , csOverflow
57+ , csTimeZone
58+ , csScheduleLayers
59+
60+ -- * Update Schedule
61+ , UpdateSchedule
62+ , updateSchedule
63+ , usOverflow
64+ , usTimeZone
65+ , usScheduleLayers
66+
67+ -- * Preview Schedule
68+ , PreviewSchedule
69+ , previewSchedule
70+ , psSince
71+ , psUntil
72+ , psOverflow
73+ , psName
74+ , psTimeZone
75+ , psScheduleLayers
76+
77+ -- * Delete Schedule
78+ , deleteSchedule
79+
80+ -- * Types
81+ , RestrictionType (..)
82+ , Restriction
83+ , rStartTimeOfDay
84+ , rDurationSeconds
85+
86+ , Rotation
87+ , rMemberOrder
88+ , rUser
89+
90+ , ScheduleLayer
91+ , slName
92+ , slRenderedScheduleEntries
93+ , slRestrictionType
94+ , slRestrictions
95+ , slPriority
96+ , slStart
97+ , slEnd
98+ , slRenderedCoveragePercentage
99+ , slRotationTurnLengthSeconds
100+ , slRotationVirtualStart
101+ , slUsers
102+
103+ , HasScheduleInfo (..)
104+ , ScheduleInfo
105+ , Schedule
106+ , sScheduleLayers
107+ , sOverridesSubschedule
108+ , sFinalSchedule
21109 ) where
22110
111+import Control.Lens hiding ((.=))
112+import Data.Aeson
113+import Data.ByteString.Builder (Builder)
114+import Data.Text (Text)
115+import Data.Time
116+import Network.HTTP.Types.QueryLike
117+import Network.PagerDuty.REST.Users (User)
118+import Network.PagerDuty.TH
119+import Network.PagerDuty.Types
120+
121+default (Builder)
122+
23123schedules :: Path
24124schedules = "schedules"
25125
@@ -39,11 +139,9 @@ deriveJSON ''Restriction
39139
40140rStartTimeOfDay :: Lens' Restriction UTCTime
41141rStartTimeOfDay =
42− lens _rStartTimeOfDay (\r x -> r { _rStartTimeOfDay = x }) . _Date
142+ lens _rStartTimeOfDay (\r x -> r { _rStartTimeOfDay = x }) . _D
43143
44−rDurationSeconds :: Lens' Restriction UTCTime
45−rDurationSeconds =
46− lens _rDurationSeconds (\r x -> r { _rDurationSeconds = x }) . _Date
144+makeLens "_rDurationSeconds" ''Restriction
47145
48146data Rotation = Rotation
49147 { _rMemberOrder :: !Int
@@ -122,32 +220,64 @@ makeLens "_slRotationVirtualStart" ''ScheduleLayer
122220makeLens "_slUsers" ''ScheduleLayer
123221
124222data ScheduleInfo = ScheduleInfo
125− { _sId :: ScheduleId
126− , _sName :: Text
127− , _sTimeZone :: TZ
128− , _sToday :: Date
129− , _sEscalationPolicies :: [PolicyId]
223+ { _siId' :: ScheduleId
224+ , _siName' :: Text
225+ , _siTimeZone' :: TZ
226+ , _siToday' :: Date
227+ , _siEscalationPolicies' :: [PolicyId]
130228 } deriving (Eq, Show)
131229
132−makeClassy ''ScheduleInfo
230+deriveRecord ''ScheduleInfo
231+
232+class HasScheduleInfo a where
233+ scheduleInfo :: Lens' a ScheduleInfo
234+
235+ -- | The unique identifier of the schedule.
236+ sId :: Lens' a ScheduleId
237+ -- | The name of the schedule.
238+ sName :: Lens' a Text
239+ -- | The time zone of the schedule.
240+ sTimeZone :: Lens' a TimeZone
241+ -- | The current day in the schedule's time zone.
242+ sToday :: Lens' a UTCTime
243+ -- | An array of all the escalation policies that uses this schedule.
244+ sEscalationPolicies :: Lens' a [PolicyId]
245+
246+ sId = scheduleInfo.siId'
247+ sName = scheduleInfo.siName'
248+ sTimeZone = scheduleInfo.siTimeZone'._TZ
249+ sToday = scheduleInfo.siToday'._D
250+ sEscalationPolicies = scheduleInfo.siEscalationPolicies'
251+
252+instance HasScheduleInfo ScheduleInfo where
253+ scheduleInfo = id
133254
134255data Schedule = Schedule
135− { _sInfo' :: ScheduleInfo
136− , _sScheduleLayers' :: [ScheduleLayer]
137− , _sOverridesSubschedule' :: ScheduleLayer
138− , _sFinalSchedule' :: ScheduleLayer
256+ { _sInfo :: ScheduleInfo
257+ , _sScheduleLayers :: [ScheduleLayer]
258+ , _sOverridesSubschedule :: ScheduleLayer
259+ , _sFinalSchedule :: ScheduleLayer
139260 } deriving (Eq, Show)
140261
141−deriveRecord ''Schedule
262+deriveJSON ''Schedule
142263
143264instance HasScheduleInfo Schedule where
144− scheduleInfo = sInfo'
265+ scheduleInfo = lens _sInfo (\s x -> s { _sInfo = x })
266+
267+-- | A list of schedule layers. See the schedule layers parameters for details.
268+makeLens "_sScheduleLayers" ''Schedule
269+
270+-- | The schedule layer object where all the overrides are stored.
271+makeLens "_sOverridesSubschedule" ''Schedule
272+
273+-- | The final schedule layer object.
274+makeLens "_sFinalSchedule" ''Schedule
145275
146276newtype ListSchedules = ListSchedules
147277 { _lsQuery' :: Maybe Text
148278 } deriving (Eq, Show)
149279
150−deriveQuery ''ListSchedules
280+queryRequest ''ListSchedules
151281
152282-- | Filters the result, showing only the schedules whose name matches the query.
153283lsQuery :: Lens' (Request ListSchedules s b) (Maybe Text)
@@ -177,7 +307,7 @@ data GetSchedule = GetSchedule
177307 , _gsTimeZone' :: Maybe TZ
178308 } deriving (Eq, Show)
179309
180−deriveQuery ''GetSchedule
310+queryRequest ''GetSchedule
181311
182312-- | The start of the date range over which you want to return on-call schedule
183313-- entries and on-call schedule layers.
@@ -215,7 +345,7 @@ data GetScheduleUsers = GetScheduleUsers
215345 , _gsuUntil' :: Maybe Date
216346 } deriving (Eq, Show)
217347
218−deriveQuery ''GetScheduleUsers
348+queryRequest ''GetScheduleUsers
219349
220350-- | The start of the date range over which you want to return on-call users.
221351gsuSince :: Lens' (Request GetScheduleUsers s b) (Maybe UTCTime)
@@ -245,7 +375,7 @@ data GetScheduleEntries = GetScheduleEntries
245375 , _gseUserId' :: Maybe UserId
246376 } deriving (Eq, Show)
247377
248−deriveRecord ''GetScheduleEntries
378+queryRequest ''GetScheduleEntries
249379
250380-- | The start of the date range over which you want to return on-call
251381-- schedule entries.
@@ -274,12 +404,12 @@ gseOverflow = upd.gseOverflow'._B
274404-- | Time zone in which dates in the result will be rendered.
275405--
276406-- Default: account time zone.
277−gseTimeZone :: Lens' (Request GetScheduleEntries s b) TimeZone
407+gseTimeZone :: Lens' (Request GetScheduleEntries s b) (Maybe TimeZone)
278408gseTimeZone = upd.gseTimeZone'.mapping _TZ
279409
280410-- | To filter the returned on-call schedule entries by a specific user, you
281411-- can optionally add the user_id parameter to the query.
282−gseUserId :: Lens' (Request GetScheduleEntries s b) (Maybe Text)
412+gseUserId :: Lens' (Request GetScheduleEntries s b) (Maybe UserId)
283413gseUserId = upd.gseUserId'
284414
285415-- | List schedule entries that are active for a given time range for a
@@ -288,33 +418,217 @@ gseUserId = upd.gseUserId'
288418-- @GET \/schedules\/\:id\/entries@
289419--
290420-- _See:_ <http://developer.pagerduty.com/documentation/rest/schedules/entries>
291−getScheduleEntries =
292− mk Get
421+getScheduleEntries :: UserId
422+ -> Date -- ^ 'gseSince'
423+ -> Date -- ^ 'gseUntil'
424+ -> Request GetScheduleEntries s b
425+getScheduleEntries i s u =
426+ mk GetScheduleEntries
427+ { _gseSince' = s
428+ , _gseUntil' = u
429+ , _gseOverflow' = F
430+ , _gseTimeZone' = Nothing
431+ , _gseUserId' = Nothing
432+ } & path .~ schedules % i
433+
434+data CreateSchedule = CreateSchedule
435+ { _csName' :: Text
436+ , _csOverflow' :: !Bool'
437+ , _csTimeZone' :: TZ
438+ , _csScheduleLayers' :: [ScheduleLayer]
439+ } deriving (Eq, Show)
440+
441+makeLenses ''CreateSchedule
442+
443+instance ToJSON CreateSchedule where
444+ toJSON cs = object
445+ [ "name" .= _csName' cs
446+ , "overflow" .= _csOverflow' cs
447+ , "schedule" .= object
448+ [ "time_zone" .= _csTimeZone' cs
449+ , "schedule_layers" .= _csScheduleLayers' cs
450+ ]
451+ ]
452+
453+instance QueryLike CreateSchedule where
454+ toQuery = const []
455+
456+-- | Any on-call schedule entries that pass the date range bounds will be
457+-- truncated at the bounds, unless 'csOverflow' is set to 'True'.
458+--
459+-- Default: 'False'.
460+csOverflow :: Lens' (Request CreateSchedule s b) Bool
461+csOverflow = upd.csOverflow'._B
462+
463+-- | The name of the schedule.
464+csName :: Lens' (Request CreateSchedule s b) Text
465+csName = upd.csName'
466+
467+-- | The time zone of the schedule.
468+--
469+-- Default: 'UTC'.
470+csTimeZone :: Lens' (Request CreateSchedule s b) TimeZone
471+csTimeZone = upd.csTimeZone'._TZ
472+
473+-- | A list of schedule layers.
474+csScheduleLayers :: Lens' (Request CreateSchedule s b) [ScheduleLayer]
475+csScheduleLayers = upd.csScheduleLayers'
293476
294477-- | Create a new on-call schedule.
295478--
296479-- @POST \/schedules@
297480--
298481-- _See:_ <http://developer.pagerduty.com/documentation/rest/schedules/create>
299−createSchedule = undefined
482+createSchedule :: Text -- ^ 'csName'
483+ -> TimeZone -- ^ 'csTimeZone'
484+ -> [ScheduleLayer] -- ^ 'csScheduleLayers'
485+ -> Request CreateSchedule s Schedule
486+createSchedule n z ls =
487+ mk CreateSchedule
488+ { _csName' = n
489+ , _csOverflow' = F
490+ , _csTimeZone' = TZ z
491+ , _csScheduleLayers' = ls
492+ } & path .~ schedules
493+
494+data UpdateSchedule = UpdateSchedule
495+ { _usOverflow' :: !Bool'
496+ , _usTimeZone' :: TZ
497+ , _usScheduleLayers' :: [ScheduleLayer]
498+ } deriving (Eq, Show)
499+
500+makeLenses ''UpdateSchedule
501+
502+instance ToJSON UpdateSchedule where
503+ toJSON us = object
504+ [ "overflow" .= _usOverflow' us
505+ , "schedule" .= object
506+ [ "time_zone" .= _usTimeZone' us
507+ , "schedule_layers" .= _usScheduleLayers' us
508+ ]
509+ ]
510+
511+instance QueryLike UpdateSchedule where
512+ toQuery = const []
513+
514+-- | Any on-call schedule entries that pass the date range bounds will be
515+-- truncated at the bounds, unless 'usOverflow' is set to 'True'.
516+--
517+-- Default: 'False'.
518+usOverflow :: Lens' (Request UpdateSchedule s b) Bool
519+usOverflow = upd.usOverflow'._B
520+
521+-- | The time zone of the schedule.
522+usTimeZone :: Lens' (Request UpdateSchedule s b) TimeZone
523+usTimeZone = upd.usTimeZone'._TZ
524+
525+-- | A list of schedule layers.
526+usScheduleLayers :: Lens' (Request UpdateSchedule s b) [ScheduleLayer]
527+usScheduleLayers = upd.usScheduleLayers'
300528
301529-- | Update an existing on-call schedule.
302530--
531+-- _Note:_ You cannot delete schedule layers. You must include all layers in
532+-- your update request. To delete a layer, set the end parameter to schedule its
533+-- termination.
534+--
303535-- @PUT \/schedules\/\:id@
304536--
305537-- _See:_ <http://developer.pagerduty.com/documentation/rest/schedules/update>
306−updateSchedule = undefined
538+updateSchedule :: ScheduleId
539+ -> TimeZone -- ^ 'usTimeZone'
540+ -> [ScheduleLayer] -- ^ 'usScheduleLayers'
541+ -> Request UpdateSchedule s Schedule
542+updateSchedule s z ls =
543+ mk UpdateSchedule
544+ { _usOverflow' = F
545+ , _usTimeZone' = TZ z
546+ , _usScheduleLayers' = ls
547+ } & path .~ schedules % s
548+
549+data PreviewSchedule = PreviewSchedule
550+ { _psSince' :: Maybe Date
551+ , _psUntil' :: Maybe Date
552+ , _psName' :: Text
553+ , _psOverflow' :: !Bool'
554+ , _psTimeZone' :: TZ
555+ , _psScheduleLayers' :: [ScheduleLayer]
556+ } deriving (Eq, Show)
557+
558+makeLenses ''PreviewSchedule
559+
560+instance ToJSON PreviewSchedule where
561+ toJSON ps = object
562+ [ "since" .= _psSince' ps
563+ , "until" .= _psUntil' ps
564+ , "name" .= _psName' ps
565+ , "overflow" .= _psOverflow' ps
566+ , "schedule" .= object
567+ [ "time_zone" .= _psTimeZone' ps
568+ , "schedule_layers" .= _psScheduleLayers' ps
569+ ]
570+ ]
307571
308−-- | Preview the configuration of an on-call schedule.
572+instance QueryLike PreviewSchedule where
573+ toQuery = const []
574+
575+-- | The start of the date range over which you want to return on-call schedule
576+-- entries and on-call schedule layers.
577+psSince :: Lens' (Request PreviewSchedule s b) (Maybe UTCTime)
578+psSince = upd.psSince'.mapping _D
579+
580+-- | The end of the date range over which you want to return schedule entries
581+-- and on-call schedule layers.
582+psUntil :: Lens' (Request PreviewSchedule s b) (Maybe UTCTime)
583+psUntil = upd.psUntil'.mapping _D
584+
585+-- | Any on-call schedule entries that pass the date range bounds will be
586+-- truncated at the bounds, unless 'psOverflow' is set to 'True'.
587+--
588+-- Default: 'False'.
589+psOverflow :: Lens' (Request PreviewSchedule s b) Bool
590+psOverflow = upd.psOverflow'._B
591+
592+-- | The name of the schedule.
593+psName :: Lens' (Request PreviewSchedule s b) Text
594+psName = upd.psName'
595+
596+-- | The time zone of the schedule.
597+--
598+-- Default: 'UTC'.
599+psTimeZone :: Lens' (Request PreviewSchedule s b) TimeZone
600+psTimeZone = upd.psTimeZone'._TZ
601+
602+-- | A list of schedule layers.
603+psScheduleLayers :: Lens' (Request PreviewSchedule s b) [ScheduleLayer]
604+psScheduleLayers = upd.psScheduleLayers'
605+
606+-- | Preview what a schedule would look like without saving it. This work the
607+-- same as the update or create actions, except that the result is not
608+-- persisted. Preview optionally takes two additional arguments, since and until,
609+-- deliminating the span of the preview.
309610--
310611-- @POST \/schedules\/preview@
311612--
312613-- _See:_ <http://developer.pagerduty.com/documentation/rest/schedules/preview>
313−previewSchedule = undefined
614+previewSchedule :: Text -- ^ 'psName'
615+ -> TimeZone -- ^ 'psTimeZone'
616+ -> [ScheduleLayer] -- ^ 'psScheduleLayers'
617+ -> Request PreviewSchedule s Schedule
618+previewSchedule n z ls =
619+ mk PreviewSchedule
620+ { _psSince' = Nothing
621+ , _psUntil' = Nothing
622+ , _psName' = n
623+ , _psOverflow' = F
624+ , _psTimeZone' = TZ z
625+ , _psScheduleLayers' = ls
626+ } & path .~ schedules % "preview"
314627
315628-- | Delete an on-call schedule.
316629--
317630-- @DELETE \/schedules\/\:id@
318631--
319632-- _See:_ <http://developer.pagerduty.com/documentation/rest/schedules/delete>
320−deleteSchedule = undefined
633+deleteSchedule :: ScheduleId -> Request Empty s Empty
634+deleteSchedule s = empty & path .~ schedules % s
src/Network/PagerDuty/REST/Services.hs+3−3
@@ -366,7 +366,7 @@ newtype ListServices = ListServices
366366
367367instance Paginate ListServices
368368
369−deriveQuery ''ListServices
369+queryRequest ''ListServices
370370
371371-- | Time zone in which dates in the result will be rendered.
372372--
@@ -398,7 +398,7 @@ data CreateService = CreateService
398398 , _csSeverityFilter' :: Maybe SeverityFilter
399399 } deriving (Eq, Show)
400400
401−deriveBody ''CreateService
401+jsonRequest ''CreateService
402402
403403-- | The name of the service.
404404csName :: Lens' (Request CreateService s r) Text
@@ -480,7 +480,7 @@ data UpdateService = UpdateService
480480 , _usSeverityFilter' :: Maybe SeverityFilter
481481 } deriving (Eq, Show)
482482
483−deriveBody ''UpdateService
483+jsonRequest ''UpdateService
484484
485485-- | The name of the service.
486486usName :: Lens' (Request UpdateService s r) (Maybe Text)
src/Network/PagerDuty/TH.hs+21−18
@@ -12,12 +12,14 @@
1212
1313module Network.PagerDuty.TH
1414 (
15+ -- * Requests
16+ jsonRequest
17+ , queryRequest
18+
1519 -- * Compound expressions
16− deriveNullary
20+ , deriveNullary
1721 , deriveNullaryWith
1822 , deriveRecord
19− , deriveQuery
20− , deriveBody
2123
2224 -- * JSON
2325 , deriveJSON
@@ -25,6 +27,7 @@ module Network.PagerDuty.TH
2527
2628 -- * Lenses
2729 , makeLens
30+ , makeFields
2831
2932 -- * Re-exported generics
3033 , deriveGeneric
@@ -47,6 +50,21 @@ import Network.HTTP.Types.QueryLike
4750import Network.PagerDuty.Query
4851import Network.PagerDuty.Options
4952
53+jsonRequest :: Name -> Q [Dec]
54+jsonRequest n = concat <$> sequence
55+ [ makeLenses n
56+ , deriveJSON n
57+ , [d|instance QueryLike $(conT n) where toQuery = const []|]
58+ ]
59+
60+queryRequest :: Name -> Q [Dec]
61+queryRequest n = concat <$> sequence
62+ [ deriveGeneric n
63+ , makeLenses n
64+ , [d|instance ToJSON $(conT n) where toJSON = const (toJSON (object []))|]
65+ , [d|instance QueryLike $(conT n) where toQuery = gquery|]
66+ ]
67+
5068deriveNullary :: Name -> Q [Dec]
5169deriveNullary = deriveNullaryWith underscored
5270
@@ -62,21 +80,6 @@ deriveRecord n = concat <$> sequence
6280 , makeLenses n
6381 ]
6482
65−deriveBody :: Name -> Q [Dec]
66−deriveBody n = concat <$> sequence
67− [ makeLenses n
68− , deriveJSON n
69− , [d|instance QueryLike $(conT n) where toQuery = const []|]
70− ]
71−
72−deriveQuery :: Name -> Q [Dec]
73−deriveQuery n = concat <$> sequence
74− [ deriveGeneric n
75− , makeLenses n
76− , [d|instance ToJSON $(conT n) where toJSON = const (toJSON (object []))|]
77− , [d|instance QueryLike $(conT n) where toQuery = gquery|]
78− ]
79−
8083deriveJSON :: Name -> Q [Dec]
8184deriveJSON = deriveJSONWith underscored
8285
src/Network/PagerDuty/Types.hs+4
@@ -5,6 +5,7 @@
55{-# LANGUAGE GeneralizedNewtypeDeriving #-}
66{-# LANGUAGE KindSignatures #-}
77{-# LANGUAGE OverloadedStrings #-}
8+{-# LANGUAGE PatternSynonyms #-}
89{-# LANGUAGE RankNTypes #-}
910{-# LANGUAGE StandaloneDeriving #-}
1011{-# LANGUAGE TemplateHaskell #-}
@@ -97,6 +98,9 @@ instance ToByteString Bool' where
9798
9899instance ToQuery Bool'
99100
101+pattern T = B True
102+pattern F = B False
103+
100104newtype Date = D UTCTime
101105 deriving (Eq, Ord, Show)
102106