@@ -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