@@ -1,5 +1,8 @@
1−{-# LANGUAGE OverloadedStrings #-}
2−{-# LANGUAGE TemplateHaskell #-}
1+{-# LANGUAGE ExtendedDefaultRules #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE TemplateHaskell #-}
4+
5+{-# OPTIONS_GHC -fno-warn-type-defaults #-}
36
47-- Module : Network.PagerDuty.REST.Services.EmailFilters
58-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
@@ -15,15 +18,164 @@
1518-- subject and from address. It only applies to generic_email kind of
1619-- Services. The way multiple filters are combined depends on the
1720-- email_filter_mode attribute of the service.
21+--
22+-- /See:/ <http://developer.pagerduty.com/documentation/rest/services/email_filters>
1823module Network.PagerDuty.REST.Services.EmailFilters
1924 (
25+ -- * Create Email Filter
26+ createEmailFilter
27+
28+ -- * Update Email Filter
29+ , updateEmailFilter
30+
31+ -- * Delete Email Filter
32+ , deleteEmailFilter
33+
34+ -- * Types
35+ , MatchMode (..)
36+ , HasEmailFilterInfo (..)
37+ , EmailFilterInfo
38+ , EmailFilter
39+ , efId
2040 ) where
2141
22−import Control.Lens
42+import Control.Applicative hiding (empty)
43+import Control.Lens hiding ((.=))
44+import Data.Aeson
45+import Data.ByteString.Builder (Builder)
46+import Data.Default
2347import Data.Monoid
24−import Data.Text (Text)
25−import Data.Time
48+import Data.Text (Text)
2649import Network.HTTP.Types
2750import Network.PagerDuty.TH
2851import Network.PagerDuty.Types
2952
53+default (Builder)
54+
55+filters :: ServiceId -> Path
56+filters s = "services" % s % "email_filters"
57+
58+data MatchMode
59+ = Always
60+ | Match
61+ | NoMatch
62+ deriving (Eq, Show)
63+
64+deriveNullaryWith hyphenated ''MatchMode
65+
66+-- FIXME: Tighten up this type! Make the regex required for match/no-match and
67+-- encode the conditional invariants.
68+data EmailFilterInfo = EmailFilterInfo
69+ { _efSubjectMode' :: Maybe MatchMode
70+ , _efSubjectRegex' :: Maybe Text
71+ , _efBodyMode' :: Maybe MatchMode
72+ , _efBodyRegex' :: Maybe Text
73+ , _efFromEmailMode' :: Maybe MatchMode
74+ , _efFromEmailRegex' :: Maybe Text
75+ } deriving (Eq, Show)
76+
77+deriveRecord ''EmailFilterInfo
78+
79+instance Default EmailFilterInfo where
80+ def = EmailFilterInfo Nothing Nothing Nothing Nothing Nothing Nothing
81+
82+instance QueryLike EmailFilterInfo where
83+ toQuery = const []
84+
85+class HasEmailFilterInfo a where
86+ emailFilterInfo :: Lens' a EmailFilterInfo
87+
88+ -- | One of always, match, no-match, which, respectively, means to not
89+ -- filter the email trigger by subject, filter it if the email subject
90+ -- matches the given regex, or filter if it doesn't match the given regex.
91+ --
92+ -- /Default:/ always.
93+ efSubjectMode :: Lens' a (Maybe MatchMode)
94+
95+ -- | The regex to be used when subject_mode is match or no-match.
96+ -- It is a required parameter on such cases.
97+ efSubjectRegex :: Lens' a (Maybe Text)
98+
99+ -- | One of always, match, no-match, which, respectively, means to not filter
100+ -- the email trigger by body, filter it if the body email matches the given
101+ -- regex, or filter if it doesn't match the given regex.
102+ --
103+ -- /Default:/ always.
104+ efBodyMode :: Lens' a (Maybe MatchMode)
105+
106+ -- | The regex to be used when body_mode is match or no-match.
107+ -- It is a required parameter on such cases.
108+ efBodyRegex :: Lens' a (Maybe Text)
109+
110+ -- | One of always, match, no-match, which, respectively, means to not filter
111+ -- the email trigger by its from address, filter it if the email from address
112+ -- matches the given regex, or filter if it doesn't match the given regex.
113+ --
114+ -- /Default:/ always.
115+ efFromEmailMode :: Lens' a (Maybe MatchMode)
116+
117+ -- | The regex to be used when from_email_mode is match or no-match.
118+ -- It is a required parameter on such cases.
119+ efFromEmailRegex :: Lens' a (Maybe Text)
120+
121+ efSubjectMode = emailFilterInfo.efSubjectMode'
122+ efSubjectRegex = emailFilterInfo.efSubjectRegex'
123+ efBodyMode = emailFilterInfo.efBodyMode'
124+ efBodyRegex = emailFilterInfo.efBodyRegex'
125+ efFromEmailMode = emailFilterInfo.efFromEmailMode'
126+ efFromEmailRegex = emailFilterInfo.efFromEmailRegex'
127+
128+instance (QueryLike a, ToJSON a, HasEmailFilterInfo a)
129+ => HasEmailFilterInfo (Request a s b) where
130+ emailFilterInfo = upd.emailFilterInfo
131+
132+instance HasEmailFilterInfo EmailFilterInfo where
133+ emailFilterInfo = id
134+
135+data EmailFilter = EmailFilter
136+ { _efId :: EmailFilterId
137+ , _efInfo :: EmailFilterInfo
138+ } deriving (Eq, Show)
139+
140+instance FromJSON EmailFilter where
141+ parseJSON = withObject "email_filter" $ \o ->
142+ EmailFilter <$> parseJSON (Object o)
143+ <*> o .: "id"
144+
145+instance ToJSON EmailFilter where
146+ toJSON e = Object (x <> y)
147+ where
148+ Object x = toJSON (_efInfo e)
149+ Object y = object ["id" .= _efId e]
150+
151+instance HasEmailFilterInfo EmailFilter where
152+ emailFilterInfo = lens _efInfo (\e x -> e { _efInfo = x })
153+
154+-- | The email filter ID.
155+makeLens "_efId" ''EmailFilter
156+
157+-- | Create a new Email Filter for the specified service.
158+--
159+-- @POST \/services\/\:service_id\/email_filters@
160+--
161+-- /See:/ <http://developer.pagerduty.com/documentation/rest/services/email_filters/create>
162+createEmailFilter :: ServiceId -> Request EmailFilterInfo s EmailFilter
163+createEmailFilter s = mk def & meth .~ POST & path .~ filters s
164+
165+-- | Update an existing Email Filter.
166+--
167+-- @PUT \/services\/\:service_id\/email_filters\/\:id@
168+--
169+-- /See:/ <http://developer.pagerduty.com/documentation/rest/services/email_filters/update>
170+updateEmailFilter :: ServiceId
171+ -> EmailFilterId
172+ -> Request EmailFilterInfo s Empty
173+updateEmailFilter s e = mk def & meth .~ PUT & path .~ filters s % e
174+
175+-- | Delete an existing Email Filter.
176+--
177+-- @DELETE \/services\/\:service_id\/email_filters\/\:id@
178+--
179+-- /See:/ <http://developer.pagerduty.com/documentation/rest/services/email_filters/delete>
180+deleteEmailFilter :: ServiceId -> EmailFilterId -> Request Empty s Empty
181+deleteEmailFilter s e = empty & meth .~ DELETE & path .~ filters s % e