packages feed

keiro-dsl-0.15.0.0: test/fixtures/readmodel.keiro

language keiro-dsl 4
context hospital-capacity

readmodel transfer_decisions {
  table = "transfer_decisions"
  schema = "hospital_capacity"
  columns {
    reservation_id text required
    hospital_id text required
    status text required
    decided_at timestamptz
  }
  version = 1
  shape = "fnv1a:3717f6d9e3c44bd6"
  consistency = Strong
  scope = category "reservation"
  feed = subscription
  subscription = "hospital-capacity-transfer-decisions-sub"
}

readmodel subscriptions {
  table = "subscriptions"
  schema = "billing"
  columns {
    subscription_id text required
    status text required
  }
  version = 1
  shape = "fnv1a:f54d9bb2f40a6738"
  consistency = Eventual
  feed = inline
}

aggregate Subscription
  regs
  states Active

  command Activate { subscriptionId }
  event Activated = fields(Activate)

  Active -- Activate --> emit Activated ; goto Active

  projection subscriptions key=subscriptionId
    status-map { Activated=>active }

operation QueryTransferDecisions
  query transfer_decisions
    input TransferDecisionQuery
    result Maybe TransferDecision
    consistency Strong

workqueue readmodel_jobs {
  queue logical = "hospital_capacity.readmodel_jobs"
  derive physical = "hospital_capacity_readmodel_jobs"
         dlq = "hospital_capacity_readmodel_jobs_dlq"
         table = "pgmq.q_hospital_capacity_readmodel_jobs"

  payload ReadModelJob {
    reservationId -> "reservation_id" text required
  }

  retry maxRetries = 3 delay = 5s dlq = on

  disposition {
    storeFailure -> retry 5s
    commandRejected -> deadLetter
    decodeFailure -> deadLetter
    onCodecReject -> deadLetter
  }
}

dispatch readmodel_dispatch {
  source readModel = transfer_decisions key = reservationId
  fanout body = resolveReadModelJobs
  dedup key = reservationId
        seenIn readModel = transfer_decisions field = reservation_id
        seenIn queue = readmodel_jobs field = reservation_id
  enqueue to = readmodel_jobs
}