wikimusic-ssr-1.0.1.6: src/WikiMusic/SSR/Servant/LoginRoutes.hs
{-# LANGUAGE OverloadedLabels #-}
module WikiMusic.SSR.Servant.LoginRoutes where
import Principium
import Servant
import Servant.Multipart
import WikiMusic.Interaction.Model.User
import WikiMusic.Model.Auth
import WikiMusic.SSR.Backend.Rest ()
import WikiMusic.SSR.Free.Backend
import WikiMusic.SSR.Free.View
import WikiMusic.SSR.Servant.Utilities
import WikiMusic.SSR.View.Html ()
submitLoginRoute :: (MonadIO m, MonadError ServerError m) => Env -> MultipartData tag -> m a
submitLoginRoute env multipartData = do
maybeAuthToken <- liftIO $ exec @Backend (login env (LoginRequest {wikimusicEmail = email, wikimusicPassword = password}))
case maybeAuthToken of
Left e -> do
setCookieRoute (env ^. #cfg % #cookie) "/login" emptyMap
Right authToken -> setCookieRoute (env ^. #cfg % #cookie) "/songs" (mapFromList [(authCookieName, encodeToken authToken)])
where
email = unpackText $ fromForm multipartData "" "email"
password = unpackText $ fromForm multipartData "" "password"
loginFormRoute :: (MonadIO m) => Env -> Maybe Text -> m Html
loginFormRoute env cookie = liftIO $ exec @View (loginPage env vv)
where
vv = vvFromCookies cookie
doPasswordResetFormRoute :: (MonadIO m) => Env -> Maybe Text -> Maybe Text -> m Html
doPasswordResetFormRoute env cookie maybeToken = liftIO $ exec @View (doPasswordResetPage env vv maybeToken)
where
vv = vvFromCookies cookie
requestPasswordResetRoute :: (MonadIO m) => Env -> Maybe Text -> m Html
requestPasswordResetRoute env cookie = liftIO $ exec @View (requestPasswordResetPage env vv)
where
vv = vvFromCookies cookie
doRequestPasswordResetRoute :: (MonadIO m, MonadError ServerError m) => Env -> MultipartData tag -> m a
doRequestPasswordResetRoute env multipartData = do
_ <-
liftIO
$ exec @Backend
( resetPassword
env
email
)
respondWithHttp
httpFound
{ cause = Just "Requested password reset!",
headers = [withLocation ("/login?email=" <> email)]
}
where
email = fromForm multipartData "" "email"
doPasswordResetRoute :: (MonadIO m, MonadError ServerError m) => Env -> MultipartData tag -> m a
doPasswordResetRoute env multipartData = do
_ <-
liftIO
$ exec @Backend
( resetPasswordDo
env
( DoPasswordResetRequest
{ email = email,
token = token,
password = password,
passwordConfirm = passwordConfirm
}
)
)
respondWithHttp
httpFound
{ cause = Just "Reset password!",
headers = [withLocation ("/login?email=" <> email)]
}
where
email = fromForm multipartData "" "email"
password = fromForm multipartData "" "password"
passwordConfirm = fromForm multipartData "" "passwordConfirm"
token = fromForm multipartData "" "token"
inviteUsersRoute :: (MonadIO m) => Env -> Maybe Text -> m Html
inviteUsersRoute env cookie = liftIO $ exec @View (inviteUsersPage env vv)
where
vv = vvFromCookies cookie
inviteUsersFormRoute :: (MonadIO m, MonadError ServerError m) => Env -> Maybe Text -> MultipartData tag -> m a
inviteUsersFormRoute env cookie multipartData = do
_ <-
liftIO
$ exec @Backend
( userInvite
env
(vv ^. #authToken)
InviteUsersRequest {..}
)
respondWithHttp
httpFound
{ cause = Just "Requested password reset!",
headers = [withLocation ("/login?email=" <> email)]
}
where
vv = vvFromCookies cookie
email = fromForm multipartData "" "email"
displayName = fromForm multipartData "" "displayName"
description = maybeFromForm multipartData "description"
role = (read . unpackText $ fromForm multipartData "" "role") :: UserRole