@stonyx/orm 0.3.2-beta.87 → 0.3.2-beta.89

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.
@@ -289,7 +289,7 @@ export default class OrmRequest extends Request {
289
289
  return { data: record.toJSON?.() };
290
290
  };
291
291
  const deleteHandler = ({ params }) => {
292
- store.remove(model, getId(params));
292
+ store.remove(model, getId(params), { _skipAutoPersist: true });
293
293
  return 204;
294
294
  };
295
295
  // Wrap handlers with hooks
@@ -348,9 +348,13 @@ export default class OrmRequest extends Request {
348
348
  }
349
349
  // Execute main handler
350
350
  const response = await handler(request, state);
351
- // Persist to SQL database for create/update (delete is handled by store.remove auto-persist)
351
+ // Set context.record for update BEFORE persist so SQL drivers can read it
352
+ if (operation === 'update' && response?.data) {
353
+ context.record = store.get(this.model, getId(request.params));
354
+ }
355
+ // Persist to SQL database for all write operations (create/update/delete)
352
356
  const sqlDb = Orm.instance.sqlDb;
353
- if (sqlDb && (operation === 'create' || operation === 'update')) {
357
+ if (sqlDb && WRITE_OPERATIONS.has(operation)) {
354
358
  await sqlDb.persist(operation, this.model, context, response);
355
359
  }
356
360
  // Add response and relevant records to context
@@ -367,9 +371,6 @@ export default class OrmRequest extends Request {
367
371
  const recordId = isNaN(responseData.id) ? responseData.id : parseInt(responseData.id);
368
372
  context.record = store.get(this.model, recordId);
369
373
  }
370
- else if (operation === 'update' && response?.data) {
371
- context.record = store.get(this.model, getId(request.params));
372
- }
373
374
  else if (operation === 'delete') {
374
375
  // For delete, the record may no longer exist, but we have oldState
375
376
  context.recordId = getId(request.params);
package/dist/store.d.ts CHANGED
@@ -45,7 +45,9 @@ export default class Store {
45
45
  */
46
46
  private _isMemoryModel;
47
47
  set(key: string, value: Map<number | string, unknown>): void;
48
- remove(key: string, id?: number | string): void;
48
+ remove(key: string, id?: number | string, options?: {
49
+ _skipAutoPersist?: boolean;
50
+ }): void;
49
51
  /**
50
52
  * Evict a record from the store with full relationship registry cleanup,
51
53
  * WITHOUT calling record.clean(). This preserves the caller's reference
package/dist/store.js CHANGED
@@ -107,13 +107,14 @@ export default class Store {
107
107
  set(key, value) {
108
108
  this.data.set(key, value);
109
109
  }
110
- remove(key, id) {
110
+ remove(key, id, options) {
111
111
  // Guard: read-only views cannot have records removed
112
112
  if (Orm.instance?.isView?.(key)) {
113
113
  throw new Error(`Cannot remove records from read-only view '${key}'`);
114
114
  }
115
- // Auto-persist delete to SQL
116
- if (id && Orm.instance?.sqlDb) {
115
+ // Auto-persist delete to SQL (fire-and-forget) — skipped when the
116
+ // request path handles persist itself to avoid double-delete.
117
+ if (id && Orm.instance?.sqlDb && !options?._skipAutoPersist) {
117
118
  Orm.instance.sqlDb.persist('delete', key, { recordId: id }, {}).catch((err) => {
118
119
  Orm.instance.emitPersistError({
119
120
  operation: 'delete',
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "stonyx-async",
5
5
  "stonyx-module"
6
6
  ],
7
- "version": "0.3.2-beta.87",
7
+ "version": "0.3.2-beta.89",
8
8
  "description": "",
9
9
  "main": "dist/index.js",
10
10
  "type": "module",
@@ -376,7 +376,7 @@ export default class OrmRequest extends Request {
376
376
  };
377
377
 
378
378
  const deleteHandler: HandlerFn = ({ params }) => {
379
- store.remove(model, getId(params));
379
+ store.remove(model, getId(params), { _skipAutoPersist: true });
380
380
  return 204;
381
381
  };
382
382
 
@@ -443,9 +443,14 @@ export default class OrmRequest extends Request {
443
443
  // Execute main handler
444
444
  const response = await handler(request, state);
445
445
 
446
- // Persist to SQL database for create/update (delete is handled by store.remove auto-persist)
446
+ // Set context.record for update BEFORE persist so SQL drivers can read it
447
+ if (operation === 'update' && (response as JsonApiResponse)?.data) {
448
+ context.record = store.get(this.model, getId(request.params));
449
+ }
450
+
451
+ // Persist to SQL database for all write operations (create/update/delete)
447
452
  const sqlDb = Orm.instance.sqlDb;
448
- if (sqlDb && (operation === 'create' || operation === 'update')) {
453
+ if (sqlDb && WRITE_OPERATIONS.has(operation)) {
449
454
  await sqlDb.persist(operation, this.model, context, response);
450
455
  }
451
456
 
@@ -461,8 +466,6 @@ export default class OrmRequest extends Request {
461
466
  const responseData = (response as { data: { id: string | number } }).data;
462
467
  const recordId = isNaN(responseData.id as unknown as number) ? responseData.id : parseInt(responseData.id as string);
463
468
  context.record = store.get(this.model, recordId);
464
- } else if (operation === 'update' && (response as JsonApiResponse)?.data) {
465
- context.record = store.get(this.model, getId(request.params));
466
469
  } else if (operation === 'delete') {
467
470
  // For delete, the record may no longer exist, but we have oldState
468
471
  context.recordId = getId(request.params);
package/src/store.ts CHANGED
@@ -170,14 +170,15 @@ export default class Store {
170
170
  this.data.set(key, value);
171
171
  }
172
172
 
173
- remove(key: string, id?: number | string): void {
173
+ remove(key: string, id?: number | string, options?: { _skipAutoPersist?: boolean }): void {
174
174
  // Guard: read-only views cannot have records removed
175
175
  if (Orm.instance?.isView?.(key)) {
176
176
  throw new Error(`Cannot remove records from read-only view '${key}'`);
177
177
  }
178
178
 
179
- // Auto-persist delete to SQL
180
- if (id && Orm.instance?.sqlDb) {
179
+ // Auto-persist delete to SQL (fire-and-forget) — skipped when the
180
+ // request path handles persist itself to avoid double-delete.
181
+ if (id && Orm.instance?.sqlDb && !options?._skipAutoPersist) {
181
182
  Orm.instance.sqlDb.persist('delete', key, { recordId: id }, {}).catch((err: unknown) => {
182
183
  Orm.instance.emitPersistError({
183
184
  operation: 'delete',