packages feed

users-persistent 0.5.0.1 → 0.5.0.2

raw patch · 2 files changed

+22/−9 lines, 2 filesdep +esqueletoPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: esqueleto

API changes (from Hackage documentation)

- Web.Users.Persistent.Definitions: instance Data.Aeson.Types.FromJSON.FromJSON (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.Login)
- Web.Users.Persistent.Definitions: instance Data.Aeson.Types.FromJSON.FromJSON (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.LoginToken)
- Web.Users.Persistent.Definitions: instance Data.Aeson.Types.ToJSON.ToJSON (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.Login)
- Web.Users.Persistent.Definitions: instance Data.Aeson.Types.ToJSON.ToJSON (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.LoginToken)
- Web.Users.Persistent.Definitions: instance Database.Persist.Class.PersistStore.ToBackendKey Database.Persist.Sql.Types.Internal.SqlBackend Web.Users.Persistent.Definitions.Login
- Web.Users.Persistent.Definitions: instance Database.Persist.Class.PersistStore.ToBackendKey Database.Persist.Sql.Types.Internal.SqlBackend Web.Users.Persistent.Definitions.LoginToken
- Web.Users.Persistent.Definitions: instance Web.Internal.HttpApiData.FromHttpApiData (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.Login)
- Web.Users.Persistent.Definitions: instance Web.Internal.HttpApiData.FromHttpApiData (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.LoginToken)
- Web.Users.Persistent.Definitions: instance Web.Internal.HttpApiData.ToHttpApiData (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.Login)
- Web.Users.Persistent.Definitions: instance Web.Internal.HttpApiData.ToHttpApiData (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.LoginToken)
+ Web.Users.Persistent.Definitions: instance Data.Aeson.Types.Class.FromJSON (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.Login)
+ Web.Users.Persistent.Definitions: instance Data.Aeson.Types.Class.FromJSON (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.LoginToken)
+ Web.Users.Persistent.Definitions: instance Data.Aeson.Types.Class.ToJSON (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.Login)
+ Web.Users.Persistent.Definitions: instance Data.Aeson.Types.Class.ToJSON (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.LoginToken)
+ Web.Users.Persistent.Definitions: instance Database.Persist.Class.PersistStore.ToBackendKey Database.Persist.Sql.Types.SqlBackend Web.Users.Persistent.Definitions.Login
+ Web.Users.Persistent.Definitions: instance Database.Persist.Class.PersistStore.ToBackendKey Database.Persist.Sql.Types.SqlBackend Web.Users.Persistent.Definitions.LoginToken
+ Web.Users.Persistent.Definitions: instance Web.HttpApiData.Internal.FromHttpApiData (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.Login)
+ Web.Users.Persistent.Definitions: instance Web.HttpApiData.Internal.FromHttpApiData (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.LoginToken)
+ Web.Users.Persistent.Definitions: instance Web.HttpApiData.Internal.ToHttpApiData (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.Login)
+ Web.Users.Persistent.Definitions: instance Web.HttpApiData.Internal.ToHttpApiData (Database.Persist.Class.PersistEntity.Key Web.Users.Persistent.Definitions.LoginToken)

Files

src/Web/Users/Persistent.hs view
@@ -23,6 +23,7 @@ import Data.Time.Clock import Database.Persist import Database.Persist.Sql+import qualified Database.Esqueleto as E import qualified Data.Text as T import qualified Data.UUID as UUID import qualified Data.UUID.V4 as UUID@@ -137,12 +138,12 @@                  let usr = mkUser now                  runPersistent conn $                    do mUsername <- selectFirst [LoginUsername ==. loginUsername usr] []-                      mEmailAddress <- selectFirst [LoginEmail ==. loginEmail usr] []-                      case (mUsername, mEmailAddress) of-                        (Just _, Just _)   -> return $ Left UsernameAndEmailAlreadyTaken-                        (Just _, _)        -> return $ Left UsernameAlreadyTaken-                        (Nothing, Just _)  -> return $ Left EmailAlreadyTaken-                        (Nothing, Nothing) -> Right <$> insert usr+                      email <- emailInUse (loginEmail usr)+                      case (mUsername, email) of+                        (Just _, True) -> return $ Left UsernameAndEmailAlreadyTaken+                        (Just _, _) -> return $ Left UsernameAlreadyTaken+                        (Nothing, True)  -> return $ Left EmailAlreadyTaken+                        (Nothing, False) -> Right <$> insert usr     updateUser conn userId updateFun =         do mUser <- getUserById conn userId            case mUser of@@ -155,8 +156,8 @@                          do counter <- liftIO $ runPersistent conn $ count [LoginUsername ==. u_name newUser]                             when (counter /= 0) $ throwError UsernameAlreadyExists                     when (u_email newUser /= u_email origUser) $-                         do counter <- liftIO $ runPersistent conn $ count [LoginEmail ==. u_email newUser]-                            when (counter /= 0) $ throwError EmailAlreadyExists+                         do emailUsed <- liftIO $ runPersistent conn $ emailInUse (u_email newUser)+                            when emailUsed $ throwError EmailAlreadyExists                     liftIO $ runPersistent conn $                        do update userId [ LoginUsername =. u_name newUser                                         , LoginEmail =. u_email newUser@@ -221,6 +222,17 @@                         updateUser conn userId $ \user -> user { u_password = password }                     deleteToken conn "password_reset" token                     return $ Right ()++emailInUse :: MonadIO m => T.Text -> ReaderT SqlBackend m Bool+emailInUse email =+    do emailMatches <-+           E.select $+           E.from $ \login ->+           do E.where_ $ E.lower_ (login E.^. LoginEmail)+                            E.==. E.lower_ (E.val email)+              E.limit 1+              return login+       return (not $ null emailMatches)  createToken :: Persistent -> String -> LoginId -> NominalDiffTime -> IO T.Text createToken conn tokenType userId timeToLive =
users-persistent.cabal view
@@ -1,5 +1,5 @@ name:                users-persistent-version:             0.5.0.1+version:             0.5.0.2 synopsis:            A persistent backend for the users package description:         This library is a backend driver using <http://hackage.haskell.org/package/persistent persistent> for                      <http://hackage.haskell.org/package/users the "users" library>.@@ -32,6 +32,7 @@   build-depends:       base >=4.6 && <5,                        persistent >=2.0,                        persistent-template >=2.1,+                       esqueleto >=2.1,                        users >=0.5,                        transformers >=0.4,                        mtl >=2.1,