-- | Description: Servant Handlers for the account API
module Polysemy.Account.Api.Server.Account where

import Servant (ServerError, ServerT, (:<|>) ((:<|>)))
import Servant.API (NoContent (NoContent))
import Sqel (Uid (Uid))

import Polysemy.Account.Api.Effect.Authorize (Authorize)
import Polysemy.Account.Api.Routes (AccountApi)
import Polysemy.Account.Api.Server.AuthEndpoint (AuthEndpointParam, adminOnly1_, adminOnly2_, adminOnly_)
import Polysemy.Account.Api.Server.Error (accountsError)
import Polysemy.Account.Data.Account (Account)
import Polysemy.Account.Data.AccountsError (AccountsError)
import qualified Polysemy.Account.Effect.Accounts as Accounts
import Polysemy.Account.Effect.Accounts (Accounts)

-- | GET an 'Account' from storage.
getAccount ::
  Members [Accounts i p !! AccountsError, Log, Stop ServerError] r =>
  i ->
  Sem r (Uid i (Account p))
getAccount :: forall i p (r :: EffectRow).
Members
  '[Accounts i p !! AccountsError, Log, Stop ServerError] r =>
i -> Sem r (Uid i (Account p))
getAccount i
i =
  forall i p (r :: EffectRow).
Member (Accounts i p) r =>
i -> Sem r (Uid i (Account p))
Accounts.byId i
i forall err (eff :: (* -> *) -> * -> *) (r :: EffectRow) a.
Member (Resumable err eff) r =>
Sem (eff : r) a -> (err -> Sem r a) -> Sem r a
!! forall (r :: EffectRow) a.
Members '[Log, Stop ServerError] r =>
AccountsError -> Sem r a
accountsError

-- | GET all 'Accounts' from storage.
getAccounts ::
  Members [Accounts i p !! AccountsError, Log, Stop ServerError] r =>
  Sem r [Uid i (Account p)]
getAccounts :: forall i p (r :: EffectRow).
Members
  '[Accounts i p !! AccountsError, Log, Stop ServerError] r =>
Sem r [Uid i (Account p)]
getAccounts =
  forall i p (r :: EffectRow).
Member (Accounts i p) r =>
Sem r [Uid i (Account p)]
Accounts.all forall err (eff :: (* -> *) -> * -> *) (r :: EffectRow) a.
Member (Resumable err eff) r =>
Sem (eff : r) a -> (err -> Sem r a) -> Sem r a
!! forall (r :: EffectRow) a.
Members '[Log, Stop ServerError] r =>
AccountsError -> Sem r a
accountsError

-- | PUT an 'Account' into storage, failing for nonexistent accounts.
putAccount ::
  Members [Accounts i p !! AccountsError, Log, Stop ServerError] r =>
  Uid i (Account p) ->
  Sem r NoContent
putAccount :: forall i p (r :: EffectRow).
Members
  '[Accounts i p !! AccountsError, Log, Stop ServerError] r =>
Uid i (Account p) -> Sem r NoContent
putAccount Uid i (Account p)
account =
  NoContent
NoContent forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall i p (r :: EffectRow).
Member (Accounts i p) r =>
Uid i (Account p) -> Sem r ()
Accounts.update Uid i (Account p)
account forall err (eff :: (* -> *) -> * -> *) (r :: EffectRow) a.
Member (Resumable err eff) r =>
Sem (eff : r) a -> (err -> Sem r a) -> Sem r a
!! forall (r :: EffectRow) a.
Members '[Log, Stop ServerError] r =>
AccountsError -> Sem r a
accountsError

-- | PUT an 'Account' into storage, failing for nonexistent accounts.
putAccount' ::
  Members [Accounts i p !! AccountsError, Log, Stop ServerError] r =>
  i ->
  Account p ->
  Sem r NoContent
putAccount' :: forall i p (r :: EffectRow).
Members
  '[Accounts i p !! AccountsError, Log, Stop ServerError] r =>
i -> Account p -> Sem r NoContent
putAccount' i
i Account p
account =
  NoContent
NoContent forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall i p (r :: EffectRow).
Member (Accounts i p) r =>
Uid i (Account p) -> Sem r ()
Accounts.update (forall i a. i -> a -> Uid i a
Uid i
i Account p
account) forall err (eff :: (* -> *) -> * -> *) (r :: EffectRow) a.
Member (Resumable err eff) r =>
Sem (eff : r) a -> (err -> Sem r a) -> Sem r a
!! forall (r :: EffectRow) a.
Members '[Log, Stop ServerError] r =>
AccountsError -> Sem r a
accountsError

-- | Handlers for 'AccountApi'.
accountServer ::
   i param p r .
  Show i =>
  Show p =>
  AuthEndpointParam param =>
  Members [Authorize i param p, Accounts i p !! AccountsError, Log, Stop ServerError] r =>
  ServerT (AccountApi i p) (Sem r)
accountServer :: forall i param p (r :: EffectRow).
(Show i, Show p, AuthEndpointParam param,
 Members
   '[Authorize i param p, Accounts i p !! AccountsError, Log,
     Stop ServerError]
   r) =>
ServerT (AccountApi i p) (Sem r)
accountServer =
  forall i param p (r :: EffectRow) a b.
(Show (AuthedAccount i p), AuthEndpoint i param p r) =>
(a -> Sem r b) -> AuthResult (AuthedAccount i p) -> a -> Sem r b
adminOnly1_ forall i p (r :: EffectRow).
Members
  '[Accounts i p !! AccountsError, Log, Stop ServerError] r =>
i -> Sem r (Uid i (Account p))
getAccount forall a b. a -> b -> a :<|> b
:<|> forall i param p (r :: EffectRow) a.
(Show (AuthedAccount i p), AuthEndpoint i param p r) =>
Sem r a -> AuthResult (AuthedAccount i p) -> Sem r a
adminOnly_ forall i p (r :: EffectRow).
Members
  '[Accounts i p !! AccountsError, Log, Stop ServerError] r =>
Sem r [Uid i (Account p)]
getAccounts forall a b. a -> b -> a :<|> b
:<|> forall i param p (r :: EffectRow) a b.
(Show (AuthedAccount i p), AuthEndpoint i param p r) =>
(a -> Sem r b) -> AuthResult (AuthedAccount i p) -> a -> Sem r b
adminOnly1_ forall i p (r :: EffectRow).
Members
  '[Accounts i p !! AccountsError, Log, Stop ServerError] r =>
Uid i (Account p) -> Sem r NoContent
putAccount forall a b. a -> b -> a :<|> b
:<|> forall i param p (r :: EffectRow) a b c.
(Show (AuthedAccount i p), AuthEndpoint i param p r) =>
(a -> b -> Sem r c)
-> AuthResult (AuthedAccount i p) -> a -> b -> Sem r c
adminOnly2_ forall i p (r :: EffectRow).
Members
  '[Accounts i p !! AccountsError, Log, Stop ServerError] r =>
i -> Account p -> Sem r NoContent
putAccount'