{-|
 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
 'Database.PostgreSQL.Simple.Queue.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
 @

-}
{-# OPTIONS_GHC -w #-}
module Database.PostgreSQL.Simple.Queue.Examples.EmailQueue where
import Database.PostgreSQL.Simple.Queue
import Database.PostgreSQL.Simple.Queue.Main