packages feed

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