Проверка существования имени пользователя Snap auth

Поскольку у меня очень мало опыта работы с Haskell, мне действительно трудно понять Snap. В качестве вводного я пытаюсь сделать пример, который идет с проверкой существования пользователя. Может ли кто-нибудь сказать мне, как адаптировать функцию ниже, чтобы я начал? Это то, что я получаю сейчас. После проверки, существует ли имя пользователя, как мне продолжить?

------------------------------------------------------------------------------
-- | 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

person Jeremy Knees    schedule 20.12.2013    source источник


Ответы (1)


Попробуйте что-нибудь вроде этого. Не проверял это в ghc, но должен дать вам представление.

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

Вы не можете вернуть значение после использования redirect, потому что это направляет клиента на новую страницу. Поскольку createUser выдает ошибку DuplicateLogin, если пользователь уже существует, может быть лучше просто поймать эту ошибку, чем выполнять проверку, потому что между проверкой и вставкой все еще возможно, что то же имя пользователя было вставлено в другом месте. Маловероятно, но возможно. Кроме того, вы должны использовать redirect', потому что это означает постоянное перенаправление.

person DiegoNolan    schedule 20.12.2013