Search code examples
haskellhaskell-snap-framework

Snap auth username exist check


Since I have very few Haskell experience I'm really having a hard time to wrap my head around Snap. As an introductory I'm trying to make the example that comes with the framework check for user existence. Can someone tell me how to adapt the function below to get me started? This is what I get now. After checking if the username exists how do I continue?

------------------------------------------------------------------------------
-- | Handle new user form submit
handleNewUser :: Handler App (AuthManager App) ()
handleNewUser = method GET handleForm <|> method POST handleFormSubmit
  where
    handleForm = render "new_user"
    handleFormSubmit = do result <- usernameExists "login"
                          result <- createUser "login" "password" >> redirect "/"
                          return result

Solution

  • Try something like this. Haven't checked it in ghc but should give you the idea.

    handleFormSubmit = do
        exists <- usernameExists "someUserName"
        case exists of
            True    -> writeBS "The username already exists"
            False   -> do
                createUser "someUserName" "password"
                redirect' "/" 301
    

    You can't return a value after using redirect because that routes the client to a new page. Since createUser throws a DuplicateLogin error if the user already exists it may be better to just catch that error than doing a check because it is still possible between the check and the insert the same username got inserted elsewhere. Unlikely but possible. Also, you should use redirect' because this signifies a permanent redirect.