packages feed

aws-sns-verify-0.0.0.0: library/Amazon/SNS/Verify/Payload.hs

module Amazon.SNS.Verify.Payload
  ( SNSPayload(..)
  , SNSType(..)
  , SNSNotification(..)
  , SNSSubscription(..)
  ) where

import Amazon.SNS.Verify.Prelude

import Data.Aeson
  ( FromJSON
  , defaultOptions
  , fieldLabelModifier
  , genericParseJSON
  , parseJSON
  , withObject
  , (.:)
  )
import GHC.Generics (Generic)

data SNSPayload = SNSPayload
  { snsMessage :: Text
  , snsMessageId :: Text
  , snsTimestamp :: Text
  , snsTopicArn :: Text
  , snsType :: Text
  , snsSignatureVersion :: Text
  , snsSignature :: Text
  , snsSigningCertURL :: Text
  , snsTypePayload :: SNSType
  }

instance FromJSON SNSPayload where
  parseJSON v = parse v
   where
    parse = withObject "SNSPayload" $ \o -> do
      payloadType <- o .: "Type"
      SNSPayload
        <$> o
        .: "Message"
        <*> o
        .: "MessageId"
        <*> o
        .: "Timestamp"
        <*> o
        .: "TopicArn"
        <*> pure payloadType
        <*> o
        .: "SignatureVersion"
        <*> o
        .: "Signature"
        <*> o
        .: "SigningCertURL"
        <*> parseType payloadType
    parseType = \case
      "SubscriptionConfirmation" -> SubscriptionConfirmation <$> parseJSON v
      "UnsubscribeConfirmation" -> UnsubscribeConfirmation <$> parseJSON v
      "Notification" -> Notification <$> parseJSON v
      msg -> fail $ "Unknown message type " <> show msg

data SNSType
  = Notification SNSNotification
  | SubscriptionConfirmation SNSSubscription
  | UnsubscribeConfirmation SNSSubscription

newtype SNSNotification = SNSNotification
  { snsSubject :: Maybe Text
  }
  deriving stock (Show, Eq, Generic)

instance FromJSON SNSNotification where
  parseJSON = genericParseJSON $ defaultOptions { fieldLabelModifier = drop 3 }

data SNSSubscription = SNSSubscription
  { snsToken :: Text
  , snsSubscribeURL :: Text
  }
  deriving stock (Show, Eq, Generic)

instance FromJSON SNSSubscription where
  parseJSON = genericParseJSON $ defaultOptions { fieldLabelModifier = drop 3 }