@voyant-travel/catalog 0.117.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +190 -0
- package/dist/adapter/booking-forwarding.d.ts +2 -0
- package/dist/adapter/booking-forwarding.d.ts.map +1 -0
- package/dist/adapter/booking-forwarding.js +1 -0
- package/dist/adapter/channel-push-contracts.d.ts +2 -0
- package/dist/adapter/channel-push-contracts.d.ts.map +1 -0
- package/dist/adapter/channel-push-contracts.js +1 -0
- package/dist/adapter/contract.d.ts +2 -0
- package/dist/adapter/contract.d.ts.map +1 -0
- package/dist/adapter/contract.js +1 -0
- package/dist/adapter/contract.test.d.ts +2 -0
- package/dist/adapter/contract.test.d.ts.map +1 -0
- package/dist/adapter/contract.test.js +390 -0
- package/dist/adapter/provider-contracts.d.ts +2 -0
- package/dist/adapter/provider-contracts.d.ts.map +1 -0
- package/dist/adapter/provider-contracts.js +1 -0
- package/dist/adapter/provider-contracts.test.d.ts +2 -0
- package/dist/adapter/provider-contracts.test.d.ts.map +1 -0
- package/dist/adapter/provider-contracts.test.js +206 -0
- package/dist/adapter/schemas.d.ts +2 -0
- package/dist/adapter/schemas.d.ts.map +1 -0
- package/dist/adapter/schemas.js +1 -0
- package/dist/adapter/schemas.test.d.ts +2 -0
- package/dist/adapter/schemas.test.d.ts.map +1 -0
- package/dist/adapter/schemas.test.js +344 -0
- package/dist/booking-engine/book.d.ts +124 -0
- package/dist/booking-engine/book.d.ts.map +1 -0
- package/dist/booking-engine/book.js +311 -0
- package/dist/booking-engine/cancel.d.ts +40 -0
- package/dist/booking-engine/cancel.d.ts.map +1 -0
- package/dist/booking-engine/cancel.js +56 -0
- package/dist/booking-engine/checkout-finalize.d.ts +146 -0
- package/dist/booking-engine/checkout-finalize.d.ts.map +1 -0
- package/dist/booking-engine/checkout-finalize.js +132 -0
- package/dist/booking-engine/contracts.d.ts +9 -0
- package/dist/booking-engine/contracts.d.ts.map +1 -0
- package/dist/booking-engine/contracts.js +8 -0
- package/dist/booking-engine/contracts.test.d.ts +2 -0
- package/dist/booking-engine/contracts.test.d.ts.map +1 -0
- package/dist/booking-engine/contracts.test.js +116 -0
- package/dist/booking-engine/draft-shape.d.ts +10 -0
- package/dist/booking-engine/draft-shape.d.ts.map +1 -0
- package/dist/booking-engine/draft-shape.js +9 -0
- package/dist/booking-engine/draft-shape.test.d.ts +2 -0
- package/dist/booking-engine/draft-shape.test.d.ts.map +1 -0
- package/dist/booking-engine/draft-shape.test.js +74 -0
- package/dist/booking-engine/drafts-schema.d.ts +302 -0
- package/dist/booking-engine/drafts-schema.d.ts.map +1 -0
- package/dist/booking-engine/drafts-schema.js +53 -0
- package/dist/booking-engine/drafts-service.d.ts +41 -0
- package/dist/booking-engine/drafts-service.d.ts.map +1 -0
- package/dist/booking-engine/drafts-service.js +108 -0
- package/dist/booking-engine/errors.d.ts +81 -0
- package/dist/booking-engine/errors.d.ts.map +1 -0
- package/dist/booking-engine/errors.js +113 -0
- package/dist/booking-engine/index.d.ts +36 -0
- package/dist/booking-engine/index.d.ts.map +1 -0
- package/dist/booking-engine/index.js +34 -0
- package/dist/booking-engine/orders.d.ts +41 -0
- package/dist/booking-engine/orders.d.ts.map +1 -0
- package/dist/booking-engine/orders.js +49 -0
- package/dist/booking-engine/owned-handler.d.ts +166 -0
- package/dist/booking-engine/owned-handler.d.ts.map +1 -0
- package/dist/booking-engine/owned-handler.js +50 -0
- package/dist/booking-engine/owned-handler.test.d.ts +2 -0
- package/dist/booking-engine/owned-handler.test.d.ts.map +1 -0
- package/dist/booking-engine/owned-handler.test.js +63 -0
- package/dist/booking-engine/promotions-contract.d.ts +8 -0
- package/dist/booking-engine/promotions-contract.d.ts.map +1 -0
- package/dist/booking-engine/promotions-contract.js +7 -0
- package/dist/booking-engine/quote-enricher.test.d.ts +12 -0
- package/dist/booking-engine/quote-enricher.test.d.ts.map +1 -0
- package/dist/booking-engine/quote-enricher.test.js +138 -0
- package/dist/booking-engine/quote.d.ts +163 -0
- package/dist/booking-engine/quote.d.ts.map +1 -0
- package/dist/booking-engine/quote.js +259 -0
- package/dist/booking-engine/registry.d.ts +85 -0
- package/dist/booking-engine/registry.d.ts.map +1 -0
- package/dist/booking-engine/registry.js +118 -0
- package/dist/booking-engine/registry.test.d.ts +2 -0
- package/dist/booking-engine/registry.test.d.ts.map +1 -0
- package/dist/booking-engine/registry.test.js +132 -0
- package/dist/booking-engine/routes-contracts.d.ts +169 -0
- package/dist/booking-engine/routes-contracts.d.ts.map +1 -0
- package/dist/booking-engine/routes-contracts.js +63 -0
- package/dist/booking-engine/routes.d.ts +7 -0
- package/dist/booking-engine/routes.d.ts.map +1 -0
- package/dist/booking-engine/routes.js +443 -0
- package/dist/booking-engine/routes.test.d.ts +2 -0
- package/dist/booking-engine/routes.test.d.ts.map +1 -0
- package/dist/booking-engine/routes.test.js +304 -0
- package/dist/booking-engine/schema.d.ts +455 -0
- package/dist/booking-engine/schema.d.ts.map +1 -0
- package/dist/booking-engine/schema.js +75 -0
- package/dist/booking-engine/snapshot-content.d.ts +120 -0
- package/dist/booking-engine/snapshot-content.d.ts.map +1 -0
- package/dist/booking-engine/snapshot-content.js +110 -0
- package/dist/booking-engine/snapshot-content.test.d.ts +2 -0
- package/dist/booking-engine/snapshot-content.test.d.ts.map +1 -0
- package/dist/booking-engine/snapshot-content.test.js +213 -0
- package/dist/booking-engine/sync.d.ts +136 -0
- package/dist/booking-engine/sync.d.ts.map +1 -0
- package/dist/booking-engine/sync.js +177 -0
- package/dist/booking-engine/sync.test.d.ts +2 -0
- package/dist/booking-engine/sync.test.d.ts.map +1 -0
- package/dist/booking-engine/sync.test.js +377 -0
- package/dist/contract.d.ts +2 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +1 -0
- package/dist/contract.test.d.ts +2 -0
- package/dist/contract.test.d.ts.map +1 -0
- package/dist/contract.test.js +107 -0
- package/dist/drift/events.d.ts +2 -0
- package/dist/drift/events.d.ts.map +1 -0
- package/dist/drift/events.js +1 -0
- package/dist/drift/events.test.d.ts +2 -0
- package/dist/drift/events.test.d.ts.map +1 -0
- package/dist/drift/events.test.js +100 -0
- package/dist/embeddings/contract.d.ts +85 -0
- package/dist/embeddings/contract.d.ts.map +1 -0
- package/dist/embeddings/contract.js +42 -0
- package/dist/embeddings/contract.test.d.ts +2 -0
- package/dist/embeddings/contract.test.d.ts.map +1 -0
- package/dist/embeddings/contract.test.js +30 -0
- package/dist/embeddings/gemini.d.ts +110 -0
- package/dist/embeddings/gemini.d.ts.map +1 -0
- package/dist/embeddings/gemini.js +118 -0
- package/dist/embeddings/gemini.test.d.ts +2 -0
- package/dist/embeddings/gemini.test.d.ts.map +1 -0
- package/dist/embeddings/gemini.test.js +132 -0
- package/dist/embeddings/model-registry.d.ts +62 -0
- package/dist/embeddings/model-registry.d.ts.map +1 -0
- package/dist/embeddings/model-registry.js +78 -0
- package/dist/embeddings/model-registry.test.d.ts +2 -0
- package/dist/embeddings/model-registry.test.d.ts.map +1 -0
- package/dist/embeddings/model-registry.test.js +81 -0
- package/dist/embeddings/openai.d.ts +81 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +123 -0
- package/dist/embeddings/openai.test.d.ts +2 -0
- package/dist/embeddings/openai.test.d.ts.map +1 -0
- package/dist/embeddings/openai.test.js +164 -0
- package/dist/events/taxonomy.d.ts +158 -0
- package/dist/events/taxonomy.d.ts.map +1 -0
- package/dist/events/taxonomy.js +99 -0
- package/dist/events/taxonomy.test.d.ts +2 -0
- package/dist/events/taxonomy.test.d.ts.map +1 -0
- package/dist/events/taxonomy.test.js +48 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/indexer/contract.d.ts +203 -0
- package/dist/indexer/contract.d.ts.map +1 -0
- package/dist/indexer/contract.js +16 -0
- package/dist/indexer/typesense-search-query.d.ts +31 -0
- package/dist/indexer/typesense-search-query.d.ts.map +1 -0
- package/dist/indexer/typesense-search-query.js +185 -0
- package/dist/indexer/typesense.d.ts +105 -0
- package/dist/indexer/typesense.d.ts.map +1 -0
- package/dist/indexer/typesense.js +394 -0
- package/dist/indexer/typesense.test.d.ts +2 -0
- package/dist/indexer/typesense.test.d.ts.map +1 -0
- package/dist/indexer/typesense.test.js +253 -0
- package/dist/overlay/resolver.d.ts +101 -0
- package/dist/overlay/resolver.d.ts.map +1 -0
- package/dist/overlay/resolver.js +167 -0
- package/dist/overlay/resolver.test.d.ts +2 -0
- package/dist/overlay/resolver.test.d.ts.map +1 -0
- package/dist/overlay/resolver.test.js +179 -0
- package/dist/overlay/schema.d.ts +266 -0
- package/dist/overlay/schema.d.ts.map +1 -0
- package/dist/overlay/schema.js +71 -0
- package/dist/provenance.d.ts +2 -0
- package/dist/provenance.d.ts.map +1 -0
- package/dist/provenance.js +1 -0
- package/dist/schema-sourced-entries.d.ts +344 -0
- package/dist/schema-sourced-entries.d.ts.map +1 -0
- package/dist/schema-sourced-entries.js +75 -0
- package/dist/schema.d.ts +21 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +20 -0
- package/dist/search/federate.d.ts +58 -0
- package/dist/search/federate.d.ts.map +1 -0
- package/dist/search/federate.js +103 -0
- package/dist/search/federate.test.d.ts +2 -0
- package/dist/search/federate.test.d.ts.map +1 -0
- package/dist/search/federate.test.js +146 -0
- package/dist/search/rerank.d.ts +77 -0
- package/dist/search/rerank.d.ts.map +1 -0
- package/dist/search/rerank.js +68 -0
- package/dist/search/rerank.test.d.ts +2 -0
- package/dist/search/rerank.test.d.ts.map +1 -0
- package/dist/search/rerank.test.js +60 -0
- package/dist/search/routes.d.ts +144 -0
- package/dist/search/routes.d.ts.map +1 -0
- package/dist/search/routes.js +288 -0
- package/dist/search/routes.test.d.ts +2 -0
- package/dist/search/routes.test.d.ts.map +1 -0
- package/dist/search/routes.test.js +322 -0
- package/dist/search/semantic.d.ts +63 -0
- package/dist/search/semantic.d.ts.map +1 -0
- package/dist/search/semantic.js +75 -0
- package/dist/search/semantic.test.d.ts +2 -0
- package/dist/search/semantic.test.d.ts.map +1 -0
- package/dist/search/semantic.test.js +143 -0
- package/dist/services/build-indexer-document.test.d.ts +2 -0
- package/dist/services/build-indexer-document.test.d.ts.map +1 -0
- package/dist/services/build-indexer-document.test.js +102 -0
- package/dist/services/content-service.d.ts +125 -0
- package/dist/services/content-service.d.ts.map +1 -0
- package/dist/services/content-service.js +139 -0
- package/dist/services/content-service.test.d.ts +2 -0
- package/dist/services/content-service.test.d.ts.map +1 -0
- package/dist/services/content-service.test.js +322 -0
- package/dist/services/indexer-service.d.ts +109 -0
- package/dist/services/indexer-service.d.ts.map +1 -0
- package/dist/services/indexer-service.js +123 -0
- package/dist/services/indexer-service.test.d.ts +2 -0
- package/dist/services/indexer-service.test.d.ts.map +1 -0
- package/dist/services/indexer-service.test.js +176 -0
- package/dist/services/overlay-service.d.ts +108 -0
- package/dist/services/overlay-service.d.ts.map +1 -0
- package/dist/services/overlay-service.js +211 -0
- package/dist/services/overlay-service.test.d.ts +2 -0
- package/dist/services/overlay-service.test.d.ts.map +1 -0
- package/dist/services/overlay-service.test.js +79 -0
- package/dist/services/snapshot-builder.test.d.ts +2 -0
- package/dist/services/snapshot-builder.test.d.ts.map +1 -0
- package/dist/services/snapshot-builder.test.js +93 -0
- package/dist/services/snapshot-service.d.ts +78 -0
- package/dist/services/snapshot-service.d.ts.map +1 -0
- package/dist/services/snapshot-service.js +165 -0
- package/dist/services/sourced-entry-service.d.ts +142 -0
- package/dist/services/sourced-entry-service.d.ts.map +1 -0
- package/dist/services/sourced-entry-service.js +203 -0
- package/dist/services/sourced-entry-service.test.d.ts +10 -0
- package/dist/services/sourced-entry-service.test.d.ts.map +1 -0
- package/dist/services/sourced-entry-service.test.js +66 -0
- package/dist/snapshot/schema.d.ts +362 -0
- package/dist/snapshot/schema.d.ts.map +1 -0
- package/dist/snapshot/schema.js +102 -0
- package/package.json +210 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `booking_drafts` — server-side draft state for the unified booking
|
|
3
|
+
* journey. Survives refresh, tab loss, and short walk-aways. On
|
|
4
|
+
* commit, `consumed_booking_id` points at the materialized booking;
|
|
5
|
+
* abandoned drafts never produce a `bookings` row.
|
|
6
|
+
*
|
|
7
|
+
* Per `docs/architecture/booking-journey-architecture.md` §5.7 +
|
|
8
|
+
* §12.10 (settled on the sibling-table option B — ships alongside
|
|
9
|
+
* `booking_session_states` rather than extending it).
|
|
10
|
+
*
|
|
11
|
+
* Lifecycle:
|
|
12
|
+
* 1. Wizard PUTs the draft on every step transition.
|
|
13
|
+
* 2. Quote requests resolve draft → engine → catalog_quotes.
|
|
14
|
+
* 3. On commit, the engine writes the bookings row and stamps
|
|
15
|
+
* `consumed_booking_id` here.
|
|
16
|
+
* 4. Abandoned drafts (`expires_at` passed) are reaped by a daily
|
|
17
|
+
* job, releasing any associated soft holds first.
|
|
18
|
+
*/
|
|
19
|
+
export declare const bookingDraftsTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
20
|
+
name: "booking_drafts";
|
|
21
|
+
schema: undefined;
|
|
22
|
+
columns: {
|
|
23
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
24
|
+
name: string;
|
|
25
|
+
tableName: "booking_drafts";
|
|
26
|
+
dataType: "string";
|
|
27
|
+
columnType: "PgText";
|
|
28
|
+
data: string;
|
|
29
|
+
driverParam: string;
|
|
30
|
+
notNull: true;
|
|
31
|
+
hasDefault: true;
|
|
32
|
+
isPrimaryKey: true;
|
|
33
|
+
isAutoincrement: false;
|
|
34
|
+
hasRuntimeDefault: true;
|
|
35
|
+
enumValues: [string, ...string[]];
|
|
36
|
+
baseColumn: never;
|
|
37
|
+
identity: undefined;
|
|
38
|
+
generated: undefined;
|
|
39
|
+
}, {}, {}>;
|
|
40
|
+
entity_module: import("drizzle-orm/pg-core").PgColumn<{
|
|
41
|
+
name: "entity_module";
|
|
42
|
+
tableName: "booking_drafts";
|
|
43
|
+
dataType: "string";
|
|
44
|
+
columnType: "PgText";
|
|
45
|
+
data: string;
|
|
46
|
+
driverParam: string;
|
|
47
|
+
notNull: true;
|
|
48
|
+
hasDefault: false;
|
|
49
|
+
isPrimaryKey: false;
|
|
50
|
+
isAutoincrement: false;
|
|
51
|
+
hasRuntimeDefault: false;
|
|
52
|
+
enumValues: [string, ...string[]];
|
|
53
|
+
baseColumn: never;
|
|
54
|
+
identity: undefined;
|
|
55
|
+
generated: undefined;
|
|
56
|
+
}, {}, {}>;
|
|
57
|
+
entity_id: import("drizzle-orm/pg-core").PgColumn<{
|
|
58
|
+
name: "entity_id";
|
|
59
|
+
tableName: "booking_drafts";
|
|
60
|
+
dataType: "string";
|
|
61
|
+
columnType: "PgText";
|
|
62
|
+
data: string;
|
|
63
|
+
driverParam: string;
|
|
64
|
+
notNull: true;
|
|
65
|
+
hasDefault: false;
|
|
66
|
+
isPrimaryKey: false;
|
|
67
|
+
isAutoincrement: false;
|
|
68
|
+
hasRuntimeDefault: false;
|
|
69
|
+
enumValues: [string, ...string[]];
|
|
70
|
+
baseColumn: never;
|
|
71
|
+
identity: undefined;
|
|
72
|
+
generated: undefined;
|
|
73
|
+
}, {}, {}>;
|
|
74
|
+
source_kind: import("drizzle-orm/pg-core").PgColumn<{
|
|
75
|
+
name: "source_kind";
|
|
76
|
+
tableName: "booking_drafts";
|
|
77
|
+
dataType: "string";
|
|
78
|
+
columnType: "PgText";
|
|
79
|
+
data: string;
|
|
80
|
+
driverParam: string;
|
|
81
|
+
notNull: true;
|
|
82
|
+
hasDefault: false;
|
|
83
|
+
isPrimaryKey: false;
|
|
84
|
+
isAutoincrement: false;
|
|
85
|
+
hasRuntimeDefault: false;
|
|
86
|
+
enumValues: [string, ...string[]];
|
|
87
|
+
baseColumn: never;
|
|
88
|
+
identity: undefined;
|
|
89
|
+
generated: undefined;
|
|
90
|
+
}, {}, {}>;
|
|
91
|
+
source_connection_id: import("drizzle-orm/pg-core").PgColumn<{
|
|
92
|
+
name: "source_connection_id";
|
|
93
|
+
tableName: "booking_drafts";
|
|
94
|
+
dataType: "string";
|
|
95
|
+
columnType: "PgText";
|
|
96
|
+
data: string;
|
|
97
|
+
driverParam: string;
|
|
98
|
+
notNull: false;
|
|
99
|
+
hasDefault: false;
|
|
100
|
+
isPrimaryKey: false;
|
|
101
|
+
isAutoincrement: false;
|
|
102
|
+
hasRuntimeDefault: false;
|
|
103
|
+
enumValues: [string, ...string[]];
|
|
104
|
+
baseColumn: never;
|
|
105
|
+
identity: undefined;
|
|
106
|
+
generated: undefined;
|
|
107
|
+
}, {}, {}>;
|
|
108
|
+
source_ref: import("drizzle-orm/pg-core").PgColumn<{
|
|
109
|
+
name: "source_ref";
|
|
110
|
+
tableName: "booking_drafts";
|
|
111
|
+
dataType: "string";
|
|
112
|
+
columnType: "PgText";
|
|
113
|
+
data: string;
|
|
114
|
+
driverParam: string;
|
|
115
|
+
notNull: false;
|
|
116
|
+
hasDefault: false;
|
|
117
|
+
isPrimaryKey: false;
|
|
118
|
+
isAutoincrement: false;
|
|
119
|
+
hasRuntimeDefault: false;
|
|
120
|
+
enumValues: [string, ...string[]];
|
|
121
|
+
baseColumn: never;
|
|
122
|
+
identity: undefined;
|
|
123
|
+
generated: undefined;
|
|
124
|
+
}, {}, {}>;
|
|
125
|
+
draft_payload: import("drizzle-orm/pg-core").PgColumn<{
|
|
126
|
+
name: "draft_payload";
|
|
127
|
+
tableName: "booking_drafts";
|
|
128
|
+
dataType: "json";
|
|
129
|
+
columnType: "PgJsonb";
|
|
130
|
+
data: Record<string, unknown>;
|
|
131
|
+
driverParam: unknown;
|
|
132
|
+
notNull: true;
|
|
133
|
+
hasDefault: false;
|
|
134
|
+
isPrimaryKey: false;
|
|
135
|
+
isAutoincrement: false;
|
|
136
|
+
hasRuntimeDefault: false;
|
|
137
|
+
enumValues: undefined;
|
|
138
|
+
baseColumn: never;
|
|
139
|
+
identity: undefined;
|
|
140
|
+
generated: undefined;
|
|
141
|
+
}, {}, {
|
|
142
|
+
$type: Record<string, unknown>;
|
|
143
|
+
}>;
|
|
144
|
+
current_step: import("drizzle-orm/pg-core").PgColumn<{
|
|
145
|
+
name: "current_step";
|
|
146
|
+
tableName: "booking_drafts";
|
|
147
|
+
dataType: "string";
|
|
148
|
+
columnType: "PgText";
|
|
149
|
+
data: string;
|
|
150
|
+
driverParam: string;
|
|
151
|
+
notNull: false;
|
|
152
|
+
hasDefault: false;
|
|
153
|
+
isPrimaryKey: false;
|
|
154
|
+
isAutoincrement: false;
|
|
155
|
+
hasRuntimeDefault: false;
|
|
156
|
+
enumValues: [string, ...string[]];
|
|
157
|
+
baseColumn: never;
|
|
158
|
+
identity: undefined;
|
|
159
|
+
generated: undefined;
|
|
160
|
+
}, {}, {}>;
|
|
161
|
+
current_quote_id: import("drizzle-orm/pg-core").PgColumn<{
|
|
162
|
+
name: "current_quote_id";
|
|
163
|
+
tableName: "booking_drafts";
|
|
164
|
+
dataType: "string";
|
|
165
|
+
columnType: "PgText";
|
|
166
|
+
data: string;
|
|
167
|
+
driverParam: string;
|
|
168
|
+
notNull: false;
|
|
169
|
+
hasDefault: false;
|
|
170
|
+
isPrimaryKey: false;
|
|
171
|
+
isAutoincrement: false;
|
|
172
|
+
hasRuntimeDefault: false;
|
|
173
|
+
enumValues: [string, ...string[]];
|
|
174
|
+
baseColumn: never;
|
|
175
|
+
identity: undefined;
|
|
176
|
+
generated: undefined;
|
|
177
|
+
}, {}, {}>;
|
|
178
|
+
hold_expires_at: import("drizzle-orm/pg-core").PgColumn<{
|
|
179
|
+
name: "hold_expires_at";
|
|
180
|
+
tableName: "booking_drafts";
|
|
181
|
+
dataType: "date";
|
|
182
|
+
columnType: "PgTimestamp";
|
|
183
|
+
data: Date;
|
|
184
|
+
driverParam: string;
|
|
185
|
+
notNull: false;
|
|
186
|
+
hasDefault: false;
|
|
187
|
+
isPrimaryKey: false;
|
|
188
|
+
isAutoincrement: false;
|
|
189
|
+
hasRuntimeDefault: false;
|
|
190
|
+
enumValues: undefined;
|
|
191
|
+
baseColumn: never;
|
|
192
|
+
identity: undefined;
|
|
193
|
+
generated: undefined;
|
|
194
|
+
}, {}, {}>;
|
|
195
|
+
consumed_booking_id: import("drizzle-orm/pg-core").PgColumn<{
|
|
196
|
+
name: "consumed_booking_id";
|
|
197
|
+
tableName: "booking_drafts";
|
|
198
|
+
dataType: "string";
|
|
199
|
+
columnType: "PgText";
|
|
200
|
+
data: string;
|
|
201
|
+
driverParam: string;
|
|
202
|
+
notNull: false;
|
|
203
|
+
hasDefault: false;
|
|
204
|
+
isPrimaryKey: false;
|
|
205
|
+
isAutoincrement: false;
|
|
206
|
+
hasRuntimeDefault: false;
|
|
207
|
+
enumValues: [string, ...string[]];
|
|
208
|
+
baseColumn: never;
|
|
209
|
+
identity: undefined;
|
|
210
|
+
generated: undefined;
|
|
211
|
+
}, {}, {}>;
|
|
212
|
+
consumed_at: import("drizzle-orm/pg-core").PgColumn<{
|
|
213
|
+
name: "consumed_at";
|
|
214
|
+
tableName: "booking_drafts";
|
|
215
|
+
dataType: "date";
|
|
216
|
+
columnType: "PgTimestamp";
|
|
217
|
+
data: Date;
|
|
218
|
+
driverParam: string;
|
|
219
|
+
notNull: false;
|
|
220
|
+
hasDefault: false;
|
|
221
|
+
isPrimaryKey: false;
|
|
222
|
+
isAutoincrement: false;
|
|
223
|
+
hasRuntimeDefault: false;
|
|
224
|
+
enumValues: undefined;
|
|
225
|
+
baseColumn: never;
|
|
226
|
+
identity: undefined;
|
|
227
|
+
generated: undefined;
|
|
228
|
+
}, {}, {}>;
|
|
229
|
+
created_by: import("drizzle-orm/pg-core").PgColumn<{
|
|
230
|
+
name: "created_by";
|
|
231
|
+
tableName: "booking_drafts";
|
|
232
|
+
dataType: "string";
|
|
233
|
+
columnType: "PgText";
|
|
234
|
+
data: string;
|
|
235
|
+
driverParam: string;
|
|
236
|
+
notNull: false;
|
|
237
|
+
hasDefault: false;
|
|
238
|
+
isPrimaryKey: false;
|
|
239
|
+
isAutoincrement: false;
|
|
240
|
+
hasRuntimeDefault: false;
|
|
241
|
+
enumValues: [string, ...string[]];
|
|
242
|
+
baseColumn: never;
|
|
243
|
+
identity: undefined;
|
|
244
|
+
generated: undefined;
|
|
245
|
+
}, {}, {}>;
|
|
246
|
+
created_at: import("drizzle-orm/pg-core").PgColumn<{
|
|
247
|
+
name: "created_at";
|
|
248
|
+
tableName: "booking_drafts";
|
|
249
|
+
dataType: "date";
|
|
250
|
+
columnType: "PgTimestamp";
|
|
251
|
+
data: Date;
|
|
252
|
+
driverParam: string;
|
|
253
|
+
notNull: true;
|
|
254
|
+
hasDefault: true;
|
|
255
|
+
isPrimaryKey: false;
|
|
256
|
+
isAutoincrement: false;
|
|
257
|
+
hasRuntimeDefault: false;
|
|
258
|
+
enumValues: undefined;
|
|
259
|
+
baseColumn: never;
|
|
260
|
+
identity: undefined;
|
|
261
|
+
generated: undefined;
|
|
262
|
+
}, {}, {}>;
|
|
263
|
+
updated_at: import("drizzle-orm/pg-core").PgColumn<{
|
|
264
|
+
name: "updated_at";
|
|
265
|
+
tableName: "booking_drafts";
|
|
266
|
+
dataType: "date";
|
|
267
|
+
columnType: "PgTimestamp";
|
|
268
|
+
data: Date;
|
|
269
|
+
driverParam: string;
|
|
270
|
+
notNull: true;
|
|
271
|
+
hasDefault: true;
|
|
272
|
+
isPrimaryKey: false;
|
|
273
|
+
isAutoincrement: false;
|
|
274
|
+
hasRuntimeDefault: false;
|
|
275
|
+
enumValues: undefined;
|
|
276
|
+
baseColumn: never;
|
|
277
|
+
identity: undefined;
|
|
278
|
+
generated: undefined;
|
|
279
|
+
}, {}, {}>;
|
|
280
|
+
expires_at: import("drizzle-orm/pg-core").PgColumn<{
|
|
281
|
+
name: "expires_at";
|
|
282
|
+
tableName: "booking_drafts";
|
|
283
|
+
dataType: "date";
|
|
284
|
+
columnType: "PgTimestamp";
|
|
285
|
+
data: Date;
|
|
286
|
+
driverParam: string;
|
|
287
|
+
notNull: true;
|
|
288
|
+
hasDefault: false;
|
|
289
|
+
isPrimaryKey: false;
|
|
290
|
+
isAutoincrement: false;
|
|
291
|
+
hasRuntimeDefault: false;
|
|
292
|
+
enumValues: undefined;
|
|
293
|
+
baseColumn: never;
|
|
294
|
+
identity: undefined;
|
|
295
|
+
generated: undefined;
|
|
296
|
+
}, {}, {}>;
|
|
297
|
+
};
|
|
298
|
+
dialect: "pg";
|
|
299
|
+
}>;
|
|
300
|
+
export type SelectBookingDraft = typeof bookingDraftsTable.$inferSelect;
|
|
301
|
+
export type InsertBookingDraft = typeof bookingDraftsTable.$inferInsert;
|
|
302
|
+
//# sourceMappingURL=drafts-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drafts-schema.d.ts","sourceRoot":"","sources":["../../src/booking-engine/drafts-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6C9B,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC,YAAY,CAAA;AACvE,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC,YAAY,CAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `booking_drafts` — server-side draft state for the unified booking
|
|
3
|
+
* journey. Survives refresh, tab loss, and short walk-aways. On
|
|
4
|
+
* commit, `consumed_booking_id` points at the materialized booking;
|
|
5
|
+
* abandoned drafts never produce a `bookings` row.
|
|
6
|
+
*
|
|
7
|
+
* Per `docs/architecture/booking-journey-architecture.md` §5.7 +
|
|
8
|
+
* §12.10 (settled on the sibling-table option B — ships alongside
|
|
9
|
+
* `booking_session_states` rather than extending it).
|
|
10
|
+
*
|
|
11
|
+
* Lifecycle:
|
|
12
|
+
* 1. Wizard PUTs the draft on every step transition.
|
|
13
|
+
* 2. Quote requests resolve draft → engine → catalog_quotes.
|
|
14
|
+
* 3. On commit, the engine writes the bookings row and stamps
|
|
15
|
+
* `consumed_booking_id` here.
|
|
16
|
+
* 4. Abandoned drafts (`expires_at` passed) are reaped by a daily
|
|
17
|
+
* job, releasing any associated soft holds first.
|
|
18
|
+
*/
|
|
19
|
+
import { typeId } from "@voyant-travel/db/lib/typeid-column";
|
|
20
|
+
import { index, jsonb, pgTable, text, timestamp } from "drizzle-orm/pg-core";
|
|
21
|
+
export const bookingDraftsTable = pgTable("booking_drafts", {
|
|
22
|
+
id: typeId("booking_drafts"),
|
|
23
|
+
/** Pointer to the catalog row this draft is for. */
|
|
24
|
+
entity_module: text("entity_module").notNull(),
|
|
25
|
+
entity_id: text("entity_id").notNull(),
|
|
26
|
+
source_kind: text("source_kind").notNull(),
|
|
27
|
+
source_connection_id: text("source_connection_id"),
|
|
28
|
+
source_ref: text("source_ref"),
|
|
29
|
+
/** Full BookingDraft minus pricing — opaque jsonb for forward
|
|
30
|
+
* compat. Validated at the route layer against `bookingDraftV1`. */
|
|
31
|
+
draft_payload: jsonb("draft_payload").$type().notNull(),
|
|
32
|
+
/** Wizard's current step — diagnostic, not load-bearing. */
|
|
33
|
+
current_step: text("current_step"),
|
|
34
|
+
/** Most-recent quote id snapshotted off this draft. */
|
|
35
|
+
current_quote_id: text("current_quote_id"),
|
|
36
|
+
/** Adapter-driven; null when no hold is active. */
|
|
37
|
+
hold_expires_at: timestamp("hold_expires_at", { withTimezone: true }),
|
|
38
|
+
/** Set on successful commit — the journey is consumed. */
|
|
39
|
+
consumed_booking_id: text("consumed_booking_id"),
|
|
40
|
+
consumed_at: timestamp("consumed_at", { withTimezone: true }),
|
|
41
|
+
/** Author — staff user id for operator-side, anonymous session
|
|
42
|
+
* token (or null) for storefront. */
|
|
43
|
+
created_by: text("created_by"),
|
|
44
|
+
created_at: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
45
|
+
updated_at: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
|
|
46
|
+
/** Session-abandonment TTL — default 24h, set by the route layer. */
|
|
47
|
+
expires_at: timestamp("expires_at", { withTimezone: true }).notNull(),
|
|
48
|
+
}, (table) => [
|
|
49
|
+
index("idx_booking_drafts_entity").on(table.entity_module, table.entity_id),
|
|
50
|
+
index("idx_booking_drafts_expires").on(table.expires_at),
|
|
51
|
+
index("idx_booking_drafts_created_by").on(table.created_by),
|
|
52
|
+
index("idx_booking_drafts_consumed").on(table.consumed_booking_id),
|
|
53
|
+
]);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service layer over `booking_drafts` — CRUD + lifecycle helpers
|
|
3
|
+
* the route layer composes. Per booking-journey-architecture §5.7.
|
|
4
|
+
*/
|
|
5
|
+
import type { AnyDrizzleDb } from "@voyant-travel/db";
|
|
6
|
+
import { type SelectBookingDraft } from "./drafts-schema.js";
|
|
7
|
+
export declare const DEFAULT_DRAFT_TTL_MS: number;
|
|
8
|
+
export interface UpsertDraftInput {
|
|
9
|
+
/** Draft id — when omitted, a fresh id is generated. */
|
|
10
|
+
id?: string;
|
|
11
|
+
entityModule: string;
|
|
12
|
+
entityId: string;
|
|
13
|
+
sourceKind: string;
|
|
14
|
+
sourceConnectionId?: string;
|
|
15
|
+
sourceRef?: string;
|
|
16
|
+
draftPayload: Record<string, unknown>;
|
|
17
|
+
currentStep?: string;
|
|
18
|
+
currentQuoteId?: string;
|
|
19
|
+
holdExpiresAt?: Date | null;
|
|
20
|
+
createdBy?: string | null;
|
|
21
|
+
ttlMs?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function createBookingDraft(db: AnyDrizzleDb, input: UpsertDraftInput): Promise<SelectBookingDraft>;
|
|
24
|
+
export declare function getBookingDraft(db: AnyDrizzleDb, id: string): Promise<SelectBookingDraft | null>;
|
|
25
|
+
export interface UpdateDraftPatch {
|
|
26
|
+
draftPayload?: Record<string, unknown>;
|
|
27
|
+
currentStep?: string;
|
|
28
|
+
currentQuoteId?: string | null;
|
|
29
|
+
holdExpiresAt?: Date | null;
|
|
30
|
+
refreshTtlMs?: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function updateBookingDraft(db: AnyDrizzleDb, id: string, patch: UpdateDraftPatch): Promise<SelectBookingDraft | null>;
|
|
33
|
+
export declare function markDraftConsumed(db: AnyDrizzleDb, id: string, bookingId: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Reaper helper — returns ids of drafts that are past TTL and not
|
|
36
|
+
* yet consumed. Operators can run this in a daily cron and release
|
|
37
|
+
* any associated holds before deleting.
|
|
38
|
+
*/
|
|
39
|
+
export declare function findExpiredDrafts(db: AnyDrizzleDb, cutoff?: Date): Promise<SelectBookingDraft[]>;
|
|
40
|
+
export declare function deleteBookingDraft(db: AnyDrizzleDb, id: string): Promise<void>;
|
|
41
|
+
//# sourceMappingURL=drafts-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drafts-service.d.ts","sourceRoot":"","sources":["../../src/booking-engine/drafts-service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIrD,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAA;AAE3B,eAAO,MAAM,oBAAoB,QAAsB,CAAA;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,YAAY,EAChB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,kBAAkB,CAAC,CAgD7B;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,YAAY,EAChB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAOpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACtC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,aAAa,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IAE3B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,YAAY,EAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAgBpC;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,YAAY,EAChB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,YAAY,EAChB,MAAM,GAAE,IAAiB,GACxB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAU/B;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service layer over `booking_drafts` — CRUD + lifecycle helpers
|
|
3
|
+
* the route layer composes. Per booking-journey-architecture §5.7.
|
|
4
|
+
*/
|
|
5
|
+
import { newId } from "@voyant-travel/db/lib/typeid";
|
|
6
|
+
import { and, eq, isNull, lt } from "drizzle-orm";
|
|
7
|
+
import { bookingDraftsTable, } from "./drafts-schema.js";
|
|
8
|
+
export const DEFAULT_DRAFT_TTL_MS = 24 * 60 * 60 * 1000; // 24h
|
|
9
|
+
export async function createBookingDraft(db, input) {
|
|
10
|
+
const id = input.id ?? newId("booking_drafts");
|
|
11
|
+
const now = new Date();
|
|
12
|
+
const expiresAt = new Date(now.getTime() + (input.ttlMs ?? DEFAULT_DRAFT_TTL_MS));
|
|
13
|
+
const values = {
|
|
14
|
+
id,
|
|
15
|
+
entity_module: input.entityModule,
|
|
16
|
+
entity_id: input.entityId,
|
|
17
|
+
source_kind: input.sourceKind,
|
|
18
|
+
source_connection_id: input.sourceConnectionId,
|
|
19
|
+
source_ref: input.sourceRef,
|
|
20
|
+
draft_payload: input.draftPayload,
|
|
21
|
+
current_step: input.currentStep,
|
|
22
|
+
current_quote_id: input.currentQuoteId,
|
|
23
|
+
hold_expires_at: input.holdExpiresAt ?? null,
|
|
24
|
+
created_by: input.createdBy ?? null,
|
|
25
|
+
created_at: now,
|
|
26
|
+
updated_at: now,
|
|
27
|
+
expires_at: expiresAt,
|
|
28
|
+
};
|
|
29
|
+
// Upsert (not just insert) — the storefront fires multiple PUTs to
|
|
30
|
+
// the same draft id in quick succession (step transition + live
|
|
31
|
+
// re-quote), and the route's find-or-create flow can race two
|
|
32
|
+
// concurrent calls into colliding INSERTs. Rolling the create + on-
|
|
33
|
+
// conflict update into a single statement makes the route
|
|
34
|
+
// idempotent regardless of ordering.
|
|
35
|
+
const [row] = (await db
|
|
36
|
+
.insert(bookingDraftsTable)
|
|
37
|
+
.values(values)
|
|
38
|
+
.onConflictDoUpdate({
|
|
39
|
+
target: bookingDraftsTable.id,
|
|
40
|
+
set: {
|
|
41
|
+
// Refresh the mutable journey state — we DON'T overwrite
|
|
42
|
+
// `id`, `created_at`, `created_by`, or the entity pointers
|
|
43
|
+
// on conflict (those are immutable identity).
|
|
44
|
+
draft_payload: values.draft_payload,
|
|
45
|
+
current_step: values.current_step,
|
|
46
|
+
current_quote_id: values.current_quote_id,
|
|
47
|
+
hold_expires_at: values.hold_expires_at,
|
|
48
|
+
updated_at: now,
|
|
49
|
+
expires_at: expiresAt,
|
|
50
|
+
},
|
|
51
|
+
})
|
|
52
|
+
.returning());
|
|
53
|
+
if (!row)
|
|
54
|
+
throw new Error("createBookingDraft: insert returned no rows");
|
|
55
|
+
return row;
|
|
56
|
+
}
|
|
57
|
+
export async function getBookingDraft(db, id) {
|
|
58
|
+
const rows = (await db
|
|
59
|
+
.select()
|
|
60
|
+
.from(bookingDraftsTable)
|
|
61
|
+
.where(eq(bookingDraftsTable.id, id))
|
|
62
|
+
.limit(1));
|
|
63
|
+
return rows[0] ?? null;
|
|
64
|
+
}
|
|
65
|
+
export async function updateBookingDraft(db, id, patch) {
|
|
66
|
+
const updates = { updated_at: new Date() };
|
|
67
|
+
if (patch.draftPayload !== undefined)
|
|
68
|
+
updates.draft_payload = patch.draftPayload;
|
|
69
|
+
if (patch.currentStep !== undefined)
|
|
70
|
+
updates.current_step = patch.currentStep;
|
|
71
|
+
if (patch.currentQuoteId !== undefined)
|
|
72
|
+
updates.current_quote_id = patch.currentQuoteId;
|
|
73
|
+
if (patch.holdExpiresAt !== undefined)
|
|
74
|
+
updates.hold_expires_at = patch.holdExpiresAt;
|
|
75
|
+
if (patch.refreshTtlMs !== undefined) {
|
|
76
|
+
updates.expires_at = new Date(Date.now() + patch.refreshTtlMs);
|
|
77
|
+
}
|
|
78
|
+
const rows = (await db
|
|
79
|
+
.update(bookingDraftsTable)
|
|
80
|
+
.set(updates)
|
|
81
|
+
.where(eq(bookingDraftsTable.id, id))
|
|
82
|
+
.returning());
|
|
83
|
+
return rows[0] ?? null;
|
|
84
|
+
}
|
|
85
|
+
export async function markDraftConsumed(db, id, bookingId) {
|
|
86
|
+
await db
|
|
87
|
+
.update(bookingDraftsTable)
|
|
88
|
+
.set({
|
|
89
|
+
consumed_booking_id: bookingId,
|
|
90
|
+
consumed_at: new Date(),
|
|
91
|
+
updated_at: new Date(),
|
|
92
|
+
})
|
|
93
|
+
.where(eq(bookingDraftsTable.id, id));
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Reaper helper — returns ids of drafts that are past TTL and not
|
|
97
|
+
* yet consumed. Operators can run this in a daily cron and release
|
|
98
|
+
* any associated holds before deleting.
|
|
99
|
+
*/
|
|
100
|
+
export async function findExpiredDrafts(db, cutoff = new Date()) {
|
|
101
|
+
return (await db
|
|
102
|
+
.select()
|
|
103
|
+
.from(bookingDraftsTable)
|
|
104
|
+
.where(and(lt(bookingDraftsTable.expires_at, cutoff), isNull(bookingDraftsTable.consumed_booking_id))));
|
|
105
|
+
}
|
|
106
|
+
export async function deleteBookingDraft(db, id) {
|
|
107
|
+
await db.delete(bookingDraftsTable).where(eq(bookingDraftsTable.id, id));
|
|
108
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable error codes returned from the booking engine.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the catalog plane's `CAPABILITY_NOT_SUPPORTED` convention:
|
|
5
|
+
* codes are stable strings, callers branch on them, and each carries a
|
|
6
|
+
* dedicated `Error` subclass for stack-trace clarity.
|
|
7
|
+
*/
|
|
8
|
+
/** No SourceAdapter was registered for the row's `source.kind`. */
|
|
9
|
+
export declare const NO_ADAPTER_REGISTERED: "NO_ADAPTER_REGISTERED";
|
|
10
|
+
/**
|
|
11
|
+
* No OwnedBookingHandler was registered for the row's `entity_module`.
|
|
12
|
+
* Sibling to `NO_ADAPTER_REGISTERED` — sourced rows dispatch through
|
|
13
|
+
* adapters keyed by connection, owned rows dispatch through handlers
|
|
14
|
+
* keyed by entity module. Per booking-journey-architecture §6.
|
|
15
|
+
*/
|
|
16
|
+
export declare const NO_HANDLER_REGISTERED: "NO_HANDLER_REGISTERED";
|
|
17
|
+
/** The supplied `quoteId` is unknown or already consumed. */
|
|
18
|
+
export declare const QUOTE_NOT_FOUND: "QUOTE_NOT_FOUND";
|
|
19
|
+
/** The quote's `expires_at` has passed; caller must re-quote. */
|
|
20
|
+
export declare const QUOTE_EXPIRED: "QUOTE_EXPIRED";
|
|
21
|
+
/** The quote's entity_module/entity_id doesn't match the book request. */
|
|
22
|
+
export declare const QUOTE_MISMATCH: "QUOTE_MISMATCH";
|
|
23
|
+
/** The adapter returned `failed` for the requested entity. */
|
|
24
|
+
export declare const RESERVE_FAILED: "RESERVE_FAILED";
|
|
25
|
+
/** No snapshot row exists for the given (booking_id, entity_*). */
|
|
26
|
+
export declare const ORDER_NOT_FOUND: "ORDER_NOT_FOUND";
|
|
27
|
+
/** The order has already been cancelled. */
|
|
28
|
+
export declare const ORDER_ALREADY_CANCELLED: "ORDER_ALREADY_CANCELLED";
|
|
29
|
+
/**
|
|
30
|
+
* Snapshot content capture failed: neither a fresh adapter fetch nor a
|
|
31
|
+
* cache fallback produced a content payload. Per sourced-content §5.1,
|
|
32
|
+
* we deliberately fail the commit rather than snapshot from the
|
|
33
|
+
* indexed projection — refunds and audit need real "what was sold"
|
|
34
|
+
* content, not a stub.
|
|
35
|
+
*/
|
|
36
|
+
export declare const SNAPSHOT_CONTENT_UNAVAILABLE: "SNAPSHOT_CONTENT_UNAVAILABLE";
|
|
37
|
+
export type BookingEngineErrorCode = typeof NO_ADAPTER_REGISTERED | typeof NO_HANDLER_REGISTERED | typeof QUOTE_NOT_FOUND | typeof QUOTE_EXPIRED | typeof QUOTE_MISMATCH | typeof RESERVE_FAILED | typeof ORDER_NOT_FOUND | typeof ORDER_ALREADY_CANCELLED | typeof SNAPSHOT_CONTENT_UNAVAILABLE;
|
|
38
|
+
export declare class BookingEngineError extends Error {
|
|
39
|
+
readonly code: BookingEngineErrorCode;
|
|
40
|
+
readonly context?: Record<string, unknown> | undefined;
|
|
41
|
+
constructor(code: BookingEngineErrorCode, message: string, context?: Record<string, unknown> | undefined);
|
|
42
|
+
}
|
|
43
|
+
export declare class NoAdapterRegisteredError extends BookingEngineError {
|
|
44
|
+
/**
|
|
45
|
+
* Thrown when the registry has no adapter for the given identifier.
|
|
46
|
+
* The identifier is a connection id when dispatched per-connection
|
|
47
|
+
* (channel push, sourced bookings with a known connection) or a source
|
|
48
|
+
* kind when the caller has no connection id (legacy dispatch).
|
|
49
|
+
*/
|
|
50
|
+
constructor(identifier: string);
|
|
51
|
+
}
|
|
52
|
+
export declare class NoOwnedHandlerRegisteredError extends BookingEngineError {
|
|
53
|
+
/** Thrown when the owned-handler registry has no entry for the
|
|
54
|
+
* given `entity_module`. */
|
|
55
|
+
constructor(entityModule: string);
|
|
56
|
+
}
|
|
57
|
+
export declare class QuoteExpiredError extends BookingEngineError {
|
|
58
|
+
constructor(quoteId: string, expiredAt: Date);
|
|
59
|
+
}
|
|
60
|
+
export declare class QuoteMismatchError extends BookingEngineError {
|
|
61
|
+
constructor(quoteId: string, expected: {
|
|
62
|
+
entityModule: string;
|
|
63
|
+
entityId: string;
|
|
64
|
+
}, actual: {
|
|
65
|
+
entityModule: string;
|
|
66
|
+
entityId: string;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
export declare class ReserveFailedError extends BookingEngineError {
|
|
70
|
+
readonly upstreamPayload: unknown;
|
|
71
|
+
readonly sourceKind: string;
|
|
72
|
+
readonly entityId: string;
|
|
73
|
+
constructor(upstreamPayload: unknown, sourceKind: string, entityId: string);
|
|
74
|
+
}
|
|
75
|
+
export declare class SnapshotContentUnavailableError extends BookingEngineError {
|
|
76
|
+
readonly entityModule: string;
|
|
77
|
+
readonly entityId: string;
|
|
78
|
+
readonly fallbackReason: string;
|
|
79
|
+
constructor(entityModule: string, entityId: string, fallbackReason: string);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/booking-engine/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,mEAAmE;AACnE,eAAO,MAAM,qBAAqB,EAAG,uBAAgC,CAAA;AAErE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAG,uBAAgC,CAAA;AAErE,6DAA6D;AAC7D,eAAO,MAAM,eAAe,EAAG,iBAA0B,CAAA;AAEzD,iEAAiE;AACjE,eAAO,MAAM,aAAa,EAAG,eAAwB,CAAA;AAErD,0EAA0E;AAC1E,eAAO,MAAM,cAAc,EAAG,gBAAyB,CAAA;AAEvD,8DAA8D;AAC9D,eAAO,MAAM,cAAc,EAAG,gBAAyB,CAAA;AAEvD,mEAAmE;AACnE,eAAO,MAAM,eAAe,EAAG,iBAA0B,CAAA;AAEzD,4CAA4C;AAC5C,eAAO,MAAM,uBAAuB,EAAG,yBAAkC,CAAA;AAEzE;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,EAAG,8BAAuC,CAAA;AAEnF,MAAM,MAAM,sBAAsB,GAC9B,OAAO,qBAAqB,GAC5B,OAAO,qBAAqB,GAC5B,OAAO,eAAe,GACtB,OAAO,aAAa,GACpB,OAAO,cAAc,GACrB,OAAO,cAAc,GACrB,OAAO,eAAe,GACtB,OAAO,uBAAuB,GAC9B,OAAO,4BAA4B,CAAA;AAEvC,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,IAAI,EAAE,sBAAsB;aAE5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,sBAAsB,EAC5C,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AAED,qBAAa,wBAAyB,SAAQ,kBAAkB;IAC9D;;;;;OAKG;gBACS,UAAU,EAAE,MAAM;CAM/B;AAED,qBAAa,6BAA8B,SAAQ,kBAAkB;IACnE;iCAC6B;gBACjB,YAAY,EAAE,MAAM;CAMjC;AAED,qBAAa,iBAAkB,SAAQ,kBAAkB;gBAC3C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI;CAO7C;AAED,qBAAa,kBAAmB,SAAQ,kBAAkB;gBAEtD,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EACpD,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CASrD;AAED,qBAAa,kBAAmB,SAAQ,kBAAkB;aAEtC,eAAe,EAAE,OAAO;aACxB,UAAU,EAAE,MAAM;aAClB,QAAQ,EAAE,MAAM;gBAFhB,eAAe,EAAE,OAAO,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM;CASnC;AAED,qBAAa,+BAAgC,SAAQ,kBAAkB;aAEnD,YAAY,EAAE,MAAM;aACpB,QAAQ,EAAE,MAAM;aAChB,cAAc,EAAE,MAAM;gBAFtB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM;CASzC"}
|