@stonyx/orm 0.3.2-beta.88 → 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
@@ -352,9 +352,9 @@ export default class OrmRequest extends Request {
352
352
  if (operation === 'update' && response?.data) {
353
353
  context.record = store.get(this.model, getId(request.params));
354
354
  }
355
- // Persist to SQL database for create/update (delete is handled by store.remove auto-persist)
355
+ // Persist to SQL database for all write operations (create/update/delete)
356
356
  const sqlDb = Orm.instance.sqlDb;
357
- if (sqlDb && (operation === 'create' || operation === 'update')) {
357
+ if (sqlDb && WRITE_OPERATIONS.has(operation)) {
358
358
  await sqlDb.persist(operation, this.model, context, response);
359
359
  }
360
360
  // Add response and relevant records to context
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.88",
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
 
@@ -448,9 +448,9 @@ export default class OrmRequest extends Request {
448
448
  context.record = store.get(this.model, getId(request.params));
449
449
  }
450
450
 
451
- // Persist to SQL database for create/update (delete is handled by store.remove auto-persist)
451
+ // Persist to SQL database for all write operations (create/update/delete)
452
452
  const sqlDb = Orm.instance.sqlDb;
453
- if (sqlDb && (operation === 'create' || operation === 'update')) {
453
+ if (sqlDb && WRITE_OPERATIONS.has(operation)) {
454
454
  await sqlDb.persist(operation, this.model, context, response);
455
455
  }
456
456
 
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',