{-# LANGUAGE FlexibleContexts, QuasiQuotes, RecordWildCards, OverloadedStrings, TypeFamilies #-} module Clckwrks.MailingList.Page.ConfirmOptIn where import Control.Applicative (optional) import Control.Lens ((^.)) import Control.Lens.At (at) import Control.Monad.Reader (ReaderT, ask) import Control.Monad.State (get) import Clckwrks import Clckwrks.MailingList.Acid import Clckwrks.MailingList.Monad import Clckwrks.MailingList.Page.Template (template) import Clckwrks.MailingList.Types import Clckwrks.MailingList.URL import qualified Data.ByteString.Lazy.Char8 as Char8 import Data.String (fromString) import Data.Monoid (mempty) import Data.Maybe (fromJust) import qualified Data.Set as Set import Data.Time (UTCTime, getCurrentTime) import Data.Text (Text, pack) import qualified Data.Text as Text import qualified Data.UUID as UUID import Data.UUID.V4 (nextRandom) import Network.Mail.Mime (renderSendMail, renderMail') import Happstack.Server (look) import HSP import Language.Haskell.HSX.QQ (hsx) import Text.Html.Email.Validate (isValidEmail) import Text.Reform ( CommonFormError(..), Form, FormError(..), Proof(..), (++>) , (<++), prove, transformEither, transform, mapView) import qualified Text.Reform.Generalized as G import Text.Reform.Happstack (reform) import Text.Reform.HSP.Text (form, inputText, setAttrs, label, inputSubmit, errorList) -- |FIXME: GET requests are not supposed to modify the state -- |FIXME: when subscription fails but they are already subscribed confirmOptInPage :: MailingListM Response confirmOptInPage = do mId <- optional $ look "id" mUUID <- optional $ look "uuid" case (mId, mUUID) of (Just idText, Just uuidStr) -> case reads idText of [(n, [])] -> case UUID.fromString uuidStr of (Just uuid) -> do now <- liftIO $ getCurrentTime r <- update (VerifyOptIn now (SubscriberId n) uuid) case r of SubscriptionConfirmed -> validOptIn InvalidConfirmation -> invalidOptIn AlreadySubscribed -> alreadySubscribed _ -> invalidOptIn _ -> invalidOptIn where validOptIn = template (fromString "Subscription Confirmed!") () [hsx|
Your subscription has been successfully confirmed.
We were unable to confirm your subscription.
You have already confirmed your subscription.
Sorry. The server administrator has not yet configuration the mailing list plugin.
You are already subscribed to this mailing list.
|] (_, AwaitingConfirmation uuid):_ -> do url <- showURLParams ConfirmOptIn [("email", Just $ email^.unEmail), ("uuid", Just (UUID.toText uuid))] liftIO $ Char8.putStrLn =<< renderMail' (sendStringTemplateEmail [("link", url)] message email) template "Subscription Confirmation Sent!" () [hsx|A confirmation email has been sent to your email address. You must click on the link in the email to confirm your subscription.
|] emailForm :: MailingListForm Email emailForm = (formGrp (errorList ++> label ("Email:" :: Text) ++> (inputText mempty `transformEither` email))) <* (formGrp (inputSubmit (pack "subscribe") `setAttrs` [("class" := "btn btn-default"):: Attr Text Text])) where formGrp frm = mapView (\xml -> [hsx| [