-- | Dead Letter Queue (DLQ) job type.
module Arbiter.Core.Job.DLQ
  ( DLQJob (..)
  , JobSnapshot
  ) where

import Data.Int (Int64)
import Data.Text (Text)
import Data.Time (UTCTime)
import GHC.Generics (Generic)

import Arbiter.Core.Job.Types (Job)

-- | A snapshot of a job's complete state when it was moved to the DLQ.
type JobSnapshot payload = Job payload Int64 Text UTCTime

-- | Represents a job that has failed all its retry attempts and has been
-- moved to the dead-letter queue for manual inspection.
data DLQJob payload = DLQJob
  { forall payload. DLQJob payload -> Int64
dlqPrimaryKey :: Int64
  -- ^ The primary key of the entry in the DLQ table
  , forall payload. DLQJob payload -> UTCTime
failedAt :: UTCTime
  -- ^ The time the job was moved to the DLQ.
  , forall payload. DLQJob payload -> JobSnapshot payload
jobSnapshot :: JobSnapshot payload
  -- ^ The complete job state when it failed.
  }
  deriving stock (DLQJob payload -> DLQJob payload -> Bool
(DLQJob payload -> DLQJob payload -> Bool)
-> (DLQJob payload -> DLQJob payload -> Bool)
-> Eq (DLQJob payload)
forall payload.
Eq payload =>
DLQJob payload -> DLQJob payload -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall payload.
Eq payload =>
DLQJob payload -> DLQJob payload -> Bool
== :: DLQJob payload -> DLQJob payload -> Bool
$c/= :: forall payload.
Eq payload =>
DLQJob payload -> DLQJob payload -> Bool
/= :: DLQJob payload -> DLQJob payload -> Bool
Eq, (forall x. DLQJob payload -> Rep (DLQJob payload) x)
-> (forall x. Rep (DLQJob payload) x -> DLQJob payload)
-> Generic (DLQJob payload)
forall x. Rep (DLQJob payload) x -> DLQJob payload
forall x. DLQJob payload -> Rep (DLQJob payload) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall payload x. Rep (DLQJob payload) x -> DLQJob payload
forall payload x. DLQJob payload -> Rep (DLQJob payload) x
$cfrom :: forall payload x. DLQJob payload -> Rep (DLQJob payload) x
from :: forall x. DLQJob payload -> Rep (DLQJob payload) x
$cto :: forall payload x. Rep (DLQJob payload) x -> DLQJob payload
to :: forall x. Rep (DLQJob payload) x -> DLQJob payload
Generic, Int -> DLQJob payload -> ShowS
[DLQJob payload] -> ShowS
DLQJob payload -> String
(Int -> DLQJob payload -> ShowS)
-> (DLQJob payload -> String)
-> ([DLQJob payload] -> ShowS)
-> Show (DLQJob payload)
forall payload. Show payload => Int -> DLQJob payload -> ShowS
forall payload. Show payload => [DLQJob payload] -> ShowS
forall payload. Show payload => DLQJob payload -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall payload. Show payload => Int -> DLQJob payload -> ShowS
showsPrec :: Int -> DLQJob payload -> ShowS
$cshow :: forall payload. Show payload => DLQJob payload -> String
show :: DLQJob payload -> String
$cshowList :: forall payload. Show payload => [DLQJob payload] -> ShowS
showList :: [DLQJob payload] -> ShowS
Show)