polysemy-account 0.1.0.0 → 0.2.0.0
raw patch · 9 files changed
+41/−7 lines, 9 filesdep +servant-authdep ~chronosdep ~elocryptdep ~randomPVP ok
version bump matches the API change (PVP)
Dependencies added: servant-auth
Dependency ranges changed: chronos, elocrypt, random
API changes (from Hackage documentation)
- Polysemy.Account.Interpreter.AuthForAccount: match :: Eq i => AuthForAccount i -> Uid i (AccountAuth i) -> Maybe (Uid i (AccountAuth i))
+ Polysemy.Account: AccountAuth :: i -> AccountAuthDescription -> HashedPassword -> Maybe Datetime -> AccountAuth i
+ Polysemy.Account: [$sel:account:AccountAuth] :: AccountAuth i -> i
+ Polysemy.Account: [$sel:description:AccountAuth] :: AccountAuth i -> AccountAuthDescription
+ Polysemy.Account: [$sel:expiry:AccountAuth] :: AccountAuth i -> Maybe Datetime
+ Polysemy.Account: [$sel:password:AccountAuth] :: AccountAuth i -> HashedPassword
+ Polysemy.Account: data AccountAuth i
+ Polysemy.Account: type AccountQuery i p = [Query AccountByName (Maybe (Uid i (Account p))) !! DbError, Store i (Account p) !! DbError, AtomicState (PureStore i (Account p))]
+ Polysemy.Account: type AccountsConfigP = AccountsConfig [Privilege]
+ Polysemy.Account: type AccountsP i = Accounts i [Privilege]
+ Polysemy.Account: type AuthQuery i p = [Query (AuthForAccount i) [Uid i (AccountAuth i)] !! DbError, Store i (AccountAuth i) !! DbError, AtomicState (PureStore i (AccountAuth i))]
+ Polysemy.Account.Data.Authed: type Authed i p = Auth '[JWT] (AuthedAccount i p)
+ Polysemy.Account.Data.Authed: type AuthedP i = Authed i [Privilege]
+ Polysemy.Account.Interpreter.AccountByName: type AccountQuery i p = [Query AccountByName (Maybe (Uid i (Account p))) !! DbError, Store i (Account p) !! DbError, AtomicState (PureStore i (Account p))]
- Polysemy.Account: addPassword :: forall i_aNWd p_aNWe r_aOkA. Member (Accounts i_aNWd p_aNWe) r_aOkA => i_aNWd -> RawPassword -> Maybe Datetime -> Sem r_aOkA (Uid i_aNWd (AccountAuth i_aNWd))
+ Polysemy.Account: addPassword :: forall i_aPu5 p_aPu6 r_aPSs. Member (Accounts i_aPu5 p_aPu6) r_aPSs => i_aPu5 -> RawPassword -> Maybe Datetime -> Sem r_aPSs (Uid i_aPu5 (AccountAuth i_aPu5))
- Polysemy.Account: all :: forall i_aNWB p_aNWC r_aOkU. Member (Accounts i_aNWB p_aNWC) r_aOkU => Sem r_aOkU [Uid i_aNWB (Account p_aNWC)]
+ Polysemy.Account: all :: forall i_aPut p_aPuu r_aPSM. Member (Accounts i_aPut p_aPuu) r_aPSM => Sem r_aPSM [Uid i_aPut (Account p_aPuu)]
- Polysemy.Account: allAuths :: forall i_aNWE p_aNWF r_aOkV. Member (Accounts i_aNWE p_aNWF) r_aOkV => Sem r_aOkV [Uid i_aNWE (AccountAuth i_aNWE)]
+ Polysemy.Account: allAuths :: forall i_aPuw p_aPux r_aPSN. Member (Accounts i_aPuw p_aPux) r_aPSN => Sem r_aPSN [Uid i_aPuw (AccountAuth i_aPuw)]
- Polysemy.Account: authenticate :: forall i_aNW1 p_aNW2 r_aOkq. Member (Accounts i_aNW1 p_aNW2) r_aOkq => AccountName -> RawPassword -> Sem r_aOkq (Uid i_aNW1 (AccountAuth i_aNW1))
+ Polysemy.Account: authenticate :: forall i_aPtT p_aPtU r_aPSi. Member (Accounts i_aPtT p_aPtU) r_aPSi => AccountName -> RawPassword -> Sem r_aPSi (Uid i_aPtT (AccountAuth i_aPtT))
- Polysemy.Account: byId :: forall i_aNWj p_aNWk r_aOkH. Member (Accounts i_aNWj p_aNWk) r_aOkH => i_aNWj -> Sem r_aOkH (Uid i_aNWj (Account p_aNWk))
+ Polysemy.Account: byId :: forall i_aPub p_aPuc r_aPSz. Member (Accounts i_aPub p_aPuc) r_aPSz => i_aPub -> Sem r_aPSz (Uid i_aPub (Account p_aPuc))
- Polysemy.Account: byName :: forall i_aNWm p_aNWn r_aOkJ. Member (Accounts i_aNWm p_aNWn) r_aOkJ => AccountName -> Sem r_aOkJ (Uid i_aNWm (Account p_aNWn))
+ Polysemy.Account: byName :: forall i_aPue p_aPuf r_aPSB. Member (Accounts i_aPue p_aPuf) r_aPSB => AccountName -> Sem r_aPSB (Uid i_aPue (Account p_aPuf))
- Polysemy.Account: check :: forall r_aPlG. Member Password r_aPlG => RawPassword -> HashedPassword -> Sem r_aPlG Bool
+ Polysemy.Account: check :: forall r_aQTy. Member Password r_aQTy => RawPassword -> HashedPassword -> Sem r_aQTy Bool
- Polysemy.Account: create :: forall i_aNW7 p_aNW8 r_aOkw. Member (Accounts i_aNW7 p_aNW8) r_aOkw => AccountName -> Sem r_aOkw (Uid i_aNW7 (Account p_aNW8))
+ Polysemy.Account: create :: forall i_aPtZ p_aPu0 r_aPSo. Member (Accounts i_aPtZ p_aPu0) r_aPSo => AccountName -> Sem r_aPSo (Uid i_aPtZ (Account p_aPu0))
- Polysemy.Account: finalizeCreate :: forall i_aNWa p_aNWb r_aOky. Member (Accounts i_aNWa p_aNWb) r_aOky => i_aNWa -> Sem r_aOky (Uid i_aNWa (Account p_aNWb))
+ Polysemy.Account: finalizeCreate :: forall i_aPu2 p_aPu3 r_aPSq. Member (Accounts i_aPu2 p_aPu3) r_aPSq => i_aPu2 -> Sem r_aPSq (Uid i_aPu2 (Account p_aPu3))
- Polysemy.Account: generate :: forall r_aPlJ. Member Password r_aPlJ => Word -> Sem r_aPlJ GeneratedPassword
+ Polysemy.Account: generate :: forall r_aQTB. Member Password r_aQTB => Word -> Sem r_aQTB GeneratedPassword
- Polysemy.Account: generatePassword :: forall i_aNW4 p_aNW5 r_aOkt. Member (Accounts i_aNW4 p_aNW5) r_aOkt => i_aNW4 -> Maybe Datetime -> Sem r_aOkt GeneratedPassword
+ Polysemy.Account: generatePassword :: forall i_aPtW p_aPtX r_aPSl. Member (Accounts i_aPtW p_aPtX) r_aPSl => i_aPtW -> Maybe Datetime -> Sem r_aPSl GeneratedPassword
- Polysemy.Account: hash :: forall r_aPlE. Member Password r_aPlE => RawPassword -> Sem r_aPlE HashedPassword
+ Polysemy.Account: hash :: forall r_aQTw. Member Password r_aQTw => RawPassword -> Sem r_aQTw HashedPassword
- Polysemy.Account: privileges :: forall i_aNWv p_aNWw r_aOkP. Member (Accounts i_aNWv p_aNWw) r_aOkP => i_aNWv -> Sem r_aOkP p_aNWw
+ Polysemy.Account: privileges :: forall i_aPun p_aPuo r_aPSH. Member (Accounts i_aPun p_aPuo) r_aPSH => i_aPun -> Sem r_aPSH p_aPuo
- Polysemy.Account: setStatus :: forall i_aNWg p_aNWh r_aOkE. Member (Accounts i_aNWg p_aNWh) r_aOkE => i_aNWg -> AccountStatus -> Sem r_aOkE ()
+ Polysemy.Account: setStatus :: forall i_aPu8 p_aPu9 r_aPSw. Member (Accounts i_aPu8 p_aPu9) r_aPSw => i_aPu8 -> AccountStatus -> Sem r_aPSw ()
- Polysemy.Account: update :: forall i_aNWs p_aNWt r_aOkN. Member (Accounts i_aNWs p_aNWt) r_aOkN => Uid i_aNWs (Account p_aNWt) -> Sem r_aOkN ()
+ Polysemy.Account: update :: forall i_aPuk p_aPul r_aPSF. Member (Accounts i_aPuk p_aPul) r_aPSF => Uid i_aPuk (Account p_aPul) -> Sem r_aPSF ()
- Polysemy.Account: updatePrivileges :: forall i_aNWy p_aNWz r_aOkR. Member (Accounts i_aNWy p_aNWz) r_aOkR => i_aNWy -> (p_aNWz -> p_aNWz) -> Sem r_aOkR ()
+ Polysemy.Account: updatePrivileges :: forall i_aPuq p_aPur r_aPSJ. Member (Accounts i_aPuq p_aPur) r_aPSJ => i_aPuq -> (p_aPur -> p_aPur) -> Sem r_aPSJ ()
- Polysemy.Account.Effect.Accounts: addPassword :: forall i_aNWd p_aNWe r_aOkA. Member (Accounts i_aNWd p_aNWe) r_aOkA => i_aNWd -> RawPassword -> Maybe Datetime -> Sem r_aOkA (Uid i_aNWd (AccountAuth i_aNWd))
+ Polysemy.Account.Effect.Accounts: addPassword :: forall i_aPu5 p_aPu6 r_aPSs. Member (Accounts i_aPu5 p_aPu6) r_aPSs => i_aPu5 -> RawPassword -> Maybe Datetime -> Sem r_aPSs (Uid i_aPu5 (AccountAuth i_aPu5))
- Polysemy.Account.Effect.Accounts: all :: forall i_aNWB p_aNWC r_aOkU. Member (Accounts i_aNWB p_aNWC) r_aOkU => Sem r_aOkU [Uid i_aNWB (Account p_aNWC)]
+ Polysemy.Account.Effect.Accounts: all :: forall i_aPut p_aPuu r_aPSM. Member (Accounts i_aPut p_aPuu) r_aPSM => Sem r_aPSM [Uid i_aPut (Account p_aPuu)]
- Polysemy.Account.Effect.Accounts: allAuths :: forall i_aNWE p_aNWF r_aOkV. Member (Accounts i_aNWE p_aNWF) r_aOkV => Sem r_aOkV [Uid i_aNWE (AccountAuth i_aNWE)]
+ Polysemy.Account.Effect.Accounts: allAuths :: forall i_aPuw p_aPux r_aPSN. Member (Accounts i_aPuw p_aPux) r_aPSN => Sem r_aPSN [Uid i_aPuw (AccountAuth i_aPuw)]
- Polysemy.Account.Effect.Accounts: authed :: forall i_aNWp p_aNWq r_aOkL. Member (Accounts i_aNWp p_aNWq) r_aOkL => i_aNWp -> Sem r_aOkL (AuthedAccount i_aNWp p_aNWq)
+ Polysemy.Account.Effect.Accounts: authed :: forall i_aPuh p_aPui r_aPSD. Member (Accounts i_aPuh p_aPui) r_aPSD => i_aPuh -> Sem r_aPSD (AuthedAccount i_aPuh p_aPui)
- Polysemy.Account.Effect.Accounts: authenticate :: forall i_aNW1 p_aNW2 r_aOkq. Member (Accounts i_aNW1 p_aNW2) r_aOkq => AccountName -> RawPassword -> Sem r_aOkq (Uid i_aNW1 (AccountAuth i_aNW1))
+ Polysemy.Account.Effect.Accounts: authenticate :: forall i_aPtT p_aPtU r_aPSi. Member (Accounts i_aPtT p_aPtU) r_aPSi => AccountName -> RawPassword -> Sem r_aPSi (Uid i_aPtT (AccountAuth i_aPtT))
- Polysemy.Account.Effect.Accounts: byId :: forall i_aNWj p_aNWk r_aOkH. Member (Accounts i_aNWj p_aNWk) r_aOkH => i_aNWj -> Sem r_aOkH (Uid i_aNWj (Account p_aNWk))
+ Polysemy.Account.Effect.Accounts: byId :: forall i_aPub p_aPuc r_aPSz. Member (Accounts i_aPub p_aPuc) r_aPSz => i_aPub -> Sem r_aPSz (Uid i_aPub (Account p_aPuc))
- Polysemy.Account.Effect.Accounts: byName :: forall i_aNWm p_aNWn r_aOkJ. Member (Accounts i_aNWm p_aNWn) r_aOkJ => AccountName -> Sem r_aOkJ (Uid i_aNWm (Account p_aNWn))
+ Polysemy.Account.Effect.Accounts: byName :: forall i_aPue p_aPuf r_aPSB. Member (Accounts i_aPue p_aPuf) r_aPSB => AccountName -> Sem r_aPSB (Uid i_aPue (Account p_aPuf))
- Polysemy.Account.Effect.Accounts: create :: forall i_aNW7 p_aNW8 r_aOkw. Member (Accounts i_aNW7 p_aNW8) r_aOkw => AccountName -> Sem r_aOkw (Uid i_aNW7 (Account p_aNW8))
+ Polysemy.Account.Effect.Accounts: create :: forall i_aPtZ p_aPu0 r_aPSo. Member (Accounts i_aPtZ p_aPu0) r_aPSo => AccountName -> Sem r_aPSo (Uid i_aPtZ (Account p_aPu0))
- Polysemy.Account.Effect.Accounts: finalizeCreate :: forall i_aNWa p_aNWb r_aOky. Member (Accounts i_aNWa p_aNWb) r_aOky => i_aNWa -> Sem r_aOky (Uid i_aNWa (Account p_aNWb))
+ Polysemy.Account.Effect.Accounts: finalizeCreate :: forall i_aPu2 p_aPu3 r_aPSq. Member (Accounts i_aPu2 p_aPu3) r_aPSq => i_aPu2 -> Sem r_aPSq (Uid i_aPu2 (Account p_aPu3))
- Polysemy.Account.Effect.Accounts: generatePassword :: forall i_aNW4 p_aNW5 r_aOkt. Member (Accounts i_aNW4 p_aNW5) r_aOkt => i_aNW4 -> Maybe Datetime -> Sem r_aOkt GeneratedPassword
+ Polysemy.Account.Effect.Accounts: generatePassword :: forall i_aPtW p_aPtX r_aPSl. Member (Accounts i_aPtW p_aPtX) r_aPSl => i_aPtW -> Maybe Datetime -> Sem r_aPSl GeneratedPassword
- Polysemy.Account.Effect.Accounts: privileges :: forall i_aNWv p_aNWw r_aOkP. Member (Accounts i_aNWv p_aNWw) r_aOkP => i_aNWv -> Sem r_aOkP p_aNWw
+ Polysemy.Account.Effect.Accounts: privileges :: forall i_aPun p_aPuo r_aPSH. Member (Accounts i_aPun p_aPuo) r_aPSH => i_aPun -> Sem r_aPSH p_aPuo
- Polysemy.Account.Effect.Accounts: setStatus :: forall i_aNWg p_aNWh r_aOkE. Member (Accounts i_aNWg p_aNWh) r_aOkE => i_aNWg -> AccountStatus -> Sem r_aOkE ()
+ Polysemy.Account.Effect.Accounts: setStatus :: forall i_aPu8 p_aPu9 r_aPSw. Member (Accounts i_aPu8 p_aPu9) r_aPSw => i_aPu8 -> AccountStatus -> Sem r_aPSw ()
- Polysemy.Account.Effect.Accounts: update :: forall i_aNWs p_aNWt r_aOkN. Member (Accounts i_aNWs p_aNWt) r_aOkN => Uid i_aNWs (Account p_aNWt) -> Sem r_aOkN ()
+ Polysemy.Account.Effect.Accounts: update :: forall i_aPuk p_aPul r_aPSF. Member (Accounts i_aPuk p_aPul) r_aPSF => Uid i_aPuk (Account p_aPul) -> Sem r_aPSF ()
- Polysemy.Account.Effect.Accounts: updatePrivileges :: forall i_aNWy p_aNWz r_aOkR. Member (Accounts i_aNWy p_aNWz) r_aOkR => i_aNWy -> (p_aNWz -> p_aNWz) -> Sem r_aOkR ()
+ Polysemy.Account.Effect.Accounts: updatePrivileges :: forall i_aPuq p_aPur r_aPSJ. Member (Accounts i_aPuq p_aPur) r_aPSJ => i_aPuq -> (p_aPur -> p_aPur) -> Sem r_aPSJ ()
- Polysemy.Account.Effect.Password: check :: forall r_aPlG. Member Password r_aPlG => RawPassword -> HashedPassword -> Sem r_aPlG Bool
+ Polysemy.Account.Effect.Password: check :: forall r_aQTy. Member Password r_aQTy => RawPassword -> HashedPassword -> Sem r_aQTy Bool
- Polysemy.Account.Effect.Password: generate :: forall r_aPlJ. Member Password r_aPlJ => Word -> Sem r_aPlJ GeneratedPassword
+ Polysemy.Account.Effect.Password: generate :: forall r_aQTB. Member Password r_aQTB => Word -> Sem r_aQTB GeneratedPassword
- Polysemy.Account.Effect.Password: hash :: forall r_aPlE. Member Password r_aPlE => RawPassword -> Sem r_aPlE HashedPassword
+ Polysemy.Account.Effect.Password: hash :: forall r_aQTw. Member Password r_aQTw => RawPassword -> Sem r_aQTw HashedPassword
Files
- lib/Polysemy/Account.hs +10/−1
- lib/Polysemy/Account/Data/Account.hs +2/−0
- lib/Polysemy/Account/Data/AccountAuth.hs +2/−0
- lib/Polysemy/Account/Data/Authed.hs +13/−0
- lib/Polysemy/Account/Data/AuthedAccount.hs +2/−0
- lib/Polysemy/Account/Interpreter/AccountByName.hs +1/−0
- lib/Polysemy/Account/Interpreter/Accounts.hs +2/−2
- lib/Polysemy/Account/Interpreter/AuthForAccount.hs +3/−0
- polysemy-account.cabal +6/−4
lib/Polysemy/Account.hs view
@@ -2,6 +2,7 @@ module Polysemy.Account ( -- * Effects Accounts,+ AccountsP, authenticate, generatePassword, create,@@ -36,7 +37,9 @@ -- * Data types Account (..), AuthedAccount (..),+ AccountAuth (..), AccountsConfig (..),+ AccountsConfigP, AccountsError (..), AccountsClientError (..), AccountCredentials (..),@@ -50,16 +53,19 @@ AuthedAccountP, AuthToken (..), Port (Port),+ AuthQuery,+ AccountQuery, ) where import Prelude hiding (all) import Polysemy.Account.Accounts (login, register, unlockAccountName) import Polysemy.Account.Data.Account (Account (..), AccountP)+import Polysemy.Account.Data.AccountAuth (AccountAuth (..)) import Polysemy.Account.Data.AccountCredentials (AccountCredentials (..)) import Polysemy.Account.Data.AccountName (AccountName (..)) import Polysemy.Account.Data.AccountStatus (AccountStatus (..))-import Polysemy.Account.Data.AccountsConfig (AccountsConfig (..))+import Polysemy.Account.Data.AccountsConfig (AccountsConfig (..), AccountsConfigP) import Polysemy.Account.Data.AccountsError (AccountsClientError (..), AccountsError (..)) import Polysemy.Account.Data.AuthToken (AuthToken (..)) import Polysemy.Account.Data.AuthedAccount (AuthedAccount (..), AuthedAccountP)@@ -69,6 +75,7 @@ import Polysemy.Account.Data.RawPassword (RawPassword (..), rawPassword) import Polysemy.Account.Effect.Accounts ( Accounts,+ AccountsP, addPassword, all, allAuths,@@ -84,5 +91,7 @@ updatePrivileges, ) import Polysemy.Account.Effect.Password (Password, check, generate, hash)+import Polysemy.Account.Interpreter.AccountByName (AccountQuery) import Polysemy.Account.Interpreter.Accounts (interpretAccounts, interpretAccountsState)+import Polysemy.Account.Interpreter.AuthForAccount (AuthQuery) import Polysemy.Account.Interpreter.Password (interpretPassword, interpretPasswordId)
lib/Polysemy/Account/Data/Account.hs view
@@ -1,3 +1,5 @@+{-# language NoFieldSelectors #-}+ -- | Description: Account data type module Polysemy.Account.Data.Account where
lib/Polysemy/Account/Data/AccountAuth.hs view
@@ -1,3 +1,5 @@+{-# language NoFieldSelectors #-}+ -- | Description: Account auth data type module Polysemy.Account.Data.AccountAuth where
+ lib/Polysemy/Account/Data/Authed.hs view
@@ -0,0 +1,13 @@+-- | Description: Servant API markers for JWT auth with 'AuthedAccount'+module Polysemy.Account.Data.Authed where++import Servant.Auth (Auth, JWT)++import Polysemy.Account.Data.AuthedAccount (AuthedAccount)+import Polysemy.Account.Data.Privilege (Privilege)++-- | A Servant API marker for JWT auth with 'AuthedAccount'+type Authed i p = Auth '[JWT] (AuthedAccount i p)++-- | Convenience alias for using the default privilege type with 'Authed'.+type AuthedP i = Authed i [Privilege]
lib/Polysemy/Account/Data/AuthedAccount.hs view
@@ -1,3 +1,5 @@+{-# language NoFieldSelectors #-}+ -- | Description: Authed account data type module Polysemy.Account.Data.AuthedAccount where
lib/Polysemy/Account/Interpreter/AccountByName.hs view
@@ -17,6 +17,7 @@ | name == accountName = Just a | otherwise = Nothing +-- | The effects handled by 'interpretAccountByNameState'. type AccountQuery i p = [ Query AccountByName (Maybe (Uid i (Account p))) !! DbError,
lib/Polysemy/Account/Interpreter/Accounts.hs view
@@ -147,8 +147,8 @@ coerce pw <$ addPassword "auth token" accountId (UnsafeRawPassword raw) expiry -- | Fail if the account name is already present in the store.--- If the account status is `Creating', however, a previous attempt has failed critically and the account can be--- overwritten.+-- If the account status is `AccountStatus.Creating', however, a previous attempt has failed critically and the account+-- can be overwritten. deletePreviousFailure :: Members [Store i (Account p), Stop AccountsError] r => Uid i (Account p) ->
lib/Polysemy/Account/Interpreter/AuthForAccount.hs view
@@ -1,3 +1,5 @@+{-# options_haddock prune #-}+ -- | Description: Interpreter for the query for auth info by account ID module Polysemy.Account.Interpreter.AuthForAccount where @@ -16,6 +18,7 @@ | queryId == accountId = Just a | otherwise = Nothing +-- | The effects handled by 'interpretAuthForAccountState'.. type AuthQuery i p = [ Query (AuthForAccount i) [Uid i (AccountAuth i)] !! DbError,
polysemy-account.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: polysemy-account-version: 0.1.0.0+version: 0.2.0.0 synopsis: Account management with Servant and Polysemy description: See https://hackage.haskell.org/package/polysemy-account/docs/Polysemy-Account.html category: Web@@ -32,6 +32,7 @@ Polysemy.Account.Data.AccountsConfig Polysemy.Account.Data.AccountsError Polysemy.Account.Data.AccountStatus+ Polysemy.Account.Data.Authed Polysemy.Account.Data.AuthedAccount Polysemy.Account.Data.AuthForAccount Polysemy.Account.Data.AuthToken@@ -116,14 +117,15 @@ ghc-options: -Wall -Wredundant-constraints -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Widentities -Wunused-packages -fplugin=Polysemy.Plugin build-depends: base >=4.12 && <5- , chronos- , elocrypt+ , chronos ==1.1.*+ , elocrypt ==2.1.* , password ==3.0.* , polysemy , polysemy-db , polysemy-plugin , prelate >=0.5- , random+ , random ==1.2.*+ , servant-auth ==0.4.* , sqel mixins: base hiding (Prelude)