121 lines
3.1 KiB
Haskell
121 lines
3.1 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE PackageImports #-}
|
|
{-# LANGUAGE DataKinds #-}
|
|
module Control.User where
|
|
|
|
import Servant
|
|
import Servant.Client
|
|
import Servant.Client.Core.Auth
|
|
import Servant.Server
|
|
|
|
import Data.String (fromString)
|
|
|
|
import qualified Data.Text as T
|
|
import Data.Text.I18n
|
|
|
|
import Data.Maybe (fromMaybe)
|
|
|
|
import Control.Monad (void)
|
|
import Control.Monad.Reader (ask)
|
|
import Control.Monad.IO.Class (liftIO)
|
|
|
|
import Network.HTTP.Types.Status
|
|
|
|
-- imports from "mateamt"
|
|
|
|
import qualified "mateamt" API as MA
|
|
import qualified "mateamt" Types as MT
|
|
|
|
-- internal imports
|
|
|
|
import Types
|
|
import Client
|
|
import ClientAuth
|
|
import View
|
|
import Hash
|
|
import API
|
|
import Util
|
|
|
|
userSelectControl :: Maybe T.Text -> UserHandler UserSelectPage
|
|
userSelectControl mcookie = do
|
|
(ReadState l10n backend _) <- ask
|
|
let loc = Locale
|
|
(fromMaybe "en" $ lookup "locale" =<< fmap parseCookieText mcookie)
|
|
euser <- liftIO $ runClientM
|
|
(userList (Nothing))
|
|
backend
|
|
case euser of
|
|
Right uss ->
|
|
return $ userSelectPage l10n loc uss
|
|
Left err ->
|
|
error $ show err
|
|
|
|
userNewControl :: Maybe T.Text -> UserHandler UserNewPage
|
|
userNewControl mcookie = do
|
|
(ReadState l10n backend _) <- ask
|
|
let loc = Locale
|
|
(fromMaybe "en" $ lookup "locale" =<< fmap parseCookieText mcookie)
|
|
return $ userNewPage l10n loc
|
|
|
|
userNewPostControl
|
|
:: Maybe T.Text
|
|
-> MT.UserSubmit
|
|
-> UserHandler UserSelectPage
|
|
userNewPostControl _ us@(MT.UserSubmit ident email pass) = do
|
|
backend <- rsBackend <$> ask
|
|
hashedPass <- hashPassword pass
|
|
void $ liftIO $ runClientM
|
|
(userNew $us
|
|
{ MT.userSubmitPassHash = hashedPass
|
|
})
|
|
backend
|
|
throwError $ redirect303 userSelectLink
|
|
|
|
userOverviewControl
|
|
:: Maybe T.Text
|
|
-> Int
|
|
-> UserHandler UserOverviewPage
|
|
userOverviewControl mcookie uid = do
|
|
(ReadState l10n backend _) <- ask
|
|
let loc = Locale
|
|
(fromMaybe "en" $ lookup "locale" =<< fmap parseCookieText mcookie)
|
|
euser <- liftIO $ runClientM
|
|
(userGet (mkAuthenticatedRequest "secret" authenticateReq) uid)
|
|
backend
|
|
eproducts <- liftIO $ runClientM
|
|
(productShortList Nothing)
|
|
backend
|
|
case (euser, eproducts) of
|
|
(Right ud, Right prods) ->
|
|
return $ userOverviewPage l10n loc ud prods
|
|
(Left uerr, Right _) -> case uerr of
|
|
FailureResponse _ resp ->
|
|
if statusCode (responseStatusCode resp) == 401
|
|
then do
|
|
let redirectHeaders = errHeaders $ redirect303 authLink
|
|
throwError
|
|
(err303
|
|
{ errHeaders = redirectHeaders ++
|
|
[ ("Set-Cookie", "x-auth-user=" <> (fromString $ show uid)
|
|
<> "; Path=/"
|
|
)
|
|
]
|
|
}
|
|
)
|
|
else
|
|
throwError $ err500
|
|
{ errBody = fromString (show uerr)
|
|
}
|
|
_ ->
|
|
throwError $ err500
|
|
{ errBody = fromString (show uerr)
|
|
}
|
|
(Right _, Left perr) ->
|
|
throwError $ err500
|
|
{ errBody = fromString (show perr)
|
|
}
|
|
(Left uerr, Left perr) ->
|
|
throwError $ err500
|
|
{ errBody = (fromString $ show uerr) <> " " <> (fromString $ show perr)
|
|
}
|