@@ -1,5 +1,8 @@
1+{-# LANGUAGE ExtendedDefaultRules #-}
1−{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE OverloadedStrings #-}
2−{-# LANGUAGE TemplateHaskell #-}
3+{-# LANGUAGE TemplateHaskell #-}
5+{-# OPTIONS_GHC -fno-warn-type-defaults #-}
4-- Module : Network.PagerDuty.REST.Services.EmailFilters
7-- Module : Network.PagerDuty.REST.Services.EmailFilters
5-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
8-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
@@ -15,15 +18,164 @@
15-- subject and from address. It only applies to generic_email kind of
18-- subject and from address. It only applies to generic_email kind of
16-- Services. The way multiple filters are combined depends on the
19-- Services. The way multiple filters are combined depends on the
17-- email_filter_mode attribute of the service.
20-- email_filter_mode attribute of the service.
22+-- /See:/ <http://developer.pagerduty.com/documentation/rest/services/email_filters>
18module Network.PagerDuty.REST.Services.EmailFilters
23module Network.PagerDuty.REST.Services.EmailFilters
25+ -- * Create Email Filter
28+ -- * Update Email Filter
31+ -- * Delete Email Filter
36+ , HasEmailFilterInfo (..)
22−import Control.Lens
42+import Control.Applicative hiding (empty)
43+import Control.Lens hiding ((.=))
45+import Data.ByteString.Builder (Builder)
23import Data.Monoid
47import Data.Monoid
24−import Data.Text (Text)
48+import Data.Text (Text)
26import Network.HTTP.Types
49import Network.HTTP.Types
27import Network.PagerDuty.TH
50import Network.PagerDuty.TH
28import Network.PagerDuty.Types
51import Network.PagerDuty.Types
55+filters :: ServiceId -> Path
56+filters s = "services" % s % "email_filters"
64+deriveNullaryWith hyphenated ''MatchMode
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)
77+deriveRecord ''EmailFilterInfo
79+instance Default EmailFilterInfo where
80+ def = EmailFilterInfo Nothing Nothing Nothing Nothing Nothing Nothing
82+instance QueryLike EmailFilterInfo where
85+class HasEmailFilterInfo a where
86+ emailFilterInfo :: Lens' a EmailFilterInfo
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.
92+ -- /Default:/ always.
93+ efSubjectMode :: Lens' a (Maybe MatchMode)
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)
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.
103+ -- /Default:/ always.
104+ efBodyMode :: Lens' a (Maybe MatchMode)
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)
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.
114+ -- /Default:/ always.
115+ efFromEmailMode :: Lens' a (Maybe MatchMode)
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)
121+ efSubjectMode = emailFilterInfo.efSubjectMode'
122+ efSubjectRegex = emailFilterInfo.efSubjectRegex'
123+ efBodyMode = emailFilterInfo.efBodyMode'
124+ efBodyRegex = emailFilterInfo.efBodyRegex'
125+ efFromEmailMode = emailFilterInfo.efFromEmailMode'
126+ efFromEmailRegex = emailFilterInfo.efFromEmailRegex'
128+instance (QueryLike a, ToJSON a, HasEmailFilterInfo a)
129+ => HasEmailFilterInfo (Request a s b) where
130+ emailFilterInfo = upd.emailFilterInfo
132+instance HasEmailFilterInfo EmailFilterInfo where
133+ emailFilterInfo = id
135+data EmailFilter = EmailFilter
136+ { _efId :: EmailFilterId
137+ , _efInfo :: EmailFilterInfo
138+ } deriving (Eq, Show)
140+instance FromJSON EmailFilter where
141+ parseJSON = withObject "email_filter" $ \o ->
142+ EmailFilter <$> parseJSON (Object o)
145+instance ToJSON EmailFilter where
146+ toJSON e = Object (x <> y)
148+ Object x = toJSON (_efInfo e)
149+ Object y = object ["id" .= _efId e]
151+instance HasEmailFilterInfo EmailFilter where
152+ emailFilterInfo = lens _efInfo (\e x -> e { _efInfo = x })
154+-- | The email filter ID.
155+makeLens "_efId" ''EmailFilter
157+-- | Create a new Email Filter for the specified service.
159+-- @POST \/services\/\:service_id\/email_filters@
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
165+-- | Update an existing Email Filter.
167+-- @PUT \/services\/\:service_id\/email_filters\/\:id@
169+-- /See:/ <http://developer.pagerduty.com/documentation/rest/services/email_filters/update>
170+updateEmailFilter :: ServiceId
172+ -> Request EmailFilterInfo s Empty
173+updateEmailFilter s e = mk def & meth .~ PUT & path .~ filters s % e
175+-- | Delete an existing Email Filter.
177+-- @DELETE \/services\/\:service_id\/email_filters\/\:id@
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