Yesod Hardcoded Auth с доступом к базе данных

Я реализовал систему аутентификации Yesod, как описано здесь, которая отлично работает, просматривая имя пользователя и пароли, жестко закодированные в списке.

Теперь я пытаюсь изменить это поведение для поиска имен пользователей и паролей в базе данных, изменив функции lookupUser и validPassword. Для начала, только lookupUser:

lookupUser :: Text -> Maybe Owner
lookupUser username = do 
    x <- runSqlite "db.sqlite3" . asSqlBackendReader $ selectFirst [ElementOwnerId ==. username] []
    case x of
        Nothing -> Nothing
        Just (Entity k v) -> Just $ Owner username (elementOwnerPw v)

asSqlBackendReader :: ReaderT SqlBackend m a -> ReaderT SqlBackend m a
asSqlBackendReader = id

Но я получаю следующую ошибку, которую я не понимаю:

    • Couldn't match type ‘Maybe’ with ‘IO’
        arising from a functional dependency between:
          constraint ‘MonadBaseControl IO Maybe’
            arising from a use of ‘runSqlite’
          instance ‘MonadBaseControl Maybe Maybe’ at <no location info>
    • In the first argument of ‘(.)’, namely ‘runSqlite "db.sqlite3"’
      In the expression: runSqlite "db.sqlite3" . asSqlBackendReader
      In a stmt of a 'do' block:
        x <- runSqlite "db.sqlite3" . asSqlBackendReader
               $ selectFirst [ElementOwnerId ==. username] []
    |
238 |     x <- runSqlite "db.sqlite3" . asSqlBackendReader $ selectFirst [ElementOwnerId ==. username] []
    |          ^^^^^^^^^^^^^^^^^^^^^^^^

Подписи runSqlite и selectFirst:

runSqlite :: MonadCatchIO m => SqliteReader m a -> Pool Connection -> m a

selectFirst :: (PersistEntity val, PersistEntityBackend val ~ b) => [Filter val] -> [SelectOpt val] -> b m (Maybe (Entity val))

0 ответов

Другие вопросы по тегам