packages feed

paddle-0.1.0.0: src/Paddle/WebHook.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Paddle.WebHook where


import           Protolude
import           Prelude ()
import           Servant.API
import           Web.FormUrlEncoded
import Paddle.WebHook.Signature (SignatureBody)
import Paddle.WebHook.SubscriptionCreated (SubscriptionCreated)
import Paddle.WebHook.SubscriptionCancelled (SubscriptionCancelled)
import Paddle.FieldModifier (modifier)

data PaddleWebHook passthrough 
  = SubscriptionCreatedWebHook (SubscriptionCreated passthrough)
  | SubscriptionCancelledWebHook (SubscriptionCancelled passthrough)
  | UnknownWebHook Text
  deriving (Generic, Show)

-- TODO: validate request body using http://hackage.haskell.org/package/servant-0.16.2/docs/Servant-API-WithNamedContext.html
instance FromHttpApiData passthrough => FromForm (PaddleWebHook passthrough, SignatureBody) where
  fromForm form = 
    lookupUnique "alert_name" form >>= (\name -> liftA2 (,) (toWebHook name) signatureBody)
    where
      signatureBody :: Either Text SignatureBody
      signatureBody = fromForm form

      formOptions :: FormOptions
      formOptions =
        defaultFormOptions 
          { fieldLabelModifier = modifier
          }

      toWebHook :: Text -> Either Text (PaddleWebHook passthrough)
      toWebHook "subscription_created" = SubscriptionCreatedWebHook <$> genericFromForm formOptions form
      toWebHook "subscription_cancelled" = SubscriptionCancelledWebHook <$> genericFromForm formOptions form
      toWebHook name = Right $ UnknownWebHook name

type API passthrough
    = ReqBody '[FormUrlEncoded] (PaddleWebHook passthrough, SignatureBody)
    :> Post '[JSON] NoContent

api :: Proxy (API passthrough)
api = Proxy