packages feed

keiro-dsl-0.17.0.0: test/conformance-process-reactions/Generated/ProcessReactions/IncidentReaction/Process.hs

{-# OPTIONS_GHC -Wno-missing-signatures #-}
-- @generated by keiro-dsl 0.17.0.0 (language keiro-dsl 6) from process reaction IncidentReaction; do not edit.
module Generated.ProcessReactions.IncidentReaction.Process
  ( IncidentReactionInput (..)
  , incidentReactionProcessName
  , incidentReactionCategory
  , incidentReactionProcessWorkerOptions
  , incidentReactionReactionVersion
  , incidentReactionReactionFingerprint
  , incidentReactionReact
  , incidentReactionProcessManager
  , incidentReactionRunProcessWorker
  ) where

import Data.Text (Text)
import Numeric.Natural (Natural)
import Generated.ProcessReactions.IncidentReaction.Input (IncidentReactionInput (..))
import ProcessReactions.IncidentReaction.ProcessHoles (decodeIncidentReactionInput)
import Generated.ProcessReactions.IncidentSaga.Domain qualified as Saga
import Generated.ProcessReactions.IncidentSaga.EventStream (incidentSagaEventStream, IncidentSagaEventStreamDef)
import Generated.ProcessReactions.Incident.Domain qualified as Target
import Generated.ProcessReactions.Incident.EventStream (incidentCommandCategory, incidentEventStream)
import Generated.ProcessReactions.Nominals qualified as N
import Keiro.Command (DomainCommandHandler (..), SilentDomainDecision (..))
import Keiro.ProcessManager (PMCommand (..))
import Keiro.ProcessManager.Reaction qualified as Reaction
import Keiro.Stream qualified as Stream
import Keiro.ProcessManager (PoisonPolicy (..), RejectedCommandPolicy (..), WorkerOptions (..))
import Shibuya.Core.Ack (RetryDelay (..))

incidentReactionProcessName :: Text
incidentReactionProcessName = "incident-reaction"

incidentReactionCategory :: Stream.StreamCategory IncidentSagaEventStreamDef
incidentReactionCategory = Stream.categoryUnsafe "incidentSaga"

incidentReactionProcessWorkerOptions :: WorkerOptions es msg
incidentReactionProcessWorkerOptions =
  WorkerOptions
    { poisonPolicy = PoisonHalt,
      rejectedCommandPolicy = RejectedHalt,
      transientRetryDelay = RetryDelay 5, -- matches defaultWorkerOptions; runtime tuning
      metrics = Nothing -- runtime configuration; install at call site
    }

incidentReactionReactionVersion :: Natural
incidentReactionReactionVersion = 1

incidentReactionReactionFingerprint :: Text
incidentReactionReactionFingerprint = "dff4a685084373ac102b8fa9591bc4cdbaa358a19bdec488ea157bd038421573"

incidentReactionCorrelate :: IncidentReactionInput -> Text
incidentReactionCorrelate input = case input of
  IncidentReported { incidentId } -> (N.incidentIdText incidentId)
  IncidentNoted { incidentId } -> (N.incidentIdText incidentId)

incidentReactionReact :: IncidentReactionInput -> Reaction.ReactionPlan Saga.IncidentSagaCommand Target.IncidentCommand
incidentReactionReact input = case input of
  IncidentReported { incidentId, severity }
    | (severity == N.Sev1) -> Reaction.AdvanceReaction { command = Saga.RecordCritical (Saga.RecordCriticalData { Saga.incidentId = incidentId }), followUps = [Reaction.FollowDispatch (PMCommand (Stream.entityStream incidentCommandCategory (N.incidentIdText incidentId)) (Target.EscalateIncident (Target.EscalateIncidentData { Target.incidentId = incidentId })))], onAccepted = [] }
    | otherwise -> Reaction.AdvanceReaction { command = Saga.RecordRoutine (Saga.RecordRoutineData { Saga.incidentId = incidentId }), followUps = [], onAccepted = [] }
  IncidentNoted {}
    -> Reaction.NoAdvance []

incidentReactionProcessManager =
  Reaction.ReactiveProcessManager
    { name = incidentReactionProcessName
    , correlate = incidentReactionCorrelate
    , sagaHandler = DomainCommandHandler { eventStream = incidentSagaEventStream, classifySilent = \_ -> SilentNoOp () }
    , streamFor = Stream.entityStream incidentReactionCategory
    , targetEventStream = incidentEventStream
    , targetProjections = const []
    , react = incidentReactionReact
    }

incidentReactionRunProcessWorker options adapter =
  Reaction.runReactiveProcessManagerWorkerWith
    incidentReactionProcessWorkerOptions
    options
    incidentReactionProcessManager
    adapter
    (\event -> case decodeIncidentReactionInput event of Nothing -> Nothing; Just input -> Just (event, input))