module IHP.LoginSupport.Helper.View
( currentUser
, currentUserId
, currentUserOrNothing
, currentUserIdOrNothing
, currentAdmin
, currentAdminOrNothing
, currentAdminIdOrNothing
)
where

import IHP.Prelude
import IHP.LoginSupport.Helper.Controller (CurrentUserRecord, CurrentAdminRecord)
import IHP.LoginSupport.Types (currentUserVaultKey, currentAdminVaultKey, currentUserIdVaultKey, currentAdminIdVaultKey, lookupAuthVault)
import qualified IHP.ModelSupport as ModelSupport
import qualified Network.Wai as Wai

currentUser :: (?request :: Wai.Request, user ~ CurrentUserRecord, Typeable user) => user
currentUser :: forall user.
(?request::Request, user ~ CurrentUserRecord, Typeable user) =>
user
currentUser = user -> Maybe user -> user
forall a. a -> Maybe a -> a
fromMaybe (Text -> user
forall a. Text -> a
error Text
"Application.Helper.View.currentUser: Not logged in") Maybe user
forall user.
(?request::Request, user ~ CurrentUserRecord, Typeable user) =>
Maybe user
currentUserOrNothing

currentUserId :: forall user userId. (?request :: Wai.Request, HasField "id" user userId, Typeable user, user ~ CurrentUserRecord) => userId
currentUserId :: forall user userId.
(?request::Request, HasField "id" user userId, Typeable user,
 user ~ CurrentUserRecord) =>
userId
currentUserId = (forall user.
(?request::Request, user ~ CurrentUserRecord, Typeable user) =>
user
currentUser @user).id

-- | Returns the current user or 'Nothing'.
--
-- Reads from the WAI request vault, populated by 'authMiddleware'.
currentUserOrNothing :: forall user. (?request :: Wai.Request, user ~ CurrentUserRecord, Typeable user) => Maybe user
currentUserOrNothing :: forall user.
(?request::Request, user ~ CurrentUserRecord, Typeable user) =>
Maybe user
currentUserOrNothing = Key (Maybe user) -> Request -> Maybe user
forall user. Key (Maybe user) -> Request -> Maybe user
lookupAuthVault Key (Maybe user)
Key (Maybe CurrentUserRecord)
currentUserVaultKey ?request::Request
Request
?request

-- | Returns the current user's UUID or 'Nothing' if not logged in.
--
-- This only requires 'userIdMiddleware', no database query is needed.
currentUserIdOrNothing :: (?request :: Wai.Request, ModelSupport.PrimaryKey (ModelSupport.GetTableName CurrentUserRecord) ~ UUID) => Maybe (ModelSupport.Id CurrentUserRecord)
currentUserIdOrNothing :: (?request::Request,
 PrimaryKey (GetTableName CurrentUserRecord) ~ UUID) =>
Maybe (Id CurrentUserRecord)
currentUserIdOrNothing = UUID -> Id CurrentUserRecord
PrimaryKey (GetTableName CurrentUserRecord) -> Id CurrentUserRecord
forall (table :: Symbol). PrimaryKey table -> Id' table
ModelSupport.Id (UUID -> Id CurrentUserRecord)
-> Maybe UUID -> Maybe (Id CurrentUserRecord)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Key (Maybe UUID) -> Request -> Maybe UUID
forall user. Key (Maybe user) -> Request -> Maybe user
lookupAuthVault Key (Maybe UUID)
currentUserIdVaultKey ?request::Request
Request
?request

currentAdmin :: (?request :: Wai.Request, admin ~ CurrentAdminRecord, Typeable admin) => admin
currentAdmin :: forall admin.
(?request::Request, admin ~ CurrentAdminRecord, Typeable admin) =>
admin
currentAdmin = admin -> Maybe admin -> admin
forall a. a -> Maybe a -> a
fromMaybe (Text -> admin
forall a. Text -> a
error Text
"Application.Helper.View.currentAdmin: Not logged in") Maybe admin
forall admin.
(?request::Request, admin ~ CurrentAdminRecord, Typeable admin) =>
Maybe admin
currentAdminOrNothing

-- | Returns the current admin or 'Nothing'.
--
-- Reads from the WAI request vault, populated by 'authMiddleware'.
currentAdminOrNothing :: forall admin. (?request :: Wai.Request, admin ~ CurrentAdminRecord, Typeable admin) => Maybe admin
currentAdminOrNothing :: forall admin.
(?request::Request, admin ~ CurrentAdminRecord, Typeable admin) =>
Maybe admin
currentAdminOrNothing = Key (Maybe admin) -> Request -> Maybe admin
forall user. Key (Maybe user) -> Request -> Maybe user
lookupAuthVault Key (Maybe admin)
Key (Maybe CurrentAdminRecord)
currentAdminVaultKey ?request::Request
Request
?request

-- | Returns the current admin's UUID or 'Nothing' if not logged in.
--
-- This only requires 'adminIdMiddleware', no database query is needed.
currentAdminIdOrNothing :: (?request :: Wai.Request, ModelSupport.PrimaryKey (ModelSupport.GetTableName CurrentAdminRecord) ~ UUID) => Maybe (ModelSupport.Id CurrentAdminRecord)
currentAdminIdOrNothing :: (?request::Request,
 PrimaryKey (GetTableName CurrentAdminRecord) ~ UUID) =>
Maybe (Id CurrentAdminRecord)
currentAdminIdOrNothing = UUID -> Id CurrentAdminRecord
PrimaryKey (GetTableName CurrentAdminRecord)
-> Id CurrentAdminRecord
forall (table :: Symbol). PrimaryKey table -> Id' table
ModelSupport.Id (UUID -> Id CurrentAdminRecord)
-> Maybe UUID -> Maybe (Id CurrentAdminRecord)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Key (Maybe UUID) -> Request -> Maybe UUID
forall user. Key (Maybe user) -> Request -> Maybe user
lookupAuthVault Key (Maybe UUID)
currentAdminIdVaultKey ?request::Request
Request
?request