packages feed

postgresql-simple-queue-0.1.0.0: examples/EmailQueue.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE RecordWildCards   #-}
import           Control.Exception.Lifted
import           Control.Lens
import           Control.Monad
import           Control.Monad.IO.Class
import           Data.Aeson as Aeson
import           Data.Text
import           Database.PostgreSQL.Simple.Queue
import           Database.PostgreSQL.Simple.Queue.Main
import           GHC.Generics
import           Network.AWS               as AWS
import           Network.AWS.SES.SendEmail as AWS
import           Network.AWS.SES.Types     as AWS

main :: IO ()
main = do
  env <- newEnv Discover
  runResourceT $ runAWS env $ defaultMain "aws-email-queue-consumer" $ \payload _ -> do
    case fromJSON $ pValue payload of
      Aeson.Success email -> do
        resp <- AWS.send $ makeEmail email
        logFailedRequest resp
      Aeson.Error x -> throwIO
                     $ userError
                     $ "Failed to decode payload as an Email: " ++ show x

data Email = Email
  { emailAddress :: Text
  , emailSubject :: Text
  , emailBody    :: Text
  } deriving (Show, Eq, Generic, FromJSON, ToJSON)

makeEmail :: Email -> SendEmail
makeEmail Email {..}
  = sendEmail emailAddress
              (set dToAddresses [emailAddress] destination)
  $ message (content emailSubject)
  $ set bText (Just $ content emailBody) AWS.body

logFailedRequest :: MonadIO m => SendEmailResponse -> m ()
logFailedRequest resp = do
    let stat = view sersResponseStatus resp

    unless (stat >= 200 && stat < 300) $
      liftIO $ putStrLn $ "SES failed with status: " ++ show stat