{-# 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