git.iko.soy/typeable/mandrill
on master help sign in
add webhooks api
2244896Mark Wotton
mandrill.cabal+1
@@ -26,6 +26,7 @@ library
26 Network.API.Mandrill.Messages
26 Network.API.Mandrill.Messages
27 Network.API.Mandrill.Messages.Types
27 Network.API.Mandrill.Messages.Types
28 Network.API.Mandrill.Inbound
28 Network.API.Mandrill.Inbound
29+ Network.API.Mandrill.Webhooks
29 Network.API.Mandrill.Senders
30 Network.API.Mandrill.Senders
30 other-modules:
31 other-modules:
31 Network.API.Mandrill.Utils
32 Network.API.Mandrill.Utils
src/Network/API/Mandrill/Webhooks.hsnew file+69
@@ -0,0 +1,69 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE TemplateHaskell #-}
3+module Network.API.Mandrill.Webhooks where
4+import Control.Lens
5+import Control.Monad (mzero)
6+import Data.Aeson (FromJSON, ToJSON, parseJSON,
7+ toJSON)
8+import Data.Aeson (Value (String))
9+import Data.Aeson.TH (defaultOptions, deriveJSON)
10+import Data.Aeson.Types (fieldLabelModifier)
11+import Data.Set (Set)
12+import Data.Text (Text)
13+import qualified Data.Text as T
14+import Network.API.Mandrill.HTTP (toMandrillResponse)
15+import Network.API.Mandrill.Settings
16+import Network.API.Mandrill.Types
17+import Network.HTTP.Client (Manager)
18+
19+data EventHook
20+ = EventSent
21+ | EventDeferred
22+ | EventHardBounced
23+ | EventSoftBounced
24+ | EventOpened
25+ | EventClicked
26+ | EventMarkedAsSpam
27+ | EventUnsubscribed
28+ | EventRejected
29+ deriving (Ord,Eq)
30+
31+instance Show EventHook where
32+ show e = case e of
33+ EventSent -> "send"
34+ EventDeferred -> "deferral"
35+ EventSoftBounced -> "soft_bounce"
36+ EventHardBounced -> "hard_bounce"
37+ EventOpened -> "open"
38+ EventClicked -> "click"
39+ EventMarkedAsSpam -> "spam"
40+ EventUnsubscribed -> "unsub"
41+ EventRejected -> "reject"
42+instance FromJSON EventHook where
43+ parseJSON (String s) =
44+ case s of
45+ "send" -> pure EventSent
46+ "deferral" -> pure EventDeferred
47+ "soft_bounce" -> pure EventSoftBounced
48+ "hard_bounce" -> pure EventHardBounced
49+ "open" -> pure EventOpened
50+ "click" -> pure EventClicked
51+ "spam" -> pure EventMarkedAsSpam
52+ "reject" -> pure EventRejected
53+ "unsub" -> pure EventUnsubscribed
54+ x -> fail ("can't parse " ++ show x)
55+
56+
57+instance ToJSON EventHook where
58+ toJSON e = String (T.pack $ show e)
59+
60+data WebhookAddRq =
61+ WebhookAddRq
62+ { _warq_key :: MandrillKey
63+ , _warq_url :: Text
64+ , _warq_description :: Text
65+ , _warq_events :: [EventHook]
66+ } deriving Show
67+
68+makeLenses ''WebhookAddRq
69+deriveJSON defaultOptions { fieldLabelModifier = drop 6 } ''WebhookAddRq
test/Main.hs+1
@@ -45,5 +45,6 @@ main = do
45 , testCase "inbound/add-route.json API response parsing" testRouteAdd
45 , testCase "inbound/add-route.json API response parsing" testRouteAdd
46 , testCase "inbound/add-domain.json API response parsing" testDomainAdd
46 , testCase "inbound/add-domain.json API response parsing" testDomainAdd
47 , testCase "senders/verify-domain.json API response parsing" testVerifyDomain
47 , testCase "senders/verify-domain.json API response parsing" testVerifyDomain
48+ , testCase "webhooks/add.json API response parsing" testWebhookAdd
48 ]
49 ]
49 ]
50 ]
test/RawData.hs+19
@@ -236,3 +236,22 @@ domainVerify = [r|
236 "email": "email@domain.com"
236 "email": "email@domain.com"
237}
237}
238|]
238|]
239+
240+webhookAdd = [r|
241+{
242+ "key": "example key",
243+ "url": "http://example/webhook-url",
244+ "description": "My Example Webhook",
245+ "events": [
246+ "send",
247+ "deferral",
248+ "hard_bounce",
249+ "soft_bounce",
250+ "open",
251+ "click",
252+ "spam",
253+ "unsub",
254+ "reject"
255+ ]
256+}
257+|]
test/Tests.hs+10
@@ -9,6 +9,7 @@ import Network.API.Mandrill.Messages.Types
9import Network.API.Mandrill.Senders
9import Network.API.Mandrill.Senders
10import Network.API.Mandrill.Types
10import Network.API.Mandrill.Types
11import Network.API.Mandrill.Users.Types
11import Network.API.Mandrill.Users.Types
12+import Network.API.Mandrill.Webhooks
12import RawData
13import RawData
13import Test.Tasty.HUnit
14import Test.Tasty.HUnit
14
15
@@ -76,3 +77,12 @@ testVerifyDomain =
76 where
77 where
77 parsePayload :: Either String VerifyDomainResponse
78 parsePayload :: Either String VerifyDomainResponse
78 parsePayload = eitherDecodeStrict . C8.pack $ domainVerify
79 parsePayload = eitherDecodeStrict . C8.pack $ domainVerify
80+
81+
82+testWebhookAdd :: Assertion
83+testWebhookAdd =
84+ assertBool ("webhooks/add.json (request): parsing failed" ++ show parsePayload)
85+ (isRight parsePayload)
86+ where
87+ parsePayload :: Either String WebhookAddRq
88+ parsePayload = eitherDecodeStrict . C8.pack $ webhookAdd