@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,136 @@
1
+ import { index, integer, jsonb, pgTable, text, timestamp } from "drizzle-orm/pg-core";
2
+ import { z } from "zod";
3
+ import { typeId, typeIdSchema } from "../../lib/index.js";
4
+ /**
5
+ * Generic outbound HTTP delivery log.
6
+ *
7
+ * Every outbound HTTP call from any module writes a row per attempt for
8
+ * observability, retry-chain history, and (eventually) durable
9
+ * scheduling. Channel push is the first concrete consumer; future
10
+ * consumers include operator-configured webhooks (delivering Voyant
11
+ * events to operator-supplied URLs), third-party integrations (CRM
12
+ * sync, accounting exports), and any other real-time outbound system
13
+ * that needs the same observability surface.
14
+ *
15
+ * Distinct from `channel_webhook_events` (in distribution), which logs
16
+ * events received FROM channels — opposite direction.
17
+ *
18
+ * Per docs/architecture/channel-push-architecture.md §11.
19
+ *
20
+ * IMPORTANT: callers MUST NOT INSERT directly. Use the
21
+ * `prepareOutboundEnvelope` helper (in `@voyant-travel/voyant-distribution` or
22
+ * a future shared infra package) — it enforces auth-header redaction,
23
+ * PII redaction, and excerpt-bounding. Direct inserts are a lint
24
+ * violation per §11.3.
25
+ */
26
+ export const infraWebhookDeliveriesTable = pgTable("webhook_deliveries", {
27
+ id: typeId("webhook_deliveries"),
28
+ // ── Provenance: who issued this call and why ──────────────────────
29
+ /** "distribution", "iam", "operator-webhooks", … */
30
+ sourceModule: text("source_module").notNull(),
31
+ /** "channel.booking.push", "channel.availability.push", … */
32
+ sourceEvent: text("source_event").notNull(),
33
+ /** e.g. "bookings", "products" — for entity-scoped queries. */
34
+ sourceEntityModule: text("source_entity_module"),
35
+ /** e.g. "book_xxx" — for entity-scoped queries. */
36
+ sourceEntityId: text("source_entity_id"),
37
+ /** References webhook_subscriptions.id when applicable. */
38
+ subscriptionId: text("subscription_id"),
39
+ // ── Target ────────────────────────────────────────────────────────
40
+ targetUrl: text("target_url").notNull(),
41
+ /** "channel:tui", "subscription", "internal", … */
42
+ targetKind: text("target_kind"),
43
+ /** e.g. channel_id when target_kind = "channel:*". */
44
+ targetRef: text("target_ref"),
45
+ // ── Request (sensitive headers redacted before write) ─────────────
46
+ requestMethod: text("request_method").notNull(),
47
+ /** Auth headers (Authorization, Cookie, X-Api-Key, …) MUST be redacted. */
48
+ requestHeaders: jsonb("request_headers").$type(),
49
+ /** SHA-256 of the canonical request body — for idempotency / drift. */
50
+ requestBodyHash: text("request_body_hash"),
51
+ /** First N chars (bounded to 4 KB) for debugging. */
52
+ requestBodyExcerpt: text("request_body_excerpt"),
53
+ // ── Response ──────────────────────────────────────────────────────
54
+ responseStatus: integer("response_status"),
55
+ responseHeaders: jsonb("response_headers").$type(),
56
+ responseBodyExcerpt: text("response_body_excerpt"),
57
+ // ── Retry chain ──────────────────────────────────────────────────
58
+ attemptNumber: integer("attempt_number").notNull().default(1),
59
+ /** Previous attempt in the retry chain. */
60
+ parentDeliveryId: text("parent_delivery_id"),
61
+ /** Stable across retries; supplied by the caller. */
62
+ idempotencyKey: text("idempotency_key"),
63
+ // ── Lifecycle ────────────────────────────────────────────────────
64
+ /** "pending" | "in_flight" | "succeeded" | "failed" | "abandoned" */
65
+ status: text("status").notNull(),
66
+ /** When set, a future scheduler picks the row up at this time; v1 dispatches inline. */
67
+ scheduledFor: timestamp("scheduled_for", { withTimezone: true }),
68
+ startedAt: timestamp("started_at", { withTimezone: true }),
69
+ finishedAt: timestamp("finished_at", { withTimezone: true }),
70
+ durationMs: integer("duration_ms"),
71
+ // ── Error detail ─────────────────────────────────────────────────
72
+ /** "network" | "timeout" | "4xx" | "5xx" | "adapter_error" | "rate_limited" */
73
+ errorClass: text("error_class"),
74
+ errorMessage: text("error_message"),
75
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
76
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
77
+ }, (table) => [
78
+ // Forward-compatible scheduler index (v1 doesn't run a worker yet).
79
+ index("idx_webhook_deliveries_pending").on(table.status, table.scheduledFor),
80
+ // Module-scoped logs for the operator dashboard.
81
+ index("idx_webhook_deliveries_module").on(table.sourceModule, table.createdAt),
82
+ // Entity-scoped logs ("show me all deliveries for this booking").
83
+ index("idx_webhook_deliveries_entity").on(table.sourceEntityModule, table.sourceEntityId, table.createdAt),
84
+ // Retry-chain queries.
85
+ index("idx_webhook_deliveries_idempotency").on(table.idempotencyKey, table.attemptNumber),
86
+ // Per-subscription history.
87
+ index("idx_webhook_deliveries_subscription").on(table.subscriptionId, table.createdAt),
88
+ // Per-channel history (target_kind = "channel:*", target_ref = channel id).
89
+ index("idx_webhook_deliveries_target").on(table.targetKind, table.targetRef, table.createdAt),
90
+ ]).enableRLS();
91
+ export const webhookDeliveryStatusSchema = z.enum([
92
+ "pending",
93
+ "in_flight",
94
+ "succeeded",
95
+ "failed",
96
+ "abandoned",
97
+ ]);
98
+ export const webhookDeliveryErrorClassSchema = z.enum([
99
+ "network",
100
+ "timeout",
101
+ "4xx",
102
+ "5xx",
103
+ "adapter_error",
104
+ "rate_limited",
105
+ ]);
106
+ export const infraWebhookDeliverySelectSchema = z.object({
107
+ id: typeIdSchema("webhook_deliveries"),
108
+ sourceModule: z.string(),
109
+ sourceEvent: z.string(),
110
+ sourceEntityModule: z.string().nullable(),
111
+ sourceEntityId: z.string().nullable(),
112
+ subscriptionId: z.string().nullable(),
113
+ targetUrl: z.string(),
114
+ targetKind: z.string().nullable(),
115
+ targetRef: z.string().nullable(),
116
+ requestMethod: z.string(),
117
+ requestHeaders: z.record(z.string(), z.string()).nullable(),
118
+ requestBodyHash: z.string().nullable(),
119
+ requestBodyExcerpt: z.string().nullable(),
120
+ responseStatus: z.number().int().nullable(),
121
+ responseHeaders: z.record(z.string(), z.string()).nullable(),
122
+ responseBodyExcerpt: z.string().nullable(),
123
+ attemptNumber: z.number().int(),
124
+ parentDeliveryId: z.string().nullable(),
125
+ idempotencyKey: z.string().nullable(),
126
+ status: webhookDeliveryStatusSchema,
127
+ scheduledFor: z.date().nullable(),
128
+ startedAt: z.date().nullable(),
129
+ finishedAt: z.date().nullable(),
130
+ durationMs: z.number().int().nullable(),
131
+ errorClass: webhookDeliveryErrorClassSchema.nullable(),
132
+ errorMessage: z.string().nullable(),
133
+ createdAt: z.date(),
134
+ updatedAt: z.date(),
135
+ });
136
+ //# sourceMappingURL=webhook_deliveries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook_deliveries.js","sourceRoot":"","sources":["../../../src/schema/infra/webhook_deliveries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,284 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Organization webhook subscriptions
4
+ *
5
+ * Control-plane storage for outbound webhook delivery configuration.
6
+ * Mirrors legacy comms.webhook_subscriptions managed by the dash app.
7
+ */
8
+ export declare const infraWebhookSubscriptionsTable: Omit<import("drizzle-orm/pg-core").PgTableWithColumns<{
9
+ name: "webhook_subscriptions";
10
+ schema: undefined;
11
+ columns: {
12
+ id: import("drizzle-orm/pg-core").PgColumn<{
13
+ name: string;
14
+ tableName: "webhook_subscriptions";
15
+ dataType: "string";
16
+ columnType: "PgText";
17
+ data: string;
18
+ driverParam: string;
19
+ notNull: true;
20
+ hasDefault: true;
21
+ isPrimaryKey: true;
22
+ isAutoincrement: false;
23
+ hasRuntimeDefault: true;
24
+ enumValues: [string, ...string[]];
25
+ baseColumn: never;
26
+ identity: undefined;
27
+ generated: undefined;
28
+ }, {}, {}>;
29
+ url: import("drizzle-orm/pg-core").PgColumn<{
30
+ name: "url";
31
+ tableName: "webhook_subscriptions";
32
+ dataType: "string";
33
+ columnType: "PgText";
34
+ data: string;
35
+ driverParam: string;
36
+ notNull: true;
37
+ hasDefault: false;
38
+ isPrimaryKey: false;
39
+ isAutoincrement: false;
40
+ hasRuntimeDefault: false;
41
+ enumValues: [string, ...string[]];
42
+ baseColumn: never;
43
+ identity: undefined;
44
+ generated: undefined;
45
+ }, {}, {}>;
46
+ events: import("drizzle-orm/pg-core").PgColumn<{
47
+ name: "events";
48
+ tableName: "webhook_subscriptions";
49
+ dataType: "array";
50
+ columnType: "PgArray";
51
+ data: string[];
52
+ driverParam: string | string[];
53
+ notNull: true;
54
+ hasDefault: true;
55
+ isPrimaryKey: false;
56
+ isAutoincrement: false;
57
+ hasRuntimeDefault: false;
58
+ enumValues: [string, ...string[]];
59
+ baseColumn: import("drizzle-orm").Column<{
60
+ name: "events";
61
+ tableName: "webhook_subscriptions";
62
+ dataType: "string";
63
+ columnType: "PgText";
64
+ data: string;
65
+ driverParam: string;
66
+ notNull: false;
67
+ hasDefault: false;
68
+ isPrimaryKey: false;
69
+ isAutoincrement: false;
70
+ hasRuntimeDefault: false;
71
+ enumValues: [string, ...string[]];
72
+ baseColumn: never;
73
+ identity: undefined;
74
+ generated: undefined;
75
+ }, {}, {}>;
76
+ identity: undefined;
77
+ generated: undefined;
78
+ }, {}, {
79
+ baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
80
+ name: "events";
81
+ dataType: "string";
82
+ columnType: "PgText";
83
+ data: string;
84
+ enumValues: [string, ...string[]];
85
+ driverParam: string;
86
+ }, {}, {}, import("drizzle-orm").ColumnBuilderExtraConfig>;
87
+ size: undefined;
88
+ }>;
89
+ secret: import("drizzle-orm/pg-core").PgColumn<{
90
+ name: "secret";
91
+ tableName: "webhook_subscriptions";
92
+ dataType: "string";
93
+ columnType: "PgText";
94
+ data: string;
95
+ driverParam: string;
96
+ notNull: true;
97
+ hasDefault: false;
98
+ isPrimaryKey: false;
99
+ isAutoincrement: false;
100
+ hasRuntimeDefault: false;
101
+ enumValues: [string, ...string[]];
102
+ baseColumn: never;
103
+ identity: undefined;
104
+ generated: undefined;
105
+ }, {}, {}>;
106
+ active: import("drizzle-orm/pg-core").PgColumn<{
107
+ name: "active";
108
+ tableName: "webhook_subscriptions";
109
+ dataType: "boolean";
110
+ columnType: "PgBoolean";
111
+ data: boolean;
112
+ driverParam: boolean;
113
+ notNull: true;
114
+ hasDefault: true;
115
+ isPrimaryKey: false;
116
+ isAutoincrement: false;
117
+ hasRuntimeDefault: false;
118
+ enumValues: undefined;
119
+ baseColumn: never;
120
+ identity: undefined;
121
+ generated: undefined;
122
+ }, {}, {}>;
123
+ maxRetries: import("drizzle-orm/pg-core").PgColumn<{
124
+ name: "max_retries";
125
+ tableName: "webhook_subscriptions";
126
+ dataType: "number";
127
+ columnType: "PgInteger";
128
+ data: number;
129
+ driverParam: string | number;
130
+ notNull: true;
131
+ hasDefault: true;
132
+ isPrimaryKey: false;
133
+ isAutoincrement: false;
134
+ hasRuntimeDefault: false;
135
+ enumValues: undefined;
136
+ baseColumn: never;
137
+ identity: undefined;
138
+ generated: undefined;
139
+ }, {}, {}>;
140
+ headers: import("drizzle-orm/pg-core").PgColumn<{
141
+ name: "headers";
142
+ tableName: "webhook_subscriptions";
143
+ dataType: "json";
144
+ columnType: "PgJsonb";
145
+ data: Record<string, string>;
146
+ driverParam: unknown;
147
+ notNull: false;
148
+ hasDefault: false;
149
+ isPrimaryKey: false;
150
+ isAutoincrement: false;
151
+ hasRuntimeDefault: false;
152
+ enumValues: undefined;
153
+ baseColumn: never;
154
+ identity: undefined;
155
+ generated: undefined;
156
+ }, {}, {
157
+ $type: Record<string, string>;
158
+ }>;
159
+ description: import("drizzle-orm/pg-core").PgColumn<{
160
+ name: "description";
161
+ tableName: "webhook_subscriptions";
162
+ dataType: "string";
163
+ columnType: "PgText";
164
+ data: string;
165
+ driverParam: string;
166
+ notNull: false;
167
+ hasDefault: false;
168
+ isPrimaryKey: false;
169
+ isAutoincrement: false;
170
+ hasRuntimeDefault: false;
171
+ enumValues: [string, ...string[]];
172
+ baseColumn: never;
173
+ identity: undefined;
174
+ generated: undefined;
175
+ }, {}, {}>;
176
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
177
+ name: "created_at";
178
+ tableName: "webhook_subscriptions";
179
+ dataType: "date";
180
+ columnType: "PgTimestamp";
181
+ data: Date;
182
+ driverParam: string;
183
+ notNull: true;
184
+ hasDefault: true;
185
+ isPrimaryKey: false;
186
+ isAutoincrement: false;
187
+ hasRuntimeDefault: false;
188
+ enumValues: undefined;
189
+ baseColumn: never;
190
+ identity: undefined;
191
+ generated: undefined;
192
+ }, {}, {}>;
193
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
194
+ name: "updated_at";
195
+ tableName: "webhook_subscriptions";
196
+ dataType: "date";
197
+ columnType: "PgTimestamp";
198
+ data: Date;
199
+ driverParam: string;
200
+ notNull: true;
201
+ hasDefault: true;
202
+ isPrimaryKey: false;
203
+ isAutoincrement: false;
204
+ hasRuntimeDefault: false;
205
+ enumValues: undefined;
206
+ baseColumn: never;
207
+ identity: undefined;
208
+ generated: undefined;
209
+ }, {}, {}>;
210
+ lastDeliveryAt: import("drizzle-orm/pg-core").PgColumn<{
211
+ name: "last_delivery_at";
212
+ tableName: "webhook_subscriptions";
213
+ dataType: "date";
214
+ columnType: "PgTimestamp";
215
+ data: Date;
216
+ driverParam: string;
217
+ notNull: false;
218
+ hasDefault: false;
219
+ isPrimaryKey: false;
220
+ isAutoincrement: false;
221
+ hasRuntimeDefault: false;
222
+ enumValues: undefined;
223
+ baseColumn: never;
224
+ identity: undefined;
225
+ generated: undefined;
226
+ }, {}, {}>;
227
+ failureCount: import("drizzle-orm/pg-core").PgColumn<{
228
+ name: "failure_count";
229
+ tableName: "webhook_subscriptions";
230
+ dataType: "number";
231
+ columnType: "PgInteger";
232
+ data: number;
233
+ driverParam: string | number;
234
+ notNull: true;
235
+ hasDefault: true;
236
+ isPrimaryKey: false;
237
+ isAutoincrement: false;
238
+ hasRuntimeDefault: false;
239
+ enumValues: undefined;
240
+ baseColumn: never;
241
+ identity: undefined;
242
+ generated: undefined;
243
+ }, {}, {}>;
244
+ };
245
+ dialect: "pg";
246
+ }>, "enableRLS">;
247
+ export type InsertInfraWebhookSubscription = typeof infraWebhookSubscriptionsTable.$inferInsert;
248
+ export type SelectInfraWebhookSubscription = typeof infraWebhookSubscriptionsTable.$inferSelect;
249
+ export declare const infraWebhookSubscriptionInsertSchema: z.ZodObject<{
250
+ description: z.ZodNullable<z.ZodOptional<z.ZodString>>;
251
+ active: z.ZodDefault<z.ZodBoolean>;
252
+ url: z.ZodURL;
253
+ events: z.ZodArray<z.ZodString>;
254
+ secret: z.ZodString;
255
+ maxRetries: z.ZodDefault<z.ZodNumber>;
256
+ headers: z.ZodDefault<z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>>;
257
+ }, z.core.$strip>;
258
+ export declare const infraWebhookSubscriptionUpdateSchema: z.ZodObject<{
259
+ description: z.ZodOptional<z.ZodNullable<z.ZodOptional<z.ZodString>>>;
260
+ active: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
261
+ url: z.ZodOptional<z.ZodURL>;
262
+ events: z.ZodOptional<z.ZodArray<z.ZodString>>;
263
+ secret: z.ZodOptional<z.ZodString>;
264
+ maxRetries: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
265
+ headers: z.ZodOptional<z.ZodDefault<z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>>>;
266
+ }, z.core.$strip>;
267
+ export declare const infraWebhookSubscriptionSelectSchema: z.ZodObject<{
268
+ createdAt: z.ZodDate;
269
+ updatedAt: z.ZodDate;
270
+ url: z.ZodURL;
271
+ events: z.ZodArray<z.ZodString>;
272
+ secret: z.ZodString;
273
+ active: z.ZodDefault<z.ZodBoolean>;
274
+ maxRetries: z.ZodDefault<z.ZodNumber>;
275
+ headers: z.ZodDefault<z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>>;
276
+ description: z.ZodNullable<z.ZodOptional<z.ZodString>>;
277
+ lastDeliveryAt: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
278
+ failureCount: z.ZodDefault<z.ZodNumber>;
279
+ id: z.ZodString;
280
+ }, z.core.$strip>;
281
+ export type InfraWebhookSubscription = z.infer<typeof infraWebhookSubscriptionSelectSchema>;
282
+ export type NewInfraWebhookSubscription = z.infer<typeof infraWebhookSubscriptionInsertSchema>;
283
+ export type UpdateInfraWebhookSubscription = z.infer<typeof infraWebhookSubscriptionUpdateSchema>;
284
+ //# sourceMappingURL=webhook_subscriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook_subscriptions.d.ts","sourceRoot":"","sources":["../../../src/schema/infra/webhook_subscriptions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAoB9B,CAAA;AAEb,MAAM,MAAM,8BAA8B,GAAG,OAAO,8BAA8B,CAAC,YAAY,CAAA;AAC/F,MAAM,MAAM,8BAA8B,GAAG,OAAO,8BAA8B,CAAC,YAAY,CAAA;AAc/F,eAAO,MAAM,oCAAoC;;;;;;;;iBAII,CAAA;AAErD,eAAO,MAAM,oCAAoC;;;;;;;;iBAarC,CAAA;AAEZ,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;iBAK/C,CAAA;AAEF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAA;AAC3F,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAA;AAC9F,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAA"}
@@ -0,0 +1,64 @@
1
+ import { sql } from "drizzle-orm";
2
+ import { boolean, index, integer, jsonb, pgTable, text, timestamp } from "drizzle-orm/pg-core";
3
+ import { z } from "zod";
4
+ import { typeId, typeIdSchema } from "../../lib/index.js";
5
+ /**
6
+ * Organization webhook subscriptions
7
+ *
8
+ * Control-plane storage for outbound webhook delivery configuration.
9
+ * Mirrors legacy comms.webhook_subscriptions managed by the dash app.
10
+ */
11
+ export const infraWebhookSubscriptionsTable = pgTable("webhook_subscriptions", {
12
+ id: typeId("webhook_subscriptions"),
13
+ url: text("url").notNull(),
14
+ events: text("events").array().notNull().default(sql `ARRAY[]::text[]`),
15
+ secret: text("secret").notNull(),
16
+ active: boolean("active").notNull().default(true),
17
+ maxRetries: integer("max_retries").notNull().default(5),
18
+ headers: jsonb("headers").$type(),
19
+ description: text("description"),
20
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
21
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
22
+ lastDeliveryAt: timestamp("last_delivery_at", { withTimezone: true }),
23
+ failureCount: integer("failure_count").notNull().default(0),
24
+ }, (table) => [
25
+ index("idx_infra_webhook_subs_active").on(table.active),
26
+ index("idx_infra_webhook_subs_url").on(table.url),
27
+ ]).enableRLS();
28
+ const infraWebhookSubscriptionSharedSchema = {
29
+ url: z.url({ message: "Webhook URL must be valid" }),
30
+ events: z.array(z.string()).min(1, "At least one event is required"),
31
+ secret: z.string().min(32, "Secret must be at least 32 characters"),
32
+ active: z.boolean().default(true),
33
+ maxRetries: z.number().int().min(0).max(10).default(5),
34
+ headers: z.record(z.string(), z.string()).optional().nullable().default(null),
35
+ description: z.string().optional().nullable(),
36
+ lastDeliveryAt: z.date().nullable().optional(),
37
+ failureCount: z.number().int().min(0).default(0),
38
+ };
39
+ export const infraWebhookSubscriptionInsertSchema = z
40
+ .object({
41
+ ...infraWebhookSubscriptionSharedSchema,
42
+ })
43
+ .omit({ lastDeliveryAt: true, failureCount: true });
44
+ export const infraWebhookSubscriptionUpdateSchema = z
45
+ .object({
46
+ ...infraWebhookSubscriptionSharedSchema,
47
+ })
48
+ .pick({
49
+ url: true,
50
+ events: true,
51
+ secret: true,
52
+ active: true,
53
+ maxRetries: true,
54
+ headers: true,
55
+ description: true,
56
+ })
57
+ .partial();
58
+ export const infraWebhookSubscriptionSelectSchema = z.object({
59
+ id: typeIdSchema("webhook_subscriptions"),
60
+ ...infraWebhookSubscriptionSharedSchema,
61
+ createdAt: z.date(),
62
+ updatedAt: z.date(),
63
+ });
64
+ //# sourceMappingURL=webhook_subscriptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook_subscriptions.js","sourceRoot":"","sources":["../../../src/schema/infra/webhook_subscriptions.ts"],"names":[],"mappings":"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"}