ihp-1.4.0: IHP/AuthSupport/Lockable.hs
module IHP.AuthSupport.Lockable where
import IHP.Prelude
lock :: forall user. (?modelContext :: ModelContext, CanUpdate user, UpdateField "lockedAt" user user (Maybe UTCTime) (Maybe UTCTime)) => user -> IO user
lock user = do
now <- getCurrentTime
let currentLockedAt :: Maybe UTCTime = user.lockedAt
let user' :: user = updateField @"lockedAt" (Just now) user
updateRecord user'
lockDuration :: NominalDiffTime
lockDuration = let timeInSecs = 60 * 60 in secondsToNominalDiffTime timeInSecs
isLocked :: forall user. (HasField "lockedAt" user (Maybe UTCTime)) => user -> IO Bool
isLocked user = do
now <- getCurrentTime
pure (isLocked' now user)
isLocked' :: forall user. (HasField "lockedAt" user (Maybe UTCTime)) => UTCTime -> user -> Bool
isLocked' now user =
case user.lockedAt of
Just lockedAt ->
let diff = diffUTCTime now lockedAt
in diff < lockDuration
Nothing -> False