keiro-dsl-0.15.0.0: test/fixtures/projection-catalog.keiro
language keiro-dsl 5
context catalog-demo
mapped opaque OrderPayload {
haskell package=keiro-dsl module=CatalogDemo.MappedDomain type=OrderPayload
codec = "catalog-demo.order-payload.json"
version = "1"
fixtures = "CatalogDemo.MappedBindings.orderPayloadCases"
}
mapped opaque SharedReference {
haskell package=keiro-dsl module=CatalogDemo.MappedDomain type=SharedReference
codec = "catalog-demo.shared-reference.json"
version = "1"
fixtures = "CatalogDemo.MappedBindings.sharedReferenceCases"
}
mapped structural record QualificationPayload {
haskell package=keiro-dsl module=CatalogDemo.MappedDomain type=QualificationPayload
binding = "CatalogDemo.MappedBindings.qualificationPayloadBinding"
binding-version = "1"
canonical-type = "catalog-demo.QualificationPayload.v1"
fixtures = "CatalogDemo.MappedBindings.qualificationPayloadCases"
wire object constructor=QualificationPayload unknown-fields=reject {
qualificationId as "qualification_id" : Text required
note as "note" : Optional Text required
}
}
mapped opaque QueueMetadata {
haskell package=keiro-dsl module=CatalogDemo.MappedDomain type=QueueMetadata
codec = "catalog-demo.queue-metadata.json"
version = "1"
fixtures = "CatalogDemo.MappedBindings.queueMetadataCases"
}
mapped opaque QueryCriteria {
haskell package=keiro-dsl module=CatalogDemo.MappedDomain type=QueryCriteria
codec = "catalog-demo.query-criteria.json"
version = "1"
fixtures = "CatalogDemo.MappedBindings.queryCriteriaCases"
}
mapped opaque QualificationResult {
haskell package=keiro-dsl module=CatalogDemo.MappedDomain type=QualificationResult
codec = "catalog-demo.qualification-result.json"
version = "1"
fixtures = "CatalogDemo.MappedBindings.qualificationResultCases"
}
mapped opaque RegisterState {
haskell package=keiro-dsl module=CatalogDemo.MappedDomain type=RegisterState
codec = "catalog-demo.register-state.json"
version = "1"
fixtures = "CatalogDemo.MappedBindings.registerStateCases"
initial = "CatalogDemo.MappedBindings.initialRegisterState"
}
mapped opaque UnusedQualification {
haskell package=keiro-dsl module=CatalogDemo.MappedDomain type=UnusedQualification
codec = "catalog-demo.unused-qualification.json"
version = "1"
fixtures = "CatalogDemo.MappedBindings.unusedQualificationCases"
}
target order_summary {
schema = "sales"
table = "order_summary"
reset = clear
}
target audit_log {
schema = "sales"
table = "audit_log"
reset = preserve
}
target order_totals {
schema = "sales"
table = "order_totals"
reset = clear
depends-on = [ order_summary ]
}
target shipment_summary {
schema = "sales"
table = "shipment_summary"
reset = preserve
}
rebuild-group reporting {
targets = [ order_summary order_totals audit_log ]
order = [ order_summary order_totals audit_log ]
}
rebuild-group shipping {
targets = [ shipment_summary ]
order = [ shipment_summary ]
}
projection-revision reporting_v1 {
group = reporting
target order_summary {
schema-version = "v1"
provisioner = "reporting-v1-order-summary"
provisioner-version = 1
expected-shape = "order-summary-v1"
validator = "reporting-v1-order-summary-validator"
validator-version = 1
promotion index "order_summary_status_idx__v1" -> "order_summary_status_idx"
}
target order_totals {
schema-version = "v1"
provisioner = "reporting-v1-order-totals"
provisioner-version = 1
expected-shape = "order-totals-v1"
validator = "reporting-v1-order-totals-validator"
validator-version = 1
promotion constraint "order_totals_pkey__v1" -> "order_totals_pkey"
}
target audit_log {
schema-version = "v1"
provisioner = "reporting-v1-audit-log"
provisioner-version = 1
expected-shape = "audit-log-v1"
validator = "reporting-v1-audit-log-validator"
validator-version = 1
promotion owned-sequence "audit_log_id_seq__v1" -> "audit_log_id_seq"
}
}
projection-revision reporting_v2 {
group = reporting
target order_summary {
schema-version = "v2"
provisioner = "reporting-v2-order-summary"
provisioner-version = 1
expected-shape = "order-summary-v2"
validator = "reporting-v2-order-summary-validator"
validator-version = 1
promotion index "order_summary_status_idx__v2" -> "order_summary_status_idx"
}
target order_totals {
schema-version = "v2"
provisioner = "reporting-v2-order-totals"
provisioner-version = 1
expected-shape = "order-totals-v2"
validator = "reporting-v2-order-totals-validator"
validator-version = 1
promotion constraint "order_totals_pkey__v2" -> "order_totals_pkey"
}
target audit_log {
schema-version = "v2"
provisioner = "reporting-v2-audit-log"
provisioner-version = 1
expected-shape = "audit-log-v2"
validator = "reporting-v2-audit-log-validator"
validator-version = 1
promotion owned-sequence "audit_log_id_seq__v2" -> "audit_log_id_seq"
}
}
projection-owner order_summary_writer {
source = aggregate Orders
delivery = inline
group = reporting
targets = [ order_summary order_totals ]
order = 10
replay = explicit
}
projection-owner shipment_writer {
source = aggregate Shipments
delivery = inline
group = shipping
targets = [ shipment_summary ]
order = 10
replay = live-only "carrier events cannot be replayed"
}
readmodel order_inline {
columns {
order_id text required
}
query input = QueryCriteria
query result = Optional QualificationResult
version = 1
shape = "fnv1a:784e511a19f74c58"
freshness = immediate
group = reporting
targets = [ order_summary ]
}
readmodel order_totals_lookup {
columns {
total bigint required
}
version = 1
shape = "fnv1a:768a23d719dcb4d4"
freshness = immediate
group = reporting
targets = [ order_totals ]
}
external-read order_totals_reader {
version = 1
query = order_totals_lookup
result-schema = "app_contract"
result-type = "order_totals_row_v1"
compatible-revisions = [ reporting_v1 reporting_v2 ]
surface-generation = 1
}
workqueue qualification_jobs {
queue logical = "catalog-demo.qualification-jobs"
derive physical = "catalog_demo_qualification_jobs"
dlq = "catalog_demo_qualification_jobs_dlq"
table = "pgmq.q_catalog_demo_qualification_jobs"
payload QualificationJob {
sharedReference -> "shared_reference" : SharedReference
qualification -> "payload" : QualificationPayload
metadata -> "metadata" : QueueMetadata
maybeMetadata -> "maybe_metadata" : Optional QueueMetadata
attempt -> "attempt" int
trace -> "trace" : Json
}
retry maxRetries = 3 delay = 1s dlq = on
disposition {
storeFailure -> retry 1s
commandRejected -> deadLetter
decodeFailure -> deadLetter
onCodecReject -> deadLetter
}
}
readmodel shipmentLookup {
columns {
shipment_id text required
}
version = 1
shape = "fnv1a:d0c39c966ea2f0b4"
freshness = immediate
group = shipping
targets = [ shipment_summary ]
}
readmodel catalogAudit {
columns {
event_id text required
}
version = 1
shape = "fnv1a:9682af3ada04bf50"
freshness = immediate
group = reporting
targets = [ audit_log ]
}
projection-owner audit_writer {
source = category "audit"
delivery = subscription
group = reporting
targets = [ audit_log ]
order = 20
subscription = "catalog-demo-audit"
dedup = "catalog-demo-audit-v1"
checkpoint-on-missing = from-current-head
replay = explicit
}
aggregate Orders
regs
total Natural = 0
qualificationState RegisterState = initial
states Empty Recorded!
command RecordOrder { amount:Natural orderPayload:OrderPayload sharedReference:SharedReference }
event OrderRecorded = fields(RecordOrder)
Empty -- RecordOrder --> write total := amount ; emit OrderRecorded ; goto Recorded
wire kind=ctorName fields=camelCase schemaVersion=1
aggregate Shipments
regs
accepted Bool = False
states Empty Recorded!
command RecordShipment { sharedReference:SharedReference accepted:Bool }
event ShipmentRecorded = fields(RecordShipment)
Empty -- RecordShipment --> write accepted := cmd.accepted ; emit ShipmentRecorded ; goto Recorded
wire kind=ctorName fields=camelCase schemaVersion=1