{-# LANGUAGE OverloadedStrings #-}
module Postmark.Request(Email(..),TrackLinks(..),Attachment(..),Body(..)) where
import Data.Aeson (ToJSON (..), Value (..), object, (.=))
import Data.Aeson.Types (Pair)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Base64 as Base64
import Data.Text (Text, intercalate)
import Data.Text.Encoding (decodeUtf8)
data Body =
Html Text
| Plain Text
| HtmlPlain Text Text
encBody :: Body -> [Pair]
encBody (Html v) = ["HtmlBody" .= v]
encBody (Plain p) = ["TextBody" .= p]
encBody (HtmlPlain v p) = ["HtmlBody" .= v,"TextBody" .= p]
encHeaders :: [(Text,Text)] -> Value
encHeaders = toJSON . map go
where go (k,v) = object ["Name" .= k,"Value" .= v]
data TrackLinks =
None
| HtmlAndText
| HtmlOnly
| TextOnly
encTrackLinks :: TrackLinks -> Text
encTrackLinks None = "None"
encTrackLinks HtmlAndText = "HtmlAndText"
encTrackLinks HtmlOnly = "HtmlOnly"
encTrackLinks TextOnly = "TextOnly"
data Attachment =
Attachment {
name :: Text
, content :: ByteString
, contentType :: Text }
instance ToJSON Attachment where
toJSON a = object
["Name" .= name a,
"Content" .= (decodeUtf8 $ Base64.encode $ content a),
"ContentType" .= contentType a]
data Email =
Email {
from :: Text
, to :: (Text,[Text])
, cc :: [Text]
, bcc :: [Text]
, subject :: Maybe Text
, tag :: Maybe Text
, body :: Body
, replyTo :: Maybe Text
, headers :: [(Text,Text)]
, trackOpens :: Bool
, trackLinks :: TrackLinks
, attachments :: [Attachment] }
toCommaSeparated :: [Text] -> Text
toCommaSeparated = intercalate ","
instance ToJSON Email where
toJSON r = object $ concat
[["From" .= from r
,"To" .= (toCommaSeparated $ (\(p,xs) -> p:xs) $ to r)
,"Cc" .= (toCommaSeparated $ cc r)
,"Bcc" .= (toCommaSeparated $ bcc r)]
,maybe [] (\s -> ["Subject" .= s]) $ subject r
,maybe [] (\t -> ["Tag" .= t]) $ tag r
,encBody $ body r
,maybe [] (\rt -> ["ReplyTo" .= rt]) $ replyTo r
,["Headers" .= (encHeaders $ headers r)
,"TrackOpens" .= trackOpens r
,"TrackLinks" .= (encTrackLinks $ trackLinks r)
,"Attachments" .= attachments r]]