{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
module Antiope.SQS.Messages
( SqsMessage (..)
, Message, mBody
, QueueUrl
, fromMessage, fromMessageMaybe
, decodeBody
) where
import Antiope.SQS.Types
import Control.Lens ((&), (<&>), (^.))
import Data.Aeson as Aeson
import Data.Text (Text)
import GHC.Generics (Generic)
import Network.AWS.SQS (Message, mAttributes, mBody, mMD5OfBody, mMessageId, mReceiptHandle)
import qualified Data.HashMap.Strict as Hash
import qualified Data.Text.Encoding as Text
import qualified Network.AWS.SQS as SQS
fromMessageMaybe :: FromJSON a => Message -> Maybe (SqsMessage a)
fromMessageMaybe msg =
let smsg = fromMessage msg
in body smsg <&> (\a -> smsg { body = a})
fromMessage :: FromJSON a => Message -> SqsMessage (Maybe a)
fromMessage msg =
let attr a = msg ^. mAttributes & Hash.lookup a
in SqsMessage
{ messageId = msg ^. mMessageId
, receiptHandle = msg ^. mReceiptHandle <&> ReceiptHandle
, md5OfBody = msg ^. mMD5OfBody
, senderId = attr SQS.SenderId
, sendTimestamp = attr SQS.SentTimestamp
, approximateReceiveCount = attr SQS.ApproximateReceiveCount
, approximateFirstReceiveTimestamp = attr SQS.ApproximateFirstReceiveTimestamp
, body = decodeBody msg
}
data SqsMessage a = SqsMessage
{ senderId :: !(Maybe Text)
, messageId :: !(Maybe Text)
, md5OfBody :: !(Maybe Text)
, receiptHandle :: !(Maybe ReceiptHandle)
, sendTimestamp :: !(Maybe Text)
, approximateReceiveCount :: !(Maybe Text)
, approximateFirstReceiveTimestamp :: !(Maybe Text)
, body :: !a
} deriving (Show, Eq, Generic, Functor)
instance HasReceiptHandle (SqsMessage a) where
getReceiptHandle = receiptHandle
decodeBody :: FromJSON a => Message -> Maybe a
decodeBody msg =
msg ^. mBody >>= (Aeson.decodeStrict . Text.encodeUtf8)