espial-0.0.16: src/Handler/AccountSettings.hs
module Handler.AccountSettings where
import Import
import qualified ClassyPrelude.Yesod as CP
getAccountSettingsR :: Handler Html
getAccountSettingsR = do
(_, user) <- requireAuthPair
let accountSettingsEl = "accountSettings" :: Text
let accountSettings = toAccountSettingsForm user
defaultLayout do
$(widgetFile "user-settings")
toWidgetBody [julius|
app.userR = "@{UserR (UserNameP $ userName user)}";
app.dat.accountSettings = #{ toJSON accountSettings } || [];
|]
toWidget [julius|
PS.renderAccountSettings('##{rawJS accountSettingsEl}')(app.dat.accountSettings)();
|]
postEditAccountSettingsR :: Handler ()
postEditAccountSettingsR = do
userId <- requireAuthId
accountSettingsForm <- requireCheckJsonBody
runDB (updateUserFromAccountSettingsForm userId accountSettingsForm)
getChangePasswordR :: Handler Html
getChangePasswordR = do
void requireAuthId
req <- getRequest
defaultLayout $
$(widgetFile "change-password")
postChangePasswordR :: Handler Html
postChangePasswordR = do
(userId, user) <- requireAuthPair
runInputPostResult ((,) <$> ireq textField "oldpassword" <*> ireq textField "newpassword") >>= \case
FormSuccess (old, new) -> do
runDB (authenticatePassword (userName user) old) >>= \case
Nothing -> setMessage "Incorrect Old Password"
Just _ -> validateNewPassword new >>= \case
Just newValid -> do
newHash <- liftIO (hashPassword newValid)
void $ runDB (update userId [UserPasswordHash CP.=. newHash])
setMessage "Password Changed Successfully"
_ -> pure ()
_ -> setMessage "Missing Required Fields"
redirect ChangePasswordR
validateNewPassword :: Text -> Handler (Maybe Text)
validateNewPassword = \case
new | length new < 6 -> do
setMessage "Password must be at least 6 characters long"
pure Nothing
new -> pure $ Just new