{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE UndecidableInstances #-} import Control.Applicative ((<$>)) import Control.Exception (try) import Control.Monad.IO.Class (liftIO) import Data.Aeson ((.=), ToJSON, toJSON) import Data.Reflection (Given, give, given) import Data.Text (Text) import Network.Wai.Middleware.RequestLogger (logStdout) import System.Environment (getEnv, getEnvironment) import Web.Scotty (scotty) import qualified Data.Aeson as J import qualified Data.Text as T import qualified Data.Text.Lazy as LT import qualified Network.HTTP.Client as C import qualified Network.HTTP.Client.TLS as C import qualified Network.HTTP.Types.Status as H import qualified Web.Scotty as S data Cfg = Cfg { cfgMailChimpApiKey :: Text , cfgMailChimpListId :: Text , cfgWebsiteUrl :: Text } deriving (Show) data SubRequest = SubRequest { srName :: Text , srEmailAddress :: Text } deriving (Show) instance (Given Cfg) => ToJSON SubRequest where toJSON request = J.object [ "apikey" .= cfgMailChimpApiKey given , "id" .= cfgMailChimpListId given , "merge_vars" .= J.object ["name" .= srName request] , "email" .= J.object ["email" .= srEmailAddress request] , "update_existing" .= True , "double_optin" .= True , "send_welcome" .= False ] accept :: S.ActionM () accept = do S.html "