postgresql-simple-queue-0.2.0.0: A PostgreSQL backed queue

Safe HaskellNone
LanguageHaskell2010

Database.PostgreSQL.Simple.Queue.Examples.EmailQueue

Description

This is a documentation only module that exposes the source for the async-email-example. The main file is located in examples/EmailQueue and is reprinted here to show an example of using defaultMain from Main to quickly build a queue consumer executable.

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