{- This file is part of Vervis. - - Written in 2016 by fr33domlover . - - ♡ Copying is an act of love. Please copy, reuse and share. - - The author(s) have dedicated all copyright and related and neighboring - rights to this software to the public domain worldwide. This software is - distributed without any warranty. - - You should have received a copy of the CC0 Public Domain Dedication along - with this software. If not, see - . -} module Vervis.Handler.Person ( getPeopleR , postPeopleR , getPersonNewR , getPersonR ) where import Vervis.Import hiding ((==.)) --import Prelude import Database.Esqueleto hiding (isNothing) import Vervis.Form.Person --import Model import Text.Blaze (text) import Yesod.Auth.HashDB (setPassword) -- | Get list of users getPeopleR :: Handler Html getPeopleR = do people <- runDB $ select $ from $ \ (sharer, person) -> do where_ $ sharer ^. SharerId ==. person ^. PersonIdent orderBy [asc $ sharer ^. SharerIdent] return $ sharer ^. SharerIdent defaultLayout $ do setTitle "Vervis > People" $(widgetFile "people") -- | Create new user postPeopleR :: Handler Html postPeopleR = do ((result, widget), enctype) <- runFormPost formPersonNew case result of FormSuccess pn -> do runDB $ do let sharer = Sharer { sharerIdent = uLogin pn , sharerName = Nothing } sid <- insert sharer let person = Person { personIdent = sid , personLogin = uLogin pn , personHash = Nothing , personEmail = uEmail pn } person' <- setPassword (uPass pn) person insert_ person' redirectUltDest HomeR FormMissing -> do setMessage "Field(s) missing" defaultLayout $(widgetFile "person-new") FormFailure l -> do setMessage $ toHtml $ intercalate "; " l defaultLayout $(widgetFile "person-new") --TODO NEXT: -- * Maybe make the form return Form Person and just insert defaults (using -- 'pure') for the remaining Person fields? Then, maybe the same form can -- be used to generate the RESTful JSON API query that adds a Person with -- their entire details. Dunno if it matters, just could be good/nice/cool. getPersonNewR :: Handler Html getPersonNewR = do mpid <- maybeAuthId if isJust mpid then redirect HomeR else do ((_result, widget), enctype) <- runFormPost formPersonNew defaultLayout $ do setTitle "Vervis > People > New" $(widgetFile "person-new") getPersonR :: Text -> Handler Html getPersonR ident = do people <- runDB $ select $ from $ \ (sharer, person) -> do where_ $ sharer ^. SharerIdent ==. val ident &&. sharer ^. SharerId ==. person ^. PersonIdent return person case people of [] -> notFound p:ps -> defaultLayout $ do let mperson = if null ps then Just p else Nothing setTitle $ text $ "Vervis > People > " <> ident $(widgetFile "person")