git.iko.soy/typeable/mandrill
on master help sign in
Merge pull request #40 from mwotton/master

add webhooks api

commitaefccdc5d4161cd21db11b3eb29017fcdd38b498 authorAlfredo Di Napoli <alfredo.dinapoli@gmail.com> dateMon 19 Dec 2016, 22:13 (10 years ago) parentdd544079ccd183
5 files changed+101
mandrill.cabal+1 src/Network/API/Mandrill/Webhooks.hs+70 test/Main.hs+1 test/RawData.hs+19 test/Tests.hs+10
mandrill.cabal+1
@@ -26,6 +26,7 @@ library
2626 Network.API.Mandrill.Messages
2727 Network.API.Mandrill.Messages.Types
2828 Network.API.Mandrill.Inbound
29+ Network.API.Mandrill.Webhooks
2930 Network.API.Mandrill.Senders
3031 other-modules:
3132 Network.API.Mandrill.Utils
src/Network/API/Mandrill/Webhooks.hsnew file+70
@@ -0,0 +1,70 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE TemplateHaskell #-}
3+module Network.API.Mandrill.Webhooks where
4+import Control.Applicative (pure)
5+import Control.Lens
6+import Control.Monad (mzero)
7+import Data.Aeson (FromJSON, ToJSON, parseJSON,
8+ toJSON)
9+import Data.Aeson (Value (String))
10+import Data.Aeson.TH (defaultOptions, deriveJSON)
11+import Data.Aeson.Types (fieldLabelModifier)
12+import Data.Set (Set)
13+import Data.Text (Text)
14+import qualified Data.Text as T
15+import Network.API.Mandrill.HTTP (toMandrillResponse)
16+import Network.API.Mandrill.Settings
17+import Network.API.Mandrill.Types
18+import Network.HTTP.Client (Manager)
19+
20+data EventHook
21+ = EventSent
22+ | EventDeferred
23+ | EventHardBounced
24+ | EventSoftBounced
25+ | EventOpened
26+ | EventClicked
27+ | EventMarkedAsSpam
28+ | EventUnsubscribed
29+ | EventRejected
30+ deriving (Ord,Eq)
31+
32+instance Show EventHook where
33+ show e = case e of
34+ EventSent -> "send"
35+ EventDeferred -> "deferral"
36+ EventSoftBounced -> "soft_bounce"
37+ EventHardBounced -> "hard_bounce"
38+ EventOpened -> "open"
39+ EventClicked -> "click"
40+ EventMarkedAsSpam -> "spam"
41+ EventUnsubscribed -> "unsub"
42+ EventRejected -> "reject"
43+instance FromJSON EventHook where
44+ parseJSON (String s) =
45+ case s of
46+ "send" -> pure EventSent
47+ "deferral" -> pure EventDeferred
48+ "soft_bounce" -> pure EventSoftBounced
49+ "hard_bounce" -> pure EventHardBounced
50+ "open" -> pure EventOpened
51+ "click" -> pure EventClicked
52+ "spam" -> pure EventMarkedAsSpam
53+ "reject" -> pure EventRejected
54+ "unsub" -> pure EventUnsubscribed
55+ x -> fail ("can't parse " ++ show x)
56+
57+
58+instance ToJSON EventHook where
59+ toJSON e = String (T.pack $ show e)
60+
61+data WebhookAddRq =
62+ WebhookAddRq
63+ { _warq_key :: MandrillKey
64+ , _warq_url :: Text
65+ , _warq_description :: Text
66+ , _warq_events :: Set EventHook
67+ } deriving Show
68+
69+makeLenses ''WebhookAddRq
70+deriveJSON defaultOptions { fieldLabelModifier = drop 6 } ''WebhookAddRq
test/Main.hs+1
@@ -45,5 +45,6 @@ main = do
4545 , testCase "inbound/add-route.json API response parsing" testRouteAdd
4646 , testCase "inbound/add-domain.json API response parsing" testDomainAdd
4747 , testCase "senders/verify-domain.json API response parsing" testVerifyDomain
48+ , testCase "webhooks/add.json API response parsing" testWebhookAdd
4849 ]
4950 ]
test/RawData.hs+19
@@ -236,3 +236,22 @@ domainVerify = [r|
236236 "email": "email@domain.com"
237237}
238238|]
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
99import Network.API.Mandrill.Senders
1010import Network.API.Mandrill.Types
1111import Network.API.Mandrill.Users.Types
12+import Network.API.Mandrill.Webhooks
1213import RawData
1314import Test.Tasty.HUnit
1415
@@ -76,3 +77,12 @@ testVerifyDomain =
7677 where
7778 parsePayload :: Either String VerifyDomainResponse
7879 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