@ruiapp/rapid-core 0.5.3 → 0.5.4
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/index.js +38 -4
- package/dist/types.d.ts +7 -3
- package/package.json +1 -1
- package/src/dataAccess/entityManager.ts +47 -4
- package/src/types.ts +10 -3
package/dist/index.js
CHANGED
|
@@ -3470,9 +3470,12 @@ async function updateEntityById(server, dataAccessor, options, plugin) {
|
|
|
3470
3470
|
}
|
|
3471
3471
|
}
|
|
3472
3472
|
}
|
|
3473
|
-
// save many-relation properties
|
|
3473
|
+
// save many-relation properties (only 'overwrite' mode was supported right now)
|
|
3474
3474
|
for (const property of manyRelationPropertiesToUpdate) {
|
|
3475
3475
|
const relatedEntities = [];
|
|
3476
|
+
const targetModel = server.getModel({
|
|
3477
|
+
singularCode: property.targetSingularCode,
|
|
3478
|
+
});
|
|
3476
3479
|
const targetDataAccessor = server.getDataAccessor({
|
|
3477
3480
|
singularCode: property.targetSingularCode,
|
|
3478
3481
|
});
|
|
@@ -3507,15 +3510,46 @@ async function updateEntityById(server, dataAccessor, options, plugin) {
|
|
|
3507
3510
|
AND ${server.queryBuilder.quoteObject(property.targetIdColumnName)} <> ALL($2::int[])`, [id, targetIdsToKeep], routeContext?.getDbTransactionClient());
|
|
3508
3511
|
}
|
|
3509
3512
|
else {
|
|
3510
|
-
const targetModel = server.getModel({
|
|
3511
|
-
singularCode: property.targetSingularCode,
|
|
3512
|
-
});
|
|
3513
3513
|
const targetRows = await server.queryDatabaseObject(`SELECT id FROM ${server.queryBuilder.quoteTable({
|
|
3514
3514
|
schema: targetModel.schema,
|
|
3515
3515
|
tableName: targetModel.tableName,
|
|
3516
3516
|
})} WHERE ${server.queryBuilder.quoteObject(property.selfIdColumnName)} = $1`, [id], routeContext?.getDbTransactionClient());
|
|
3517
3517
|
currentTargetIds = targetRows.map((item) => item.id);
|
|
3518
3518
|
}
|
|
3519
|
+
const targetIdsToRemove = currentTargetIds.filter((currentId) => !targetIdsToKeep.includes(currentId));
|
|
3520
|
+
if (targetIdsToRemove.length) {
|
|
3521
|
+
if (property.linkTableName) ;
|
|
3522
|
+
else {
|
|
3523
|
+
const updateRelationPropertiesOptions = lodash.get(options.relationPropertiesToUpdate, property.code);
|
|
3524
|
+
let relationRemoveMode = "unlink";
|
|
3525
|
+
if (updateRelationPropertiesOptions === true) {
|
|
3526
|
+
relationRemoveMode = "delete";
|
|
3527
|
+
}
|
|
3528
|
+
else {
|
|
3529
|
+
relationRemoveMode = updateRelationPropertiesOptions.relationRemoveMode;
|
|
3530
|
+
}
|
|
3531
|
+
const relationModel = server.getModel({
|
|
3532
|
+
singularCode: property.targetSingularCode,
|
|
3533
|
+
});
|
|
3534
|
+
if (relationRemoveMode === "unlink") {
|
|
3535
|
+
await server.queryDatabaseObject(`UPDATE ${server.queryBuilder.quoteTable({
|
|
3536
|
+
schema: relationModel.schema,
|
|
3537
|
+
tableName: relationModel.tableName,
|
|
3538
|
+
})}
|
|
3539
|
+
SET ${server.queryBuilder.quoteObject(property.selfIdColumnName)} = null
|
|
3540
|
+
WHERE id = ANY($1::int[])`, [targetIdsToRemove], routeContext?.getDbTransactionClient());
|
|
3541
|
+
}
|
|
3542
|
+
else {
|
|
3543
|
+
// relationRemoveMode === "delete"
|
|
3544
|
+
for (const targetIdToRemove of targetIdsToRemove) {
|
|
3545
|
+
await deleteEntityById(server, targetDataAccessor, {
|
|
3546
|
+
id: targetIdToRemove,
|
|
3547
|
+
routeContext,
|
|
3548
|
+
}, plugin);
|
|
3549
|
+
}
|
|
3550
|
+
}
|
|
3551
|
+
}
|
|
3552
|
+
}
|
|
3519
3553
|
for (const relatedEntityToBeSaved of relatedEntitiesToBeSaved) {
|
|
3520
3554
|
let relatedEntityId;
|
|
3521
3555
|
if (lodash.isObject(relatedEntityToBeSaved)) {
|
package/dist/types.d.ts
CHANGED
|
@@ -514,11 +514,15 @@ export interface UpdateEntityByIdOptions {
|
|
|
514
514
|
/**
|
|
515
515
|
* 指定需要更新关联对象的哪些属性。更新实体时,会创建关联对象,但是默认不更新关联对象的属性。
|
|
516
516
|
*/
|
|
517
|
-
relationPropertiesToUpdate?: Record<string,
|
|
517
|
+
relationPropertiesToUpdate?: Record<string, UpdateRelationPropertyOptions>;
|
|
518
518
|
}
|
|
519
|
-
export type
|
|
519
|
+
export type UpdateRelationPropertyOptions = true | {
|
|
520
|
+
/**
|
|
521
|
+
* 当需移除关系时是删除关联实体,还是取消关联。默认为`delete`。此配置仅对没有配置`linkTableName`的属性有效。
|
|
522
|
+
*/
|
|
523
|
+
relationRemoveMode?: "unlink" | "delete";
|
|
520
524
|
propertiesToUpdate?: string[];
|
|
521
|
-
relationPropertiesToUpdate?: Record<string,
|
|
525
|
+
relationPropertiesToUpdate?: Record<string, UpdateRelationPropertyOptions>;
|
|
522
526
|
};
|
|
523
527
|
export interface DeleteEntityOptions {
|
|
524
528
|
routeContext?: RouteContext;
|
package/package.json
CHANGED
|
@@ -1271,9 +1271,12 @@ async function updateEntityById(server: IRpdServer, dataAccessor: IRpdDataAccess
|
|
|
1271
1271
|
}
|
|
1272
1272
|
}
|
|
1273
1273
|
|
|
1274
|
-
// save many-relation properties
|
|
1274
|
+
// save many-relation properties (only 'overwrite' mode was supported right now)
|
|
1275
1275
|
for (const property of manyRelationPropertiesToUpdate) {
|
|
1276
1276
|
const relatedEntities: any[] = [];
|
|
1277
|
+
const targetModel = server.getModel({
|
|
1278
|
+
singularCode: property.targetSingularCode,
|
|
1279
|
+
});
|
|
1277
1280
|
const targetDataAccessor = server.getDataAccessor({
|
|
1278
1281
|
singularCode: property.targetSingularCode!,
|
|
1279
1282
|
});
|
|
@@ -1318,9 +1321,6 @@ async function updateEntityById(server: IRpdServer, dataAccessor: IRpdDataAccess
|
|
|
1318
1321
|
routeContext?.getDbTransactionClient(),
|
|
1319
1322
|
);
|
|
1320
1323
|
} else {
|
|
1321
|
-
const targetModel = server.getModel({
|
|
1322
|
-
singularCode: property.targetSingularCode,
|
|
1323
|
-
});
|
|
1324
1324
|
const targetRows = await server.queryDatabaseObject(
|
|
1325
1325
|
`SELECT id FROM ${server.queryBuilder.quoteTable({
|
|
1326
1326
|
schema: targetModel.schema,
|
|
@@ -1332,6 +1332,49 @@ async function updateEntityById(server: IRpdServer, dataAccessor: IRpdDataAccess
|
|
|
1332
1332
|
currentTargetIds = targetRows.map((item) => item.id);
|
|
1333
1333
|
}
|
|
1334
1334
|
|
|
1335
|
+
const targetIdsToRemove = currentTargetIds.filter((currentId) => !targetIdsToKeep.includes(currentId));
|
|
1336
|
+
if (targetIdsToRemove.length) {
|
|
1337
|
+
if (property.linkTableName) {
|
|
1338
|
+
// do nothing. we've remove the link rows before.
|
|
1339
|
+
} else {
|
|
1340
|
+
const updateRelationPropertiesOptions = get(options.relationPropertiesToUpdate, property.code);
|
|
1341
|
+
let relationRemoveMode: "unlink" | "delete" = "unlink";
|
|
1342
|
+
if (updateRelationPropertiesOptions === true) {
|
|
1343
|
+
relationRemoveMode = "delete";
|
|
1344
|
+
} else {
|
|
1345
|
+
relationRemoveMode = updateRelationPropertiesOptions.relationRemoveMode;
|
|
1346
|
+
}
|
|
1347
|
+
const relationModel = server.getModel({
|
|
1348
|
+
singularCode: property.targetSingularCode,
|
|
1349
|
+
});
|
|
1350
|
+
if (relationRemoveMode === "unlink") {
|
|
1351
|
+
await server.queryDatabaseObject(
|
|
1352
|
+
`UPDATE ${server.queryBuilder.quoteTable({
|
|
1353
|
+
schema: relationModel.schema,
|
|
1354
|
+
tableName: relationModel.tableName,
|
|
1355
|
+
})}
|
|
1356
|
+
SET ${server.queryBuilder.quoteObject(property.selfIdColumnName!)} = null
|
|
1357
|
+
WHERE id = ANY($1::int[])`,
|
|
1358
|
+
[targetIdsToRemove],
|
|
1359
|
+
routeContext?.getDbTransactionClient(),
|
|
1360
|
+
);
|
|
1361
|
+
} else {
|
|
1362
|
+
// relationRemoveMode === "delete"
|
|
1363
|
+
for (const targetIdToRemove of targetIdsToRemove) {
|
|
1364
|
+
await deleteEntityById(
|
|
1365
|
+
server,
|
|
1366
|
+
targetDataAccessor,
|
|
1367
|
+
{
|
|
1368
|
+
id: targetIdToRemove,
|
|
1369
|
+
routeContext,
|
|
1370
|
+
},
|
|
1371
|
+
plugin,
|
|
1372
|
+
);
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1335
1378
|
for (const relatedEntityToBeSaved of relatedEntitiesToBeSaved) {
|
|
1336
1379
|
let relatedEntityId: any;
|
|
1337
1380
|
if (isObject(relatedEntityToBeSaved)) {
|
package/src/types.ts
CHANGED
|
@@ -659,14 +659,21 @@ export interface UpdateEntityByIdOptions {
|
|
|
659
659
|
/**
|
|
660
660
|
* 指定需要更新关联对象的哪些属性。更新实体时,会创建关联对象,但是默认不更新关联对象的属性。
|
|
661
661
|
*/
|
|
662
|
-
relationPropertiesToUpdate?: Record<string,
|
|
662
|
+
relationPropertiesToUpdate?: Record<string, UpdateRelationPropertyOptions>;
|
|
663
663
|
}
|
|
664
664
|
|
|
665
|
-
export type
|
|
665
|
+
export type UpdateRelationPropertyOptions =
|
|
666
666
|
| true
|
|
667
667
|
| {
|
|
668
|
+
// TODO: impl savingMode 'patch'
|
|
669
|
+
// savingMode?: "overwrite" | "patch";
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* 当需移除关系时是删除关联实体,还是取消关联。默认为`delete`。此配置仅对没有配置`linkTableName`的属性有效。
|
|
673
|
+
*/
|
|
674
|
+
relationRemoveMode?: "unlink" | "delete";
|
|
668
675
|
propertiesToUpdate?: string[];
|
|
669
|
-
relationPropertiesToUpdate?: Record<string,
|
|
676
|
+
relationPropertiesToUpdate?: Record<string, UpdateRelationPropertyOptions>;
|
|
670
677
|
};
|
|
671
678
|
|
|
672
679
|
export interface DeleteEntityOptions {
|