@voyant-travel/db 0.108.0

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.
Files changed (336) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +60 -0
  3. package/dist/aggregate-snapshots.d.ts +66 -0
  4. package/dist/aggregate-snapshots.d.ts.map +1 -0
  5. package/dist/aggregate-snapshots.js +110 -0
  6. package/dist/aggregate-snapshots.js.map +1 -0
  7. package/dist/columns/collection.d.ts +37 -0
  8. package/dist/columns/collection.d.ts.map +1 -0
  9. package/dist/columns/collection.js +44 -0
  10. package/dist/columns/collection.js.map +1 -0
  11. package/dist/columns/cruise.d.ts +26 -0
  12. package/dist/columns/cruise.d.ts.map +1 -0
  13. package/dist/columns/cruise.js +31 -0
  14. package/dist/columns/cruise.js.map +1 -0
  15. package/dist/columns/departure-sub-tables.d.ts +179 -0
  16. package/dist/columns/departure-sub-tables.d.ts.map +1 -0
  17. package/dist/columns/departure-sub-tables.js +214 -0
  18. package/dist/columns/departure-sub-tables.js.map +1 -0
  19. package/dist/columns/departure.d.ts +20 -0
  20. package/dist/columns/departure.d.ts.map +1 -0
  21. package/dist/columns/departure.js +23 -0
  22. package/dist/columns/departure.js.map +1 -0
  23. package/dist/columns/destinations.d.ts +21 -0
  24. package/dist/columns/destinations.d.ts.map +1 -0
  25. package/dist/columns/destinations.js +24 -0
  26. package/dist/columns/destinations.js.map +1 -0
  27. package/dist/columns/index.d.ts +31 -0
  28. package/dist/columns/index.d.ts.map +1 -0
  29. package/dist/columns/index.js +57 -0
  30. package/dist/columns/index.js.map +1 -0
  31. package/dist/columns/itinerary-sub-tables.d.ts +177 -0
  32. package/dist/columns/itinerary-sub-tables.d.ts.map +1 -0
  33. package/dist/columns/itinerary-sub-tables.js +122 -0
  34. package/dist/columns/itinerary-sub-tables.js.map +1 -0
  35. package/dist/columns/itinerary.d.ts +17 -0
  36. package/dist/columns/itinerary.d.ts.map +1 -0
  37. package/dist/columns/itinerary.js +20 -0
  38. package/dist/columns/itinerary.js.map +1 -0
  39. package/dist/columns/lodging.d.ts +143 -0
  40. package/dist/columns/lodging.d.ts.map +1 -0
  41. package/dist/columns/lodging.js +164 -0
  42. package/dist/columns/lodging.js.map +1 -0
  43. package/dist/columns/offers.d.ts +31 -0
  44. package/dist/columns/offers.d.ts.map +1 -0
  45. package/dist/columns/offers.js +43 -0
  46. package/dist/columns/offers.js.map +1 -0
  47. package/dist/columns/pricing.d.ts +60 -0
  48. package/dist/columns/pricing.d.ts.map +1 -0
  49. package/dist/columns/pricing.js +71 -0
  50. package/dist/columns/pricing.js.map +1 -0
  51. package/dist/columns/product-accommodation.d.ts +99 -0
  52. package/dist/columns/product-accommodation.d.ts.map +1 -0
  53. package/dist/columns/product-accommodation.js +65 -0
  54. package/dist/columns/product-accommodation.js.map +1 -0
  55. package/dist/columns/product-addons.d.ts +18 -0
  56. package/dist/columns/product-addons.d.ts.map +1 -0
  57. package/dist/columns/product-addons.js +21 -0
  58. package/dist/columns/product-addons.js.map +1 -0
  59. package/dist/columns/product-availability-states.d.ts +65 -0
  60. package/dist/columns/product-availability-states.d.ts.map +1 -0
  61. package/dist/columns/product-availability-states.js +81 -0
  62. package/dist/columns/product-availability-states.js.map +1 -0
  63. package/dist/columns/product-availability.d.ts +21 -0
  64. package/dist/columns/product-availability.d.ts.map +1 -0
  65. package/dist/columns/product-availability.js +24 -0
  66. package/dist/columns/product-availability.js.map +1 -0
  67. package/dist/columns/product-booking-rules.d.ts +45 -0
  68. package/dist/columns/product-booking-rules.d.ts.map +1 -0
  69. package/dist/columns/product-booking-rules.js +55 -0
  70. package/dist/columns/product-booking-rules.js.map +1 -0
  71. package/dist/columns/product-category-assignments.d.ts +17 -0
  72. package/dist/columns/product-category-assignments.d.ts.map +1 -0
  73. package/dist/columns/product-category-assignments.js +20 -0
  74. package/dist/columns/product-category-assignments.js.map +1 -0
  75. package/dist/columns/product-extensions.d.ts +24 -0
  76. package/dist/columns/product-extensions.d.ts.map +1 -0
  77. package/dist/columns/product-extensions.js +27 -0
  78. package/dist/columns/product-extensions.js.map +1 -0
  79. package/dist/columns/product-media.d.ts +19 -0
  80. package/dist/columns/product-media.d.ts.map +1 -0
  81. package/dist/columns/product-media.js +22 -0
  82. package/dist/columns/product-media.js.map +1 -0
  83. package/dist/columns/product-overrides.d.ts +19 -0
  84. package/dist/columns/product-overrides.d.ts.map +1 -0
  85. package/dist/columns/product-overrides.js +22 -0
  86. package/dist/columns/product-overrides.js.map +1 -0
  87. package/dist/columns/product-preferences.d.ts +51 -0
  88. package/dist/columns/product-preferences.d.ts.map +1 -0
  89. package/dist/columns/product-preferences.js +59 -0
  90. package/dist/columns/product-preferences.js.map +1 -0
  91. package/dist/columns/product-publish-settings.d.ts +18 -0
  92. package/dist/columns/product-publish-settings.d.ts.map +1 -0
  93. package/dist/columns/product-publish-settings.js +21 -0
  94. package/dist/columns/product-publish-settings.js.map +1 -0
  95. package/dist/columns/product-rate-plans.d.ts +28 -0
  96. package/dist/columns/product-rate-plans.d.ts.map +1 -0
  97. package/dist/columns/product-rate-plans.js +33 -0
  98. package/dist/columns/product-rate-plans.js.map +1 -0
  99. package/dist/columns/product-translations.d.ts +24 -0
  100. package/dist/columns/product-translations.d.ts.map +1 -0
  101. package/dist/columns/product-translations.js +27 -0
  102. package/dist/columns/product-translations.js.map +1 -0
  103. package/dist/columns/product-versions.d.ts +19 -0
  104. package/dist/columns/product-versions.d.ts.map +1 -0
  105. package/dist/columns/product-versions.js +22 -0
  106. package/dist/columns/product-versions.js.map +1 -0
  107. package/dist/columns/product-visibility.d.ts +16 -0
  108. package/dist/columns/product-visibility.d.ts.map +1 -0
  109. package/dist/columns/product-visibility.js +19 -0
  110. package/dist/columns/product-visibility.js.map +1 -0
  111. package/dist/columns/product.d.ts +56 -0
  112. package/dist/columns/product.d.ts.map +1 -0
  113. package/dist/columns/product.js +44 -0
  114. package/dist/columns/product.js.map +1 -0
  115. package/dist/columns/room.d.ts +117 -0
  116. package/dist/columns/room.d.ts.map +1 -0
  117. package/dist/columns/room.js +86 -0
  118. package/dist/columns/room.js.map +1 -0
  119. package/dist/columns/ship.d.ts +22 -0
  120. package/dist/columns/ship.d.ts.map +1 -0
  121. package/dist/columns/ship.js +25 -0
  122. package/dist/columns/ship.js.map +1 -0
  123. package/dist/columns/tags.d.ts +33 -0
  124. package/dist/columns/tags.d.ts.map +1 -0
  125. package/dist/columns/tags.js +38 -0
  126. package/dist/columns/tags.js.map +1 -0
  127. package/dist/columns/transport.d.ts +53 -0
  128. package/dist/columns/transport.d.ts.map +1 -0
  129. package/dist/columns/transport.js +62 -0
  130. package/dist/columns/transport.js.map +1 -0
  131. package/dist/connection-config.d.ts +101 -0
  132. package/dist/connection-config.d.ts.map +1 -0
  133. package/dist/connection-config.js +106 -0
  134. package/dist/connection-config.js.map +1 -0
  135. package/dist/crud.d.ts +87 -0
  136. package/dist/crud.d.ts.map +1 -0
  137. package/dist/crud.js +190 -0
  138. package/dist/crud.js.map +1 -0
  139. package/dist/helpers.d.ts +33 -0
  140. package/dist/helpers.d.ts.map +1 -0
  141. package/dist/helpers.js +49 -0
  142. package/dist/helpers.js.map +1 -0
  143. package/dist/index.d.ts +109 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +155 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/lib/index.d.ts +3 -0
  148. package/dist/lib/index.d.ts.map +1 -0
  149. package/dist/lib/index.js +5 -0
  150. package/dist/lib/index.js.map +1 -0
  151. package/dist/lib/typeid-column.d.ts +75 -0
  152. package/dist/lib/typeid-column.d.ts.map +1 -0
  153. package/dist/lib/typeid-column.js +92 -0
  154. package/dist/lib/typeid-column.js.map +1 -0
  155. package/dist/lib/typeid-core.d.ts +36 -0
  156. package/dist/lib/typeid-core.d.ts.map +1 -0
  157. package/dist/lib/typeid-core.js +67 -0
  158. package/dist/lib/typeid-core.js.map +1 -0
  159. package/dist/lib/typeid-prefixes.d.ts +342 -0
  160. package/dist/lib/typeid-prefixes.d.ts.map +1 -0
  161. package/dist/lib/typeid-prefixes.js +379 -0
  162. package/dist/lib/typeid-prefixes.js.map +1 -0
  163. package/dist/lib/typeid-schemas.d.ts +206 -0
  164. package/dist/lib/typeid-schemas.d.ts.map +1 -0
  165. package/dist/lib/typeid-schemas.js +207 -0
  166. package/dist/lib/typeid-schemas.js.map +1 -0
  167. package/dist/lib/typeid-zod.d.ts +16 -0
  168. package/dist/lib/typeid-zod.d.ts.map +1 -0
  169. package/dist/lib/typeid-zod.js +29 -0
  170. package/dist/lib/typeid-zod.js.map +1 -0
  171. package/dist/lib/typeid.d.ts +2 -0
  172. package/dist/lib/typeid.d.ts.map +1 -0
  173. package/dist/lib/typeid.js +6 -0
  174. package/dist/lib/typeid.js.map +1 -0
  175. package/dist/lifecycle.d.ts +24 -0
  176. package/dist/lifecycle.d.ts.map +1 -0
  177. package/dist/lifecycle.js +30 -0
  178. package/dist/lifecycle.js.map +1 -0
  179. package/dist/links.d.ts +22 -0
  180. package/dist/links.d.ts.map +1 -0
  181. package/dist/links.js +281 -0
  182. package/dist/links.js.map +1 -0
  183. package/dist/operators.d.ts +9 -0
  184. package/dist/operators.d.ts.map +1 -0
  185. package/dist/operators.js +9 -0
  186. package/dist/operators.js.map +1 -0
  187. package/dist/outbox.d.ts +87 -0
  188. package/dist/outbox.d.ts.map +1 -0
  189. package/dist/outbox.js +245 -0
  190. package/dist/outbox.js.map +1 -0
  191. package/dist/primitives/catalog-schemas.d.ts +101 -0
  192. package/dist/primitives/catalog-schemas.d.ts.map +1 -0
  193. package/dist/primitives/catalog-schemas.js +69 -0
  194. package/dist/primitives/catalog-schemas.js.map +1 -0
  195. package/dist/primitives/catalog.d.ts +47 -0
  196. package/dist/primitives/catalog.d.ts.map +1 -0
  197. package/dist/primitives/catalog.js +94 -0
  198. package/dist/primitives/catalog.js.map +1 -0
  199. package/dist/primitives/index.d.ts +4 -0
  200. package/dist/primitives/index.d.ts.map +1 -0
  201. package/dist/primitives/index.js +4 -0
  202. package/dist/primitives/index.js.map +1 -0
  203. package/dist/primitives/offers.d.ts +224 -0
  204. package/dist/primitives/offers.d.ts.map +1 -0
  205. package/dist/primitives/offers.js +132 -0
  206. package/dist/primitives/offers.js.map +1 -0
  207. package/dist/queries/index.d.ts +18 -0
  208. package/dist/queries/index.d.ts.map +1 -0
  209. package/dist/queries/index.js +30 -0
  210. package/dist/queries/index.js.map +1 -0
  211. package/dist/runtime/index.d.ts +4 -0
  212. package/dist/runtime/index.d.ts.map +1 -0
  213. package/dist/runtime/index.js +5 -0
  214. package/dist/runtime/index.js.map +1 -0
  215. package/dist/runtime/locks.d.ts +5 -0
  216. package/dist/runtime/locks.d.ts.map +1 -0
  217. package/dist/runtime/locks.js +36 -0
  218. package/dist/runtime/locks.js.map +1 -0
  219. package/dist/schema/00_ensure_schemas.d.ts +5 -0
  220. package/dist/schema/00_ensure_schemas.d.ts.map +1 -0
  221. package/dist/schema/00_ensure_schemas.js +6 -0
  222. package/dist/schema/00_ensure_schemas.js.map +1 -0
  223. package/dist/schema/aggregate-snapshots.d.ts +97 -0
  224. package/dist/schema/aggregate-snapshots.d.ts.map +1 -0
  225. package/dist/schema/aggregate-snapshots.js +27 -0
  226. package/dist/schema/aggregate-snapshots.js.map +1 -0
  227. package/dist/schema/iam/apikey.d.ts +396 -0
  228. package/dist/schema/iam/apikey.d.ts.map +1 -0
  229. package/dist/schema/iam/apikey.js +41 -0
  230. package/dist/schema/iam/apikey.js.map +1 -0
  231. package/dist/schema/iam/auth.d.ts +1026 -0
  232. package/dist/schema/iam/auth.d.ts.map +1 -0
  233. package/dist/schema/iam/auth.js +138 -0
  234. package/dist/schema/iam/auth.js.map +1 -0
  235. package/dist/schema/iam/cloud_auth.d.ts +446 -0
  236. package/dist/schema/iam/cloud_auth.d.ts.map +1 -0
  237. package/dist/schema/iam/cloud_auth.js +46 -0
  238. package/dist/schema/iam/cloud_auth.js.map +1 -0
  239. package/dist/schema/iam/index.d.ts +8 -0
  240. package/dist/schema/iam/index.d.ts.map +1 -0
  241. package/dist/schema/iam/index.js +8 -0
  242. package/dist/schema/iam/index.js.map +1 -0
  243. package/dist/schema/iam/invitations.d.ts +173 -0
  244. package/dist/schema/iam/invitations.d.ts.map +1 -0
  245. package/dist/schema/iam/invitations.js +27 -0
  246. package/dist/schema/iam/invitations.js.map +1 -0
  247. package/dist/schema/iam/kms.d.ts +53 -0
  248. package/dist/schema/iam/kms.d.ts.map +1 -0
  249. package/dist/schema/iam/kms.js +40 -0
  250. package/dist/schema/iam/kms.js.map +1 -0
  251. package/dist/schema/iam/roles.d.ts +12 -0
  252. package/dist/schema/iam/roles.d.ts.map +1 -0
  253. package/dist/schema/iam/roles.js +12 -0
  254. package/dist/schema/iam/roles.js.map +1 -0
  255. package/dist/schema/iam/user_profiles.d.ts +442 -0
  256. package/dist/schema/iam/user_profiles.d.ts.map +1 -0
  257. package/dist/schema/iam/user_profiles.js +125 -0
  258. package/dist/schema/iam/user_profiles.js.map +1 -0
  259. package/dist/schema/index.d.ts +5 -0
  260. package/dist/schema/index.d.ts.map +1 -0
  261. package/dist/schema/index.js +5 -0
  262. package/dist/schema/index.js.map +1 -0
  263. package/dist/schema/infra/domains.d.ts +609 -0
  264. package/dist/schema/infra/domains.d.ts.map +1 -0
  265. package/dist/schema/infra/domains.js +108 -0
  266. package/dist/schema/infra/domains.js.map +1 -0
  267. package/dist/schema/infra/email_domain_records.d.ts +255 -0
  268. package/dist/schema/infra/email_domain_records.d.ts.map +1 -0
  269. package/dist/schema/infra/email_domain_records.js +65 -0
  270. package/dist/schema/infra/email_domain_records.js.map +1 -0
  271. package/dist/schema/infra/event_outbox.d.ts +232 -0
  272. package/dist/schema/infra/event_outbox.d.ts.map +1 -0
  273. package/dist/schema/infra/event_outbox.js +59 -0
  274. package/dist/schema/infra/event_outbox.js.map +1 -0
  275. package/dist/schema/infra/idempotency_keys.d.ts +186 -0
  276. package/dist/schema/infra/idempotency_keys.d.ts.map +1 -0
  277. package/dist/schema/infra/idempotency_keys.js +40 -0
  278. package/dist/schema/infra/idempotency_keys.js.map +1 -0
  279. package/dist/schema/infra/index.d.ts +9 -0
  280. package/dist/schema/infra/index.d.ts.map +1 -0
  281. package/dist/schema/infra/index.js +10 -0
  282. package/dist/schema/infra/index.js.map +1 -0
  283. package/dist/schema/infra/public_document_delivery_grants.d.ts +356 -0
  284. package/dist/schema/infra/public_document_delivery_grants.d.ts.map +1 -0
  285. package/dist/schema/infra/public_document_delivery_grants.js +36 -0
  286. package/dist/schema/infra/public_document_delivery_grants.js.map +1 -0
  287. package/dist/schema/infra/rate_limit_buckets.d.ts +138 -0
  288. package/dist/schema/infra/rate_limit_buckets.d.ts.map +1 -0
  289. package/dist/schema/infra/rate_limit_buckets.js +52 -0
  290. package/dist/schema/infra/rate_limit_buckets.js.map +1 -0
  291. package/dist/schema/infra/webhook_deliveries.d.ts +572 -0
  292. package/dist/schema/infra/webhook_deliveries.d.ts.map +1 -0
  293. package/dist/schema/infra/webhook_deliveries.js +136 -0
  294. package/dist/schema/infra/webhook_deliveries.js.map +1 -0
  295. package/dist/schema/infra/webhook_subscriptions.d.ts +284 -0
  296. package/dist/schema/infra/webhook_subscriptions.d.ts.map +1 -0
  297. package/dist/schema/infra/webhook_subscriptions.js +64 -0
  298. package/dist/schema/infra/webhook_subscriptions.js.map +1 -0
  299. package/dist/schema/infra/write_intents.d.ts +185 -0
  300. package/dist/schema/infra/write_intents.d.ts.map +1 -0
  301. package/dist/schema/infra/write_intents.js +50 -0
  302. package/dist/schema/infra/write_intents.js.map +1 -0
  303. package/dist/schema/voyant/bookings.d.ts +2 -0
  304. package/dist/schema/voyant/bookings.d.ts.map +1 -0
  305. package/dist/schema/voyant/bookings.js +2 -0
  306. package/dist/schema/voyant/bookings.js.map +1 -0
  307. package/dist/schema/voyant/finance.d.ts +2 -0
  308. package/dist/schema/voyant/finance.d.ts.map +1 -0
  309. package/dist/schema/voyant/finance.js +2 -0
  310. package/dist/schema/voyant/finance.js.map +1 -0
  311. package/dist/test-utils.d.ts +17 -0
  312. package/dist/test-utils.d.ts.map +1 -0
  313. package/dist/test-utils.js +56 -0
  314. package/dist/test-utils.js.map +1 -0
  315. package/dist/transaction-capability.d.ts +11 -0
  316. package/dist/transaction-capability.d.ts.map +1 -0
  317. package/dist/transaction-capability.js +17 -0
  318. package/dist/transaction-capability.js.map +1 -0
  319. package/dist/transaction.d.ts +31 -0
  320. package/dist/transaction.d.ts.map +1 -0
  321. package/dist/transaction.js +72 -0
  322. package/dist/transaction.js.map +1 -0
  323. package/dist/tsconfig.tsbuildinfo +1 -0
  324. package/dist/types.d.ts +10 -0
  325. package/dist/types.d.ts.map +1 -0
  326. package/dist/types.js +2 -0
  327. package/dist/types.js.map +1 -0
  328. package/dist/utils.d.ts +2 -0
  329. package/dist/utils.d.ts.map +1 -0
  330. package/dist/utils.js +19 -0
  331. package/dist/utils.js.map +1 -0
  332. package/dist/write-intents.d.ts +51 -0
  333. package/dist/write-intents.d.ts.map +1 -0
  334. package/dist/write-intents.js +95 -0
  335. package/dist/write-intents.js.map +1 -0
  336. package/package.json +306 -0
@@ -0,0 +1,132 @@
1
+ import { z } from "zod";
2
+ // -----------------------------------------------------------------------------
3
+ // Constants
4
+ // -----------------------------------------------------------------------------
5
+ export const OFFER_STATUSES = [
6
+ "draft",
7
+ "scheduled",
8
+ "active",
9
+ "paused",
10
+ "expired",
11
+ "archived",
12
+ ];
13
+ export const OFFER_DISCOUNT_TYPES = ["percentage", "fixed_amount"];
14
+ export const OFFER_CHANNELS = ["website", "admin", "api", "marketplace"];
15
+ export const OFFER_CUSTOMER_SEGMENTS = [
16
+ "new",
17
+ "returning",
18
+ "vip",
19
+ "loyalty_gold",
20
+ "loyalty_silver",
21
+ "loyalty_bronze",
22
+ ];
23
+ // -----------------------------------------------------------------------------
24
+ // Condition Schemas (for JSONB conditions column)
25
+ // -----------------------------------------------------------------------------
26
+ /**
27
+ * Condition: Booking window (days before departure)
28
+ * Used for early bird / last minute deals
29
+ */
30
+ export const bookingWindowConditionSchema = z.object({
31
+ type: z.literal("booking_window"),
32
+ minDaysBefore: z.number().int().min(0).optional(),
33
+ maxDaysBefore: z.number().int().min(0).optional(),
34
+ });
35
+ /**
36
+ * Condition: Minimum travelers
37
+ * Used for group booking discounts
38
+ */
39
+ export const minPaxConditionSchema = z.object({
40
+ type: z.literal("min_pax"),
41
+ minPassengers: z.number().int().min(1),
42
+ });
43
+ /**
44
+ * Condition: Booking date range
45
+ * Offer applies when booking is made within date range
46
+ */
47
+ export const bookingDateConditionSchema = z.object({
48
+ type: z.literal("booking_date"),
49
+ from: z.string().datetime().optional(),
50
+ to: z.string().datetime().optional(),
51
+ });
52
+ /**
53
+ * Condition: Customer segments
54
+ * Offer applies to specific customer types
55
+ */
56
+ export const customerSegmentConditionSchema = z.object({
57
+ type: z.literal("customer_segment"),
58
+ segments: z.array(z.string()),
59
+ });
60
+ /**
61
+ * Condition: Booking channels
62
+ * Offer applies on specific booking channels
63
+ */
64
+ export const channelConditionSchema = z.object({
65
+ type: z.literal("channel"),
66
+ channels: z.array(z.enum(OFFER_CHANNELS)),
67
+ });
68
+ /**
69
+ * Condition: First-time customer
70
+ * Offer only for new customers
71
+ */
72
+ export const firstTimeCustomerConditionSchema = z.object({
73
+ type: z.literal("first_time_customer"),
74
+ enabled: z.boolean(),
75
+ });
76
+ /**
77
+ * Union of all condition types
78
+ */
79
+ export const offerConditionSchema = z.discriminatedUnion("type", [
80
+ bookingWindowConditionSchema,
81
+ minPaxConditionSchema,
82
+ bookingDateConditionSchema,
83
+ customerSegmentConditionSchema,
84
+ channelConditionSchema,
85
+ firstTimeCustomerConditionSchema,
86
+ ]);
87
+ /**
88
+ * Full conditions object (array of conditions - all must match)
89
+ */
90
+ export const offerConditionsSchema = z.object({
91
+ conditions: z.array(offerConditionSchema).optional().default([]),
92
+ });
93
+ // -----------------------------------------------------------------------------
94
+ // Enum Schemas
95
+ // -----------------------------------------------------------------------------
96
+ export const offerStatusSchema = z.enum(OFFER_STATUSES);
97
+ export const offerDiscountTypeSchema = z.enum(OFFER_DISCOUNT_TYPES);
98
+ export const offerChannelSchema = z.enum(OFFER_CHANNELS);
99
+ export const offerCustomerSegmentSchema = z.enum(OFFER_CUSTOMER_SEGMENTS);
100
+ // -----------------------------------------------------------------------------
101
+ // Core Field Schemas
102
+ // -----------------------------------------------------------------------------
103
+ /**
104
+ * Core offer fields schema - shared validation for common offer columns.
105
+ * Used by both db-main and db-marketplace.
106
+ */
107
+ export const offerCoreFieldsSchema = z.object({
108
+ name: z.string().min(1, "Name is required").max(255, "Name must be 255 characters or less"),
109
+ description: z.string().max(2000).nullable().optional(),
110
+ badge: z.string().max(50).nullable().optional(),
111
+ discountType: offerDiscountTypeSchema,
112
+ discountValue: z.string().min(1, "Discount value is required"), // Stored as string for decimal precision
113
+ currency: z.string().length(3, "Currency must be a 3-letter ISO code").nullable().optional(), // Only required for fixed_amount
114
+ applicableProductIds: z.array(z.string()).nullable().optional(),
115
+ applicableDepartureIds: z.array(z.string()).nullable().optional(),
116
+ validFrom: z.date().nullable().optional(),
117
+ validTo: z.date().nullable().optional(),
118
+ conditions: offerConditionsSchema.optional().default({ conditions: [] }),
119
+ stackable: z.boolean().default(false),
120
+ stackingGroup: z.string().max(100).nullable().optional(),
121
+ priority: z.number().int().min(0).max(1000).default(100),
122
+ isActive: z.boolean().default(true),
123
+ displayPriority: z.number().int().default(0),
124
+ });
125
+ /**
126
+ * Timestamp fields for offers
127
+ */
128
+ export const offerTimestampsSchema = z.object({
129
+ createdAt: z.date(),
130
+ updatedAt: z.date(),
131
+ });
132
+ //# sourceMappingURL=offers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offers.js","sourceRoot":"","sources":["../../src/primitives/offers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type SQLWrapper } from "drizzle-orm";
2
+ import type { AnyPgTable } from "drizzle-orm/pg-core";
3
+ import type { DrizzleClient } from "../types.js";
4
+ export type KeysetPage<T> = {
5
+ rows: T[];
6
+ nextCursor?: string;
7
+ };
8
+ type KeysetQuery<TRow> = PromiseLike<TRow[]> & {
9
+ limit(limit: number): KeysetQuery<TRow>;
10
+ orderBy(orderExpr: SQLWrapper): KeysetQuery<TRow>;
11
+ where(condition: SQLWrapper): KeysetQuery<TRow>;
12
+ };
13
+ export declare function keysetPaginate<TRow extends Record<string, unknown>>(db: DrizzleClient, queryBuilder: (db: DrizzleClient) => KeysetQuery<TRow>, orderExpr: SQLWrapper, getCursor: (row: TRow) => string | Date, cursorValue?: string, limit?: number): Promise<KeysetPage<TRow>>;
14
+ export declare function batchInsert<TTable extends AnyPgTable>(db: DrizzleClient, table: TTable, values: Array<TTable["$inferInsert"]>, chunkSize?: number): Promise<void>;
15
+ type TransactionFor<TDb extends DrizzleClient> = Parameters<TDb["transaction"]>[0] extends (tx: infer TTransaction, ...args: never[]) => Promise<unknown> ? TTransaction : never;
16
+ export declare function withTransaction<T, TDb extends DrizzleClient>(db: TDb, run: (tx: TransactionFor<TDb>) => Promise<T>): Promise<T>;
17
+ export {};
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queries/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAG9D,KAAK,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,GAAG;IAC7C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACvC,OAAO,CAAC,SAAS,EAAE,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IACjD,KAAK,CAAC,SAAS,EAAE,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;CAChD,CAAA;AAED,wBAAsB,cAAc,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,EAAE,EAAE,aAAa,EACjB,YAAY,EAAE,CAAC,EAAE,EAAE,aAAa,KAAK,WAAW,CAAC,IAAI,CAAC,EACtD,SAAS,EAAE,UAAU,EACrB,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,MAAM,GAAG,IAAI,EACvC,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,SAAK,GACT,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAoB3B;AAED,wBAAsB,WAAW,CAAC,MAAM,SAAS,UAAU,EACzD,EAAE,EAAE,aAAa,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EACrC,SAAS,SAAO,iBAMjB;AAED,KAAK,cAAc,CAAC,GAAG,SAAS,aAAa,IAAI,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CACzF,EAAE,EAAE,MAAM,YAAY,EACtB,GAAG,IAAI,EAAE,KAAK,EAAE,KACb,OAAO,CAAC,OAAO,CAAC,GACjB,YAAY,GACZ,KAAK,CAAA;AAET,wBAAsB,eAAe,CAAC,CAAC,EAAE,GAAG,SAAS,aAAa,EAChE,EAAE,EAAE,GAAG,EACP,GAAG,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,cAG7C"}
@@ -0,0 +1,30 @@
1
+ import { gt } from "drizzle-orm";
2
+ export async function keysetPaginate(db, queryBuilder, orderExpr, getCursor, cursorValue, limit = 20) {
3
+ let qb = queryBuilder(db)
4
+ .orderBy(orderExpr)
5
+ .limit(limit + 1);
6
+ if (cursorValue) {
7
+ // A simple date check, can be made more robust
8
+ const cursorAsDate = new Date(cursorValue);
9
+ if (!Number.isNaN(cursorAsDate.getTime())) {
10
+ qb = qb.where(gt(orderExpr, cursorAsDate));
11
+ }
12
+ }
13
+ const rows = (await qb);
14
+ const hasNext = rows.length > limit;
15
+ if (hasNext)
16
+ rows.pop();
17
+ const lastRow = rows[rows.length - 1];
18
+ const nextCursor = hasNext && lastRow ? getCursor(lastRow)?.toString() : undefined;
19
+ return { rows, nextCursor };
20
+ }
21
+ export async function batchInsert(db, table, values, chunkSize = 1000) {
22
+ for (let i = 0; i < values.length; i += chunkSize) {
23
+ const chunk = values.slice(i, i + chunkSize);
24
+ await db.insert(table).values(chunk);
25
+ }
26
+ }
27
+ export async function withTransaction(db, run) {
28
+ return db.transaction(async (tx) => run(tx));
29
+ }
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queries/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAmB,MAAM,aAAa,CAAA;AAcjD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAiB,EACjB,YAAsD,EACtD,SAAqB,EACrB,SAAuC,EACvC,WAAoB,EACpB,KAAK,GAAG,EAAE;IAEV,IAAI,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC;SACtB,OAAO,CAAC,SAAS,CAAC;SAClB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IAEnB,IAAI,WAAW,EAAE,CAAC;QAChB,+CAA+C;QAC/C,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAA;QAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC1C,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAW,CAAA;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;IACnC,IAAI,OAAO;QAAE,IAAI,CAAC,GAAG,EAAE,CAAA;IAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAClF,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAiB,EACjB,KAAa,EACb,MAAqC,EACrC,SAAS,GAAG,IAAI;IAEhB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAA;QAC5C,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC;AACH,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAO,EACP,GAA4C;IAE5C,OAAO,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAyB,CAAC,CAAC,CAAA;AACrE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createDbClient, createServerlessDbClient, type DbAdapter, type DisposableDbClient, db, getDb, } from "../index.js";
2
+ export { dbClientDispose, dbSupportsTransactions, VOYANT_DB_DISPOSE, VOYANT_DB_SUPPORTS_TRANSACTIONS, } from "../transaction-capability.js";
3
+ export { createPostgresAdvisoryLockManager } from "./locks.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,EAAE,EACF,KAAK,GACN,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,+BAA+B,GAChC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,5 @@
1
+ // Runtime exports for compatibility with edge/node adapters
2
+ export { createDbClient, createServerlessDbClient, db, getDb, } from "../index.js";
3
+ export { dbClientDispose, dbSupportsTransactions, VOYANT_DB_DISPOSE, VOYANT_DB_SUPPORTS_TRANSACTIONS, } from "../transaction-capability.js";
4
+ export { createPostgresAdvisoryLockManager } from "./locks.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EACL,cAAc,EACd,wBAAwB,EAGxB,EAAE,EACF,KAAK,GACN,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,iBAAiB,EACjB,+BAA+B,GAChC,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ExecutionLockManager } from "@voyant-travel/core";
2
+ export declare function createPostgresAdvisoryLockManager(connectionString: string, options?: {
3
+ namespace?: string;
4
+ }): ExecutionLockManager;
5
+ //# sourceMappingURL=locks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../../src/runtime/locks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAK/D,wBAAgB,iCAAiC,CAC/C,gBAAgB,EAAE,MAAM,EACxB,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,MAAM,CAAA;CACd,GACL,oBAAoB,CAoCtB"}
@@ -0,0 +1,36 @@
1
+ import postgres from "postgres";
2
+ export function createPostgresAdvisoryLockManager(connectionString, options = {}) {
3
+ const sql = postgres(connectionString, {
4
+ max: 1,
5
+ });
6
+ const resolveKey = (key) => {
7
+ const namespace = options.namespace?.trim();
8
+ return namespace ? `${namespace}:${key}` : key;
9
+ };
10
+ return {
11
+ async runExclusive(key, task) {
12
+ const lockKey = resolveKey(key);
13
+ const acquireResult = await sql `
14
+ SELECT pg_try_advisory_lock(hashtextextended(${lockKey}, 0)) AS locked
15
+ `;
16
+ if (!acquireResult[0]?.locked) {
17
+ return { executed: false };
18
+ }
19
+ try {
20
+ return {
21
+ executed: true,
22
+ value: await task(),
23
+ };
24
+ }
25
+ finally {
26
+ await sql `
27
+ SELECT pg_advisory_unlock(hashtextextended(${lockKey}, 0))
28
+ `;
29
+ }
30
+ },
31
+ async dispose() {
32
+ await sql.end({ timeout: 0 });
33
+ },
34
+ };
35
+ }
36
+ //# sourceMappingURL=locks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locks.js","sourceRoot":"","sources":["../../src/runtime/locks.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAI/B,MAAM,UAAU,iCAAiC,CAC/C,gBAAwB,EACxB,UAEI,EAAE;IAEN,MAAM,GAAG,GAAG,QAAQ,CAAC,gBAAgB,EAAE;QACrC,GAAG,EAAE,CAAC;KACP,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,CAAA;QAC3C,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IAChD,CAAC,CAAA;IAED,OAAO;QACL,KAAK,CAAC,YAAY,CAAI,GAAW,EAAE,IAAsB;YACvD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;YAC/B,MAAM,aAAa,GAAG,MAAM,GAAG,CAAmB;uDACD,OAAO;OACvD,CAAA;YAED,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;gBAC9B,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;YAC5B,CAAC;YAED,IAAI,CAAC;gBACH,OAAO;oBACL,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,MAAM,IAAI,EAAE;iBACpB,CAAA;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,GAAG,CAAA;uDACsC,OAAO;SACrD,CAAA;YACH,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO;YACX,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;QAC/B,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const ensurePgcryptoExtension: import("drizzle-orm").SQL<unknown>;
2
+ export declare const ensureUnaccentExtension: import("drizzle-orm").SQL<unknown>;
3
+ export declare const ensureIamSchema: import("drizzle-orm").SQL<unknown>;
4
+ export declare const ensureInfraSchema: import("drizzle-orm").SQL<unknown>;
5
+ //# sourceMappingURL=00_ensure_schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"00_ensure_schemas.d.ts","sourceRoot":"","sources":["../../src/schema/00_ensure_schemas.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,oCAAkD,CAAA;AACtF,eAAO,MAAM,uBAAuB,oCAAkD,CAAA;AACtF,eAAO,MAAM,eAAe,oCAA0C,CAAA;AACtE,eAAO,MAAM,iBAAiB,oCAA4C,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { sql } from "drizzle-orm";
2
+ export const ensurePgcryptoExtension = sql `CREATE EXTENSION IF NOT EXISTS "pgcrypto";`;
3
+ export const ensureUnaccentExtension = sql `CREATE EXTENSION IF NOT EXISTS "unaccent";`;
4
+ export const ensureIamSchema = sql `CREATE SCHEMA IF NOT EXISTS "iam";`;
5
+ export const ensureInfraSchema = sql `CREATE SCHEMA IF NOT EXISTS "infra";`;
6
+ //# sourceMappingURL=00_ensure_schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"00_ensure_schemas.js","sourceRoot":"","sources":["../../src/schema/00_ensure_schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAA,4CAA4C,CAAA;AACtF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAA,4CAA4C,CAAA;AACtF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA,oCAAoC,CAAA;AACtE,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAA,sCAAsC,CAAA"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Read-through TTL snapshots for expensive aggregate computations —
3
+ * primarily the admin dashboard `/aggregates` endpoints (bookings,
4
+ * products, suppliers, finance, availability), which otherwise recompute
5
+ * 3-11 live queries on every dashboard load.
6
+ *
7
+ * `key` is a semantic cache key, NOT a typeid — e.g.
8
+ * `finance:aggregates:<paramsHash>`. Callers build it with
9
+ * `aggregateSnapshotKey(...)` from `@voyant-travel/db/aggregate-snapshots`,
10
+ * which folds query params into the key so distinct param sets get
11
+ * distinct snapshots.
12
+ *
13
+ * `payload` is the JSON-serialized computation result; `staleAfter`
14
+ * marks the end of the freshness window. Rows past `staleAfter` are
15
+ * recomputed in place by the next reader (upsert, last write wins) —
16
+ * stale rows are never served, so no sweeper is required, but a
17
+ * periodic `DELETE WHERE stale_after < now() - interval '...'` keeps
18
+ * abandoned keys from accumulating (hence the `stale_after` index).
19
+ */
20
+ export declare const aggregateSnapshots: Omit<import("drizzle-orm/pg-core").PgTableWithColumns<{
21
+ name: "aggregate_snapshots";
22
+ schema: undefined;
23
+ columns: {
24
+ key: import("drizzle-orm/pg-core").PgColumn<{
25
+ name: "key";
26
+ tableName: "aggregate_snapshots";
27
+ dataType: "string";
28
+ columnType: "PgText";
29
+ data: string;
30
+ driverParam: string;
31
+ notNull: true;
32
+ hasDefault: false;
33
+ isPrimaryKey: true;
34
+ isAutoincrement: false;
35
+ hasRuntimeDefault: false;
36
+ enumValues: [string, ...string[]];
37
+ baseColumn: never;
38
+ identity: undefined;
39
+ generated: undefined;
40
+ }, {}, {}>;
41
+ payload: import("drizzle-orm/pg-core").PgColumn<{
42
+ name: "payload";
43
+ tableName: "aggregate_snapshots";
44
+ dataType: "json";
45
+ columnType: "PgJsonb";
46
+ data: unknown;
47
+ driverParam: unknown;
48
+ notNull: true;
49
+ hasDefault: false;
50
+ isPrimaryKey: false;
51
+ isAutoincrement: false;
52
+ hasRuntimeDefault: false;
53
+ enumValues: undefined;
54
+ baseColumn: never;
55
+ identity: undefined;
56
+ generated: undefined;
57
+ }, {}, {}>;
58
+ computedAt: import("drizzle-orm/pg-core").PgColumn<{
59
+ name: "computed_at";
60
+ tableName: "aggregate_snapshots";
61
+ dataType: "date";
62
+ columnType: "PgTimestamp";
63
+ data: Date;
64
+ driverParam: string;
65
+ notNull: true;
66
+ hasDefault: true;
67
+ isPrimaryKey: false;
68
+ isAutoincrement: false;
69
+ hasRuntimeDefault: false;
70
+ enumValues: undefined;
71
+ baseColumn: never;
72
+ identity: undefined;
73
+ generated: undefined;
74
+ }, {}, {}>;
75
+ staleAfter: import("drizzle-orm/pg-core").PgColumn<{
76
+ name: "stale_after";
77
+ tableName: "aggregate_snapshots";
78
+ dataType: "date";
79
+ columnType: "PgTimestamp";
80
+ data: Date;
81
+ driverParam: string;
82
+ notNull: true;
83
+ hasDefault: false;
84
+ isPrimaryKey: false;
85
+ isAutoincrement: false;
86
+ hasRuntimeDefault: false;
87
+ enumValues: undefined;
88
+ baseColumn: never;
89
+ identity: undefined;
90
+ generated: undefined;
91
+ }, {}, {}>;
92
+ };
93
+ dialect: "pg";
94
+ }>, "enableRLS">;
95
+ export type SelectAggregateSnapshot = typeof aggregateSnapshots.$inferSelect;
96
+ export type InsertAggregateSnapshot = typeof aggregateSnapshots.$inferInsert;
97
+ //# sourceMappingURL=aggregate-snapshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate-snapshots.d.ts","sourceRoot":"","sources":["../../src/schema/aggregate-snapshots.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBASlB,CAAA;AAEb,MAAM,MAAM,uBAAuB,GAAG,OAAO,kBAAkB,CAAC,YAAY,CAAA;AAC5E,MAAM,MAAM,uBAAuB,GAAG,OAAO,kBAAkB,CAAC,YAAY,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { index, jsonb, pgTable, text, timestamp } from "drizzle-orm/pg-core";
2
+ /**
3
+ * Read-through TTL snapshots for expensive aggregate computations —
4
+ * primarily the admin dashboard `/aggregates` endpoints (bookings,
5
+ * products, suppliers, finance, availability), which otherwise recompute
6
+ * 3-11 live queries on every dashboard load.
7
+ *
8
+ * `key` is a semantic cache key, NOT a typeid — e.g.
9
+ * `finance:aggregates:<paramsHash>`. Callers build it with
10
+ * `aggregateSnapshotKey(...)` from `@voyant-travel/db/aggregate-snapshots`,
11
+ * which folds query params into the key so distinct param sets get
12
+ * distinct snapshots.
13
+ *
14
+ * `payload` is the JSON-serialized computation result; `staleAfter`
15
+ * marks the end of the freshness window. Rows past `staleAfter` are
16
+ * recomputed in place by the next reader (upsert, last write wins) —
17
+ * stale rows are never served, so no sweeper is required, but a
18
+ * periodic `DELETE WHERE stale_after < now() - interval '...'` keeps
19
+ * abandoned keys from accumulating (hence the `stale_after` index).
20
+ */
21
+ export const aggregateSnapshots = pgTable("aggregate_snapshots", {
22
+ key: text("key").primaryKey(),
23
+ payload: jsonb("payload").notNull(),
24
+ computedAt: timestamp("computed_at", { withTimezone: true }).notNull().defaultNow(),
25
+ staleAfter: timestamp("stale_after", { withTimezone: true }).notNull(),
26
+ }, (table) => [index("idx_aggregate_snapshots_stale_after").on(table.staleAfter)]).enableRLS();
27
+ //# sourceMappingURL=aggregate-snapshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate-snapshots.js","sourceRoot":"","sources":["../../src/schema/aggregate-snapshots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CACvC,qBAAqB,EACrB;IACE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE;IAC7B,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IACnC,UAAU,EAAE,SAAS,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;IACnF,UAAU,EAAE,SAAS,CAAC,aAAa,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;CACvE,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAC/E,CAAC,SAAS,EAAE,CAAA"}