{-# LANGUAGE OverloadedStrings #-} module Controller.SignIn ( signIn ) where import Control.Monad.IO.Class (liftIO) import Data.Text (Text) import Network.HTTP.Types.Status (ok200, badRequest400) import qualified Data.Text as T import qualified Data.Text.Encoding as TE import qualified Data.Text.Lazy as TL import Web.Scotty import Conf (Conf) import Model.Message.Key import qualified Conf import qualified Model.Query as Query import qualified Model.SignIn as SignIn import qualified Model.User as User import qualified SendMail import qualified Text.Email.Validate as Email import qualified View.Mail.SignIn as SignIn signIn :: Conf -> Text -> ActionM () signIn conf login = if Email.isValid (TE.encodeUtf8 login) then do maybeUser <- liftIO . Query.run $ User.getUser login case maybeUser of Just user -> do token <- liftIO . Query.run $ SignIn.createSignInToken login let url = T.concat [ if Conf.https conf then "https://" else "http://", Conf.hostname conf, "?signInToken=", token ] maybeSentMail <- liftIO . SendMail.sendMail $ SignIn.mail conf user url [login] case maybeSentMail of Right _ -> status ok200 Left _ -> do status badRequest400 text . TL.pack . show $ SendEmailFail Nothing -> do status badRequest400 text . TL.pack . show $ UnauthorizedSignIn else do status badRequest400 text . TL.pack . show $ EnterValidEmail