@voyantjs/availability 0.71.0 → 0.73.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"service-core.d.ts","sourceRoot":"","sources":["../src/service-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,OAAO,EAAmC,KAAK,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAQhG,OAAO,KAAK,EACV,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,8BAA8B,EAC9B,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,gCAAgC,EAChC,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,gCAAgC,EACjC,MAAM,qBAAqB,CAAA;AAG5B,wBAAsB,SAAS,CAAC,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,yBAAyB;;;;;;;;;;;;;;;;;;;;;GAqBvF;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;UAOnE;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,2BAA2B;;;;;;;;;;;;;;;eAGzF;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,2BAA2B;;;;;;;;;;;;;;;UAQlC;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;UAMlE;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,kBAAkB,EACtB,KAAK,EAAE,8BAA8B;;;;;;;;;;;;;;;;;;GAsBtC;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;UAOxE;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,kBAAkB,EACtB,IAAI,EAAE,gCAAgC;;;;;;;;;;;;eAIvC;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,gCAAgC;;;;;;;;;;;;UAQvC;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;UAMvE;AAED,wBAAsB,SAAS,CAAC,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BvF;AAED,wBAAsB,WAAW,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;UAOnE;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAA;CAChD;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,CAAA;AAEnD,wBAAsB,UAAU,CAC9B,EAAE,EAAE,kBAAkB,EACtB,IAAI,EAAE,2BAA2B,EACjC,OAAO,GAAE,mBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;eAkClC;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,2BAA2B,EACjC,OAAO,GAAE,mBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;UAsClC;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,mBAAwB;;UAoClC;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,6BAA6B;;;;;;;;;;;;;;GAoB/F;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;;;;;;;UAOvE;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,kBAAkB,EACtB,IAAI,EAAE,+BAA+B;;;;;;;;eAItC;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,kBAAkB,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,+BAA+B;;;;;;;;UAQtC;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,MAAM;;UAMtE"}
1
+ {"version":3,"file":"service-core.d.ts","sourceRoot":"","sources":["../src/service-core.ts"],"names":[],"mappings":"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"}
@@ -170,12 +170,44 @@ export async function createSlot(db, data, runtime = {}) {
170
170
  return row;
171
171
  }
172
172
  export async function updateSlot(db, id, data, runtime = {}) {
173
+ const { remainingPax: _ignoredRemainingPax, ...rest } = data;
173
174
  const patch = {
174
- ...data,
175
+ ...rest,
175
176
  startsAt: data.startsAt === undefined ? undefined : new Date(data.startsAt),
176
177
  endsAt: data.endsAt === undefined ? undefined : toDateOrNull(data.endsAt),
177
178
  updatedAt: new Date(),
178
179
  };
180
+ // `remaining_pax` is a derived value the service owns — concurrent flows
181
+ // (holds, bookings, refunds) update it atomically while a form is open,
182
+ // so we never trust a client-supplied snapshot (#1087, Codex review on
183
+ // #1088). Recompute here using the row's *current* state inside the same
184
+ // UPDATE statement so the capacity-change rebalance is race-free.
185
+ //
186
+ // - Switching to unlimited → NULL (no cap).
187
+ // - Changing initialPax with a finite cap → preserve the consumed
188
+ // delta: `new_initial - (old_initial - old_remaining)`, clamped to
189
+ // [0, new_initial]. If consumed > new_initial (capacity dropped
190
+ // below what's already booked) the slot lands at 0; the operator
191
+ // can release allocations to recover headroom.
192
+ // - Leaving capacity alone → don't touch remaining_pax.
193
+ if (data.unlimited === true) {
194
+ patch.remainingPax = null;
195
+ }
196
+ else if (data.initialPax !== undefined && data.initialPax !== null) {
197
+ const newInitial = data.initialPax;
198
+ patch.remainingPax = sql `GREATEST(
199
+ 0,
200
+ LEAST(
201
+ ${newInitial}::int,
202
+ ${newInitial}::int
203
+ - GREATEST(
204
+ 0,
205
+ COALESCE(${availabilitySlots.initialPax}, ${newInitial}::int)
206
+ - COALESCE(${availabilitySlots.remainingPax}, ${newInitial}::int)
207
+ )
208
+ )
209
+ )::int`;
210
+ }
179
211
  const [row] = await db
180
212
  .update(availabilitySlots)
181
213
  .set(patch)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voyantjs/availability",
3
- "version": "0.71.0",
3
+ "version": "0.73.1",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
@@ -44,13 +44,13 @@
44
44
  "drizzle-orm": "^0.45.2",
45
45
  "hono": "^4.12.10",
46
46
  "zod": "^4.3.6",
47
- "@voyantjs/core": "0.71.0",
48
- "@voyantjs/db": "0.71.0",
49
- "@voyantjs/hono": "0.71.0"
47
+ "@voyantjs/core": "0.73.1",
48
+ "@voyantjs/db": "0.73.1",
49
+ "@voyantjs/hono": "0.73.1"
50
50
  },
51
51
  "devDependencies": {
52
52
  "typescript": "^6.0.2",
53
- "@voyantjs/products": "0.71.0",
53
+ "@voyantjs/products": "0.73.1",
54
54
  "@voyantjs/voyant-typescript-config": "0.1.0"
55
55
  },
56
56
  "files": [