{-# LANGUAGE NoFieldSelectors #-}

module Arbiter.Core.Job.Types.Internal
  ( JobRecord (..)
  , primaryKey
  , payload
  , queueName
  , groupKey
  , insertedAt
  , updatedAt
  , attempts
  , lastError
  , priority
  , lastAttemptedAt
  , notVisibleUntil
  , dedupKey
  , maxAttempts
  , parentId
  , parentState
  , traceContext
  , suspended
  , claimedBy
  , claimSeq
  , archiveFor
  , payloadKeys
  ) where

import Data.Aeson (Value)
import Data.Int (Int32, Int64)
import Data.Text (Text)
import Data.Time (UTCTime)
import Data.UUID.Types (UUID)

import Arbiter.Core.Job.Dedup (DedupKey)
import Arbiter.Core.Job.TraceContext (TraceContext)

-- | Internal representation shared by writable and stored jobs.
data JobRecord payload key q insertedAt adm = Job
  { forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> key
primaryKey :: key
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> payload
payload :: payload
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> q
queueName :: q
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Text
groupKey :: Maybe Text
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> insertedAt
insertedAt :: insertedAt
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe UTCTime
updatedAt :: Maybe UTCTime
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Int32
attempts :: Int32
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Text
lastError :: Maybe Text
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Int32
priority :: Int32
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe UTCTime
lastAttemptedAt :: Maybe UTCTime
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe UTCTime
notVisibleUntil :: Maybe UTCTime
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe DedupKey
dedupKey :: Maybe DedupKey
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Int32
maxAttempts :: Maybe Int32
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Int64
parentId :: Maybe Int64
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Value
parentState :: Maybe Value
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe TraceContext
traceContext :: Maybe TraceContext
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Bool
suspended :: Bool
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe UUID
claimedBy :: Maybe UUID
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Int64
claimSeq :: Int64
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Int32
archiveFor :: Maybe Int32
  , forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> adm
payloadKeys :: adm
  }
  deriving stock (JobRecord payload key q insertedAt adm
-> JobRecord payload key q insertedAt adm -> Bool
(JobRecord payload key q insertedAt adm
 -> JobRecord payload key q insertedAt adm -> Bool)
-> (JobRecord payload key q insertedAt adm
    -> JobRecord payload key q insertedAt adm -> Bool)
-> Eq (JobRecord payload key q insertedAt adm)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall payload key q insertedAt adm.
(Eq key, Eq payload, Eq q, Eq insertedAt, Eq adm) =>
JobRecord payload key q insertedAt adm
-> JobRecord payload key q insertedAt adm -> Bool
$c== :: forall payload key q insertedAt adm.
(Eq key, Eq payload, Eq q, Eq insertedAt, Eq adm) =>
JobRecord payload key q insertedAt adm
-> JobRecord payload key q insertedAt adm -> Bool
== :: JobRecord payload key q insertedAt adm
-> JobRecord payload key q insertedAt adm -> Bool
$c/= :: forall payload key q insertedAt adm.
(Eq key, Eq payload, Eq q, Eq insertedAt, Eq adm) =>
JobRecord payload key q insertedAt adm
-> JobRecord payload key q insertedAt adm -> Bool
/= :: JobRecord payload key q insertedAt adm
-> JobRecord payload key q insertedAt adm -> Bool
Eq, Int -> JobRecord payload key q insertedAt adm -> ShowS
[JobRecord payload key q insertedAt adm] -> ShowS
JobRecord payload key q insertedAt adm -> String
(Int -> JobRecord payload key q insertedAt adm -> ShowS)
-> (JobRecord payload key q insertedAt adm -> String)
-> ([JobRecord payload key q insertedAt adm] -> ShowS)
-> Show (JobRecord payload key q insertedAt adm)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall payload key q insertedAt adm.
(Show key, Show payload, Show q, Show insertedAt, Show adm) =>
Int -> JobRecord payload key q insertedAt adm -> ShowS
forall payload key q insertedAt adm.
(Show key, Show payload, Show q, Show insertedAt, Show adm) =>
[JobRecord payload key q insertedAt adm] -> ShowS
forall payload key q insertedAt adm.
(Show key, Show payload, Show q, Show insertedAt, Show adm) =>
JobRecord payload key q insertedAt adm -> String
$cshowsPrec :: forall payload key q insertedAt adm.
(Show key, Show payload, Show q, Show insertedAt, Show adm) =>
Int -> JobRecord payload key q insertedAt adm -> ShowS
showsPrec :: Int -> JobRecord payload key q insertedAt adm -> ShowS
$cshow :: forall payload key q insertedAt adm.
(Show key, Show payload, Show q, Show insertedAt, Show adm) =>
JobRecord payload key q insertedAt adm -> String
show :: JobRecord payload key q insertedAt adm -> String
$cshowList :: forall payload key q insertedAt adm.
(Show key, Show payload, Show q, Show insertedAt, Show adm) =>
[JobRecord payload key q insertedAt adm] -> ShowS
showList :: [JobRecord payload key q insertedAt adm] -> ShowS
Show)

-- | Database-assigned identifier for a stored job.
primaryKey :: JobRecord payload key q insertedAt adm -> key
primaryKey :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> key
primaryKey Job {primaryKey :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> key
primaryKey = key
value} = key
value

-- | User-defined payload stored as JSONB.
payload :: JobRecord payload key q insertedAt adm -> payload
payload :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> payload
payload Job {payload :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> payload
payload = payload
value} = payload
value

-- | Queue containing a stored job.
queueName :: JobRecord payload key q insertedAt adm -> q
queueName :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> q
queueName Job {queueName :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> q
queueName = q
value} = q
value

-- | Serial-processing group, or 'Nothing' for an ungrouped job.
groupKey :: JobRecord payload key q insertedAt adm -> Maybe Text
groupKey :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Text
groupKey Job {groupKey :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Text
groupKey = Maybe Text
value} = Maybe Text
value

-- | Time at which the job was inserted.
insertedAt :: JobRecord payload key q insertedAt adm -> insertedAt
insertedAt :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> insertedAt
insertedAt Job {insertedAt :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> insertedAt
insertedAt = insertedAt
value} = insertedAt
value

-- | Time at which the job was last updated.
updatedAt :: JobRecord payload Int64 q insertedAt adm -> Maybe UTCTime
updatedAt :: forall payload q insertedAt adm.
JobRecord payload Int64 q insertedAt adm -> Maybe UTCTime
updatedAt Job {updatedAt :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe UTCTime
updatedAt = Maybe UTCTime
value} = Maybe UTCTime
value

-- | Number of attempts made so far.
attempts :: JobRecord payload Int64 q insertedAt adm -> Int32
attempts :: forall payload q insertedAt adm.
JobRecord payload Int64 q insertedAt adm -> Int32
attempts Job {attempts :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Int32
attempts = Int32
value} = Int32
value

-- | Error message from the last failed attempt.
lastError :: JobRecord payload Int64 q insertedAt adm -> Maybe Text
lastError :: forall payload q insertedAt adm.
JobRecord payload Int64 q insertedAt adm -> Maybe Text
lastError Job {lastError :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Text
lastError = Maybe Text
value} = Maybe Text
value

-- | Claim priority. Lower numbers have higher priority.
priority :: JobRecord payload key q insertedAt adm -> Int32
priority :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Int32
priority Job {priority :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Int32
priority = Int32
value} = Int32
value

-- | Time at which a worker last claimed the job.
lastAttemptedAt :: JobRecord payload Int64 q insertedAt adm -> Maybe UTCTime
lastAttemptedAt :: forall payload q insertedAt adm.
JobRecord payload Int64 q insertedAt adm -> Maybe UTCTime
lastAttemptedAt Job {lastAttemptedAt :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe UTCTime
lastAttemptedAt = Maybe UTCTime
value} = Maybe UTCTime
value

-- | Earliest time at which the job can be claimed.
notVisibleUntil :: JobRecord payload key q insertedAt adm -> Maybe UTCTime
notVisibleUntil :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe UTCTime
notVisibleUntil Job {notVisibleUntil :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe UTCTime
notVisibleUntil = Maybe UTCTime
value} = Maybe UTCTime
value

-- | Deduplication strategy and key.
dedupKey :: JobRecord payload key q insertedAt adm -> Maybe DedupKey
dedupKey :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe DedupKey
dedupKey Job {dedupKey :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe DedupKey
dedupKey = Maybe DedupKey
value} = Maybe DedupKey
value

-- | Attempt limit before the job moves to the DLQ.
maxAttempts :: JobRecord payload key q insertedAt adm -> Maybe Int32
maxAttempts :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Int32
maxAttempts Job {maxAttempts :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Int32
maxAttempts = Maybe Int32
value} = Maybe Int32
value

-- | Identifier of this job's parent in a job tree.
parentId :: JobRecord payload Int64 q insertedAt adm -> Maybe Int64
parentId :: forall payload q insertedAt adm.
JobRecord payload Int64 q insertedAt adm -> Maybe Int64
parentId Job {parentId :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Int64
parentId = Maybe Int64
value} = Maybe Int64
value

-- | Snapshot of accumulated child results for a rollup finalizer.
parentState :: JobRecord payload Int64 q insertedAt adm -> Maybe Value
parentState :: forall payload q insertedAt adm.
JobRecord payload Int64 q insertedAt adm -> Maybe Value
parentState Job {parentState :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Value
parentState = Maybe Value
value} = Maybe Value
value

-- | W3C trace context captured at enqueue.
traceContext :: JobRecord payload key q insertedAt adm -> Maybe TraceContext
traceContext :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe TraceContext
traceContext Job {traceContext :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe TraceContext
traceContext = Maybe TraceContext
value} = Maybe TraceContext
value

-- | Whether the job is currently ineligible for claiming.
suspended :: JobRecord payload Int64 q insertedAt adm -> Bool
suspended :: forall payload q insertedAt adm.
JobRecord payload Int64 q insertedAt adm -> Bool
suspended Job {suspended :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Bool
suspended = Bool
value} = Bool
value

-- | Worker pool that most recently claimed the job.
claimedBy :: JobRecord payload Int64 q insertedAt adm -> Maybe UUID
claimedBy :: forall payload q insertedAt adm.
JobRecord payload Int64 q insertedAt adm -> Maybe UUID
claimedBy Job {claimedBy :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe UUID
claimedBy = Maybe UUID
value} = Maybe UUID
value

-- | Monotonically increasing claim identifier.
claimSeq :: JobRecord payload Int64 q insertedAt adm -> Int64
claimSeq :: forall payload q insertedAt adm.
JobRecord payload Int64 q insertedAt adm -> Int64
claimSeq Job {claimSeq :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Int64
claimSeq = Int64
value} = Int64
value

-- | Completed-job archive retention in seconds.
archiveFor :: JobRecord payload key q insertedAt adm -> Maybe Int32
archiveFor :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Int32
archiveFor Job {archiveFor :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> Maybe Int32
archiveFor = Maybe Int32
value} = Maybe Int32
value

-- | The labels and keys stamped from the payload at enqueue.
payloadKeys :: JobRecord payload key q insertedAt adm -> adm
payloadKeys :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> adm
payloadKeys Job {payloadKeys :: forall payload key q insertedAt adm.
JobRecord payload key q insertedAt adm -> adm
payloadKeys = adm
value} = adm
value