module Model where
import Control.Monad
import HAppS.State
import HAppS.Server
import Session
import Misc
import View
-------state
data UserAuthInfo = UserAuthInfo String String
data NewUserInfo = NewUserInfo String String String
instance FromData UserAuthInfo where
fromData = liftM2 UserAuthInfo (look "username") (look "password" `mplus` return "nopassword")
instance FromData NewUserInfo where
fromData = liftM3 NewUserInfo (look "username") (look "password" `mplus` return "nopassword") (look "password2" `mplus` return "nopassword2")
entryPoint :: Proxy State
entryPoint = Proxy
-- handlers that affect state
loginPage (UserAuthInfo user pass) = [anyRequest $ do
allowed <- query $ AuthUser user pass
if allowed
then performLogin user
else msgToWeb "Incorrect password"
]
performLogin user = do
key <- update $ NewSession (SessionData user)
addCookie (-1) (mkCookie "sid" (show key))
msgToWeb $ "UserAuthInfo: " ++ show (user)
checkAndAdd user pass = do
exists <- query $ IsUser user
if exists
then msgToWeb $ "User already exists"
else do
update $ ( AddUser user $ User user pass )
msgToWeb $ "User created."
viewPage (Just sid) = [anyRequest $ do
ses <- query $ (GetSession $ sid)
( ( ioMsgToWeb . withBaseContentW ) $ "Cookie value: " ++ (maybe "not logged in" show (ses :: Maybe SessionData)) :: WebT IO Response)]
viewPage Nothing =
[ msgToSp "Not logged in"]
newUserPage (NewUserInfo user pass1 pass2)
| pass1 == pass2 = [anyRequest $ do (checkAndAdd user pass1)]
| otherwise = [ msgToSp "Passwords did not match"]
userListPage :: [ServerPartT IO Response]
userListPage = [anyRequest $ do u <- query ListUsers
( ioMsgToWeb . withBaseContentW ) $ "Users: " ++ (show u)]