@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.
- package/dist/orm-request.js +7 -6
- package/dist/store.d.ts +3 -1
- package/dist/store.js +4 -3
- package/package.json +1 -1
- package/src/orm-request.ts +8 -5
- package/src/store.ts +4 -3
package/dist/orm-request.js
CHANGED
|
@@ -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
|
-
//
|
|
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
|
|
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
|
|
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
|
-
|
|
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
package/src/orm-request.ts
CHANGED
|
@@ -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
|
-
//
|
|
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
|
|
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
|
-
|
|
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',
|