oak-domain 5.1.27 → 5.1.28

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.
@@ -18,7 +18,6 @@ exports.desc = {
18
18
  type: "object"
19
19
  }
20
20
  },
21
- static: true,
22
21
  actionType: "crud",
23
22
  actions: action_1.genericActions,
24
23
  indexes: [
@@ -43,12 +43,14 @@ export type ActionAuth = {
43
43
  Aggregation: DeduceAggregation<ActionAuth["Projection"], ActionAuth["Filter"], ActionAuth["Sorter"]>;
44
44
  CreateOperationData: FormCreateData<BaseActionAuth.OpSchema & {
45
45
  relation?: OakOperation<"create", Relation["CreateOperationData"]> | OakOperation<BaseRelation.OpUpdateAction, Relation["UpdateOperationData"], Relation["Filter"]>;
46
+ path?: OakOperation<"create", Path["CreateOperationData"]> | OakOperation<BasePath.OpUpdateAction, Path["UpdateOperationData"], Path["Filter"]>;
46
47
  }>;
47
48
  CreateSingle: OakOperation<"create", ActionAuth["CreateOperationData"]>;
48
49
  CreateMulti: OakOperation<"create", Array<ActionAuth["CreateOperationData"]>>;
49
50
  Create: ActionAuth["CreateSingle"] | ActionAuth["CreateMulti"];
50
51
  UpdateOperationData: FormUpdateData<BaseActionAuth.OpSchema & {
51
52
  relation?: OakOperation<"create", Relation["CreateOperationData"]> | OakOperation<BaseRelation.OpUpdateAction, Relation["UpdateOperationData"], Relation["Filter"]> | OakOperation<"remove", Relation["RemoveOperationData"], Relation["Filter"]>;
53
+ path?: OakOperation<"create", Path["CreateOperationData"]> | OakOperation<BasePath.OpUpdateAction, Path["UpdateOperationData"], Path["Filter"]> | OakOperation<"remove", Path["RemoveOperationData"], Path["Filter"]>;
52
54
  }>;
53
55
  Update: OakOperation<BaseActionAuth.OpUpdateAction, ActionAuth["UpdateOperationData"], ActionAuth["Filter"], ActionAuth["Sorter"]>;
54
56
  RemoveOperationData: {};
@@ -326,11 +328,17 @@ export type Path = {
326
328
  Sorter: Path["SortNode"][];
327
329
  Selection: OakSelection<"select", Path["Projection"], Path["Filter"], Path["Sorter"]>;
328
330
  Aggregation: DeduceAggregation<Path["Projection"], Path["Filter"], Path["Sorter"]>;
329
- CreateOperationData: FormCreateData<BasePath.OpSchema>;
331
+ CreateOperationData: FormCreateData<BasePath.OpSchema & {
332
+ actionAuth$path?: (OakOperation<"create", Omit<ActionAuth["CreateOperationData"], "path"> | Omit<ActionAuth["CreateOperationData"], "path">[]> | OakOperation<BaseActionAuth.OpUpdateAction, Omit<ActionAuth["UpdateOperationData"], "path">, ActionAuth["Filter"]>)[];
333
+ relationAuth$path?: (OakOperation<"create", Omit<RelationAuth["CreateOperationData"], "path"> | Omit<RelationAuth["CreateOperationData"], "path">[]> | OakOperation<BaseRelationAuth.OpUpdateAction, Omit<RelationAuth["UpdateOperationData"], "path">, RelationAuth["Filter"]>)[];
334
+ }>;
330
335
  CreateSingle: OakOperation<"create", Path["CreateOperationData"]>;
331
336
  CreateMulti: OakOperation<"create", Array<Path["CreateOperationData"]>>;
332
337
  Create: Path["CreateSingle"] | Path["CreateMulti"];
333
- UpdateOperationData: FormUpdateData<BasePath.OpSchema>;
338
+ UpdateOperationData: FormUpdateData<BasePath.OpSchema & {
339
+ actionAuth$path?: (OakOperation<"create", Omit<ActionAuth["CreateOperationData"], "path"> | Omit<ActionAuth["CreateOperationData"], "path">[]> | OakOperation<BaseActionAuth.OpUpdateAction, Omit<ActionAuth["UpdateOperationData"], "path">, ActionAuth["Filter"]> | OakOperation<"remove", ActionAuth["RemoveOperationData"], ActionAuth["Filter"]>)[];
340
+ relationAuth$path?: (OakOperation<"create", Omit<RelationAuth["CreateOperationData"], "path"> | Omit<RelationAuth["CreateOperationData"], "path">[]> | OakOperation<BaseRelationAuth.OpUpdateAction, Omit<RelationAuth["UpdateOperationData"], "path">, RelationAuth["Filter"]> | OakOperation<"remove", RelationAuth["RemoveOperationData"], RelationAuth["Filter"]>)[];
341
+ }>;
334
342
  Update: OakOperation<BasePath.OpUpdateAction, Path["UpdateOperationData"], Path["Filter"], Path["Sorter"]>;
335
343
  RemoveOperationData: {};
336
344
  Remove: OakOperation<"remove", Path["RemoveOperationData"], Path["Filter"], Path["Sorter"]>;
@@ -400,6 +408,9 @@ export type Relation = {
400
408
  Selection: OakSelection<"select", Relation["Projection"], Relation["Filter"], Relation["Sorter"]>;
401
409
  Aggregation: DeduceAggregation<Relation["Projection"], Relation["Filter"], Relation["Sorter"]>;
402
410
  CreateOperationData: FormCreateData<BaseRelation.OpSchema & {
411
+ actionAuth$relation?: (OakOperation<"create", Omit<ActionAuth["CreateOperationData"], "relation"> | Omit<ActionAuth["CreateOperationData"], "relation">[]> | OakOperation<BaseActionAuth.OpUpdateAction, Omit<ActionAuth["UpdateOperationData"], "relation">, ActionAuth["Filter"]>)[];
412
+ relationAuth$sourceRelation?: (OakOperation<"create", Omit<RelationAuth["CreateOperationData"], "sourceRelation"> | Omit<RelationAuth["CreateOperationData"], "sourceRelation">[]> | OakOperation<BaseRelationAuth.OpUpdateAction, Omit<RelationAuth["UpdateOperationData"], "sourceRelation">, RelationAuth["Filter"]>)[];
413
+ relationAuth$destRelation?: (OakOperation<"create", Omit<RelationAuth["CreateOperationData"], "destRelation"> | Omit<RelationAuth["CreateOperationData"], "destRelation">[]> | OakOperation<BaseRelationAuth.OpUpdateAction, Omit<RelationAuth["UpdateOperationData"], "destRelation">, RelationAuth["Filter"]>)[];
403
414
  userEntityClaim$relation?: (OakOperation<"create", Omit<UserEntityClaim["CreateOperationData"], "relation"> | Omit<UserEntityClaim["CreateOperationData"], "relation">[]> | OakOperation<BaseUserEntityClaim.OpUpdateAction, Omit<UserEntityClaim["UpdateOperationData"], "relation">, UserEntityClaim["Filter"]>)[];
404
415
  userRelation$relation?: (OakOperation<"create", Omit<UserRelation["CreateOperationData"], "relation"> | Omit<UserRelation["CreateOperationData"], "relation">[]> | OakOperation<BaseUserRelation.OpUpdateAction, Omit<UserRelation["UpdateOperationData"], "relation">, UserRelation["Filter"]>)[];
405
416
  }>;
@@ -407,6 +418,9 @@ export type Relation = {
407
418
  CreateMulti: OakOperation<"create", Array<Relation["CreateOperationData"]>>;
408
419
  Create: Relation["CreateSingle"] | Relation["CreateMulti"];
409
420
  UpdateOperationData: FormUpdateData<BaseRelation.OpSchema & {
421
+ actionAuth$relation?: (OakOperation<"create", Omit<ActionAuth["CreateOperationData"], "relation"> | Omit<ActionAuth["CreateOperationData"], "relation">[]> | OakOperation<BaseActionAuth.OpUpdateAction, Omit<ActionAuth["UpdateOperationData"], "relation">, ActionAuth["Filter"]> | OakOperation<"remove", ActionAuth["RemoveOperationData"], ActionAuth["Filter"]>)[];
422
+ relationAuth$sourceRelation?: (OakOperation<"create", Omit<RelationAuth["CreateOperationData"], "sourceRelation"> | Omit<RelationAuth["CreateOperationData"], "sourceRelation">[]> | OakOperation<BaseRelationAuth.OpUpdateAction, Omit<RelationAuth["UpdateOperationData"], "sourceRelation">, RelationAuth["Filter"]> | OakOperation<"remove", RelationAuth["RemoveOperationData"], RelationAuth["Filter"]>)[];
423
+ relationAuth$destRelation?: (OakOperation<"create", Omit<RelationAuth["CreateOperationData"], "destRelation"> | Omit<RelationAuth["CreateOperationData"], "destRelation">[]> | OakOperation<BaseRelationAuth.OpUpdateAction, Omit<RelationAuth["UpdateOperationData"], "destRelation">, RelationAuth["Filter"]> | OakOperation<"remove", RelationAuth["RemoveOperationData"], RelationAuth["Filter"]>)[];
410
424
  userEntityClaim$relation?: (OakOperation<"create", Omit<UserEntityClaim["CreateOperationData"], "relation"> | Omit<UserEntityClaim["CreateOperationData"], "relation">[]> | OakOperation<BaseUserEntityClaim.OpUpdateAction, Omit<UserEntityClaim["UpdateOperationData"], "relation">, UserEntityClaim["Filter"]> | OakOperation<"remove", UserEntityClaim["RemoveOperationData"], UserEntityClaim["Filter"]>)[];
411
425
  userRelation$relation?: (OakOperation<"create", Omit<UserRelation["CreateOperationData"], "relation"> | Omit<UserRelation["CreateOperationData"], "relation">[]> | OakOperation<BaseUserRelation.OpUpdateAction, Omit<UserRelation["UpdateOperationData"], "relation">, UserRelation["Filter"]> | OakOperation<"remove", UserRelation["RemoveOperationData"], UserRelation["Filter"]>)[];
412
426
  }>;
@@ -448,6 +462,7 @@ export type RelationAuth = {
448
462
  Aggregation: DeduceAggregation<RelationAuth["Projection"], RelationAuth["Filter"], RelationAuth["Sorter"]>;
449
463
  CreateOperationData: FormCreateData<BaseRelationAuth.OpSchema & {
450
464
  sourceRelation?: OakOperation<"create", Relation["CreateOperationData"]> | OakOperation<BaseRelation.OpUpdateAction, Relation["UpdateOperationData"], Relation["Filter"]>;
465
+ path?: OakOperation<"create", Path["CreateOperationData"]> | OakOperation<BasePath.OpUpdateAction, Path["UpdateOperationData"], Path["Filter"]>;
451
466
  destRelation?: OakOperation<"create", Relation["CreateOperationData"]> | OakOperation<BaseRelation.OpUpdateAction, Relation["UpdateOperationData"], Relation["Filter"]>;
452
467
  }>;
453
468
  CreateSingle: OakOperation<"create", RelationAuth["CreateOperationData"]>;
@@ -455,6 +470,7 @@ export type RelationAuth = {
455
470
  Create: RelationAuth["CreateSingle"] | RelationAuth["CreateMulti"];
456
471
  UpdateOperationData: FormUpdateData<BaseRelationAuth.OpSchema & {
457
472
  sourceRelation?: OakOperation<"create", Relation["CreateOperationData"]> | OakOperation<BaseRelation.OpUpdateAction, Relation["UpdateOperationData"], Relation["Filter"]> | OakOperation<"remove", Relation["RemoveOperationData"], Relation["Filter"]>;
473
+ path?: OakOperation<"create", Path["CreateOperationData"]> | OakOperation<BasePath.OpUpdateAction, Path["UpdateOperationData"], Path["Filter"]> | OakOperation<"remove", Path["RemoveOperationData"], Path["Filter"]>;
458
474
  destRelation?: OakOperation<"create", Relation["CreateOperationData"]> | OakOperation<BaseRelation.OpUpdateAction, Relation["UpdateOperationData"], Relation["Filter"]> | OakOperation<"remove", Relation["RemoveOperationData"], Relation["Filter"]>;
459
475
  }>;
460
476
  Update: OakOperation<BaseRelationAuth.OpUpdateAction, RelationAuth["UpdateOperationData"], RelationAuth["Filter"], RelationAuth["Sorter"]>;
@@ -37,7 +37,6 @@ exports.desc = {
37
37
  type: "object"
38
38
  }
39
39
  },
40
- static: true,
41
40
  actionType: "crud",
42
41
  actions: action_1.genericActions,
43
42
  indexes: [
@@ -19,7 +19,6 @@ exports.desc = {
19
19
  }
20
20
  },
21
21
  recursive: {
22
- notNull: true,
23
22
  type: "boolean"
24
23
  },
25
24
  sourceEntity: {
@@ -36,7 +35,6 @@ exports.desc = {
36
35
  }
37
36
  }
38
37
  },
39
- static: true,
40
38
  actionType: "crud",
41
39
  actions: action_1.genericActions,
42
40
  indexes: [
@@ -5,7 +5,7 @@ import { String, Boolean } from "../../types/DataType";
5
5
  export type OpSchema = EntityShape & {
6
6
  destEntity: String<32>;
7
7
  value: String<256>;
8
- recursive: Boolean;
8
+ recursive?: Boolean | null;
9
9
  sourceEntity: String<32>;
10
10
  desc?: String<256> | null;
11
11
  } & {
@@ -20,7 +20,6 @@ exports.desc = {
20
20
  ref: "relation"
21
21
  }
22
22
  },
23
- static: true,
24
23
  actionType: "crud",
25
24
  actions: action_1.genericActions,
26
25
  indexes: [
@@ -28,7 +28,4 @@ const entityDesc = {
28
28
  },
29
29
  },
30
30
  ],
31
- configuration: {
32
- static: true,
33
- }
34
31
  };
@@ -30,7 +30,4 @@ const entityDesc = {
30
30
  },
31
31
  }
32
32
  ],
33
- configuration: {
34
- static: true,
35
- }
36
33
  };
@@ -3,7 +3,7 @@ import { EntityShape } from '../types/Entity';
3
3
  export interface Schema extends EntityShape {
4
4
  destEntity: String<32>;
5
5
  value: String<256>;
6
- recursive: Boolean;
6
+ recursive?: Boolean;
7
7
  sourceEntity: String<32>;
8
8
  desc?: String<256>;
9
9
  }
@@ -33,7 +33,4 @@ const entityDesc = {
33
33
  },
34
34
  },
35
35
  },
36
- configuration: {
37
- static: true,
38
- }
39
36
  };
@@ -31,7 +31,4 @@ const entityDesc = {
31
31
  },
32
32
  },
33
33
  },
34
- configuration: {
35
- static: true,
36
- }
37
34
  };
@@ -72,4 +72,5 @@ export interface AsyncRowStore<ED extends EntityDict & BaseEntityDict, Cxt exten
72
72
  commit(txnId: string): Promise<void>;
73
73
  rollback(txnId: string): Promise<void>;
74
74
  exec(script: string, txnId?: string): Promise<void>;
75
+ checkRelationAsync<T extends keyof ED, Cxt extends AsyncContext<ED>>(entity: T, operation: Omit<ED[T]['Operation'] | ED[T]['Selection'], 'id'>, context: Cxt): Promise<void>;
75
76
  }
@@ -34,7 +34,7 @@ function createExpiredWatchers(schema) {
34
34
  function makeIntrinsicLogics(schema, actionDefDict, attrUpdateMatrix) {
35
35
  const checkers = (0, IntrinsicCheckers_1.makeIntrinsicCheckers)(schema, actionDefDict, attrUpdateMatrix);
36
36
  const triggers = (0, modi_1.createModiRelatedTriggers)(schema);
37
- triggers.push(...triggers_1.actionAuthTriggers, ...triggers_1.logTriggers);
37
+ triggers.push(...triggers_1.actionAuthTriggers, ...triggers_1.triggers);
38
38
  const watchers = createExpiredWatchers(schema);
39
39
  return {
40
40
  triggers,
@@ -276,12 +276,17 @@ class TriggerExecutor {
276
276
  // 加上modi的过滤条件
277
277
  && this.judgeModiTurn(option, trigger));
278
278
  if (triggers) {
279
- const preTriggers = triggers.filter(ele => ele.when === 'before' && (!ele.check || ele.check(operation))
280
- && (!ele.attributes || (0, lodash_1.difference)(ele.attributes, Object.keys(operation.data)).length === 0));
281
- const commitTriggers = triggers.filter(ele => ele.when === 'commit' &&
282
- (!ele.check || ele.check(operation)));
279
+ // 这里的check和attribute的检查要到trigger实际执行的时候再做,前面的trigger可能对后面的有影响
280
+ const preTriggers = triggers.filter(ele => ele.when === 'before');
281
+ const commitTriggers = triggers.filter(ele => ele.when === 'commit');
283
282
  if (context instanceof SyncRowStore_1.SyncContext) {
284
283
  for (const trigger of preTriggers) {
284
+ if (trigger.check && !trigger.check(operation)) {
285
+ continue;
286
+ }
287
+ if (trigger.attributes && (0, lodash_1.difference)(trigger.attributes, Object.keys(operation.data)).length === 0) {
288
+ continue;
289
+ }
285
290
  if (trigger.filter) {
286
291
  // trigger只对满足条件的前项进行判断,如果确定不满足可以pass
287
292
  (0, assert_1.default)(operation.action !== 'create');
@@ -307,6 +312,12 @@ class TriggerExecutor {
307
312
  return;
308
313
  }
309
314
  const trigger = preTriggers[idx];
315
+ if (trigger.check && !trigger.check(operation)) {
316
+ return execPreTrigger(idx + 1);
317
+ }
318
+ if (trigger.attributes && (0, lodash_1.difference)(trigger.attributes, Object.keys(operation.data)).length === 0) {
319
+ return execPreTrigger(idx + 1);
320
+ }
310
321
  if (trigger.filter) {
311
322
  (0, assert_1.default)(operation.action !== 'create');
312
323
  const { filter } = trigger;
@@ -336,6 +347,12 @@ class TriggerExecutor {
336
347
  }
337
348
  (0, assert_1.default)(!action_1.readOnlyActions.includes(operation.action), '当前应该不支持select的跨事务trigger');
338
349
  const trigger = commitTriggers[idx];
350
+ if (trigger.check && !trigger.check(operation)) {
351
+ return execCommitTrigger(idx + 1);
352
+ }
353
+ if (trigger.attributes && (0, lodash_1.difference)(trigger.attributes, Object.keys(operation.data)).length === 0) {
354
+ return execCommitTrigger(idx + 1);
355
+ }
339
356
  if (trigger.filter) {
340
357
  (0, assert_1.default)(operation.action !== 'create');
341
358
  const { filter } = trigger;
@@ -426,6 +443,7 @@ class TriggerExecutor {
426
443
  }
427
444
  postOperation(entity, operation, context, option, result) {
428
445
  const { action } = operation;
446
+ // 后trigger不会再改operation中的Data了,在这里检查好像没太大问题。by Xc 20251010
429
447
  const triggers = this.triggerMap[entity] && this.triggerMap[entity][action]?.filter(trigger => (typeof trigger.action === 'string' && trigger.action === operation.action
430
448
  || trigger.action instanceof Array && trigger.action.includes(operation.action))
431
449
  // 加上modi的过滤条件
@@ -21,7 +21,8 @@ function translateCreateDataToFilter(schema, entity, data, allowUnrecoganized) {
21
21
  'sequence',
22
22
  'array',
23
23
  'object'
24
- ].includes(schema[entity].attributes[attr]?.type)) {
24
+ ].includes(schema[entity].attributes[attr]?.type) || entity === 'userEntityGrant') {
25
+ // 这里要过滤掉userEntityGrant这一特殊对象,因为其relationIds和relationEntityFilter这两个属性后面要用
25
26
  if (data[attr] === null) {
26
27
  data2[attr] = {
27
28
  $exists: false,
@@ -3,4 +3,4 @@ import { EntityDict } from '../types/Entity';
3
3
  import { Trigger } from '../types';
4
4
  import { AsyncContext } from './AsyncRowStore';
5
5
  export declare const actionAuthTriggers: Trigger<EntityDict & BaseEntityDict, 'actionAuth', AsyncContext<EntityDict & BaseEntityDict>>[];
6
- export declare const logTriggers: Trigger<EntityDict & BaseEntityDict, 'log', AsyncContext<EntityDict & BaseEntityDict>>[];
6
+ export declare const triggers: Trigger<EntityDict & BaseEntityDict, keyof (EntityDict & BaseEntityDict), AsyncContext<EntityDict & BaseEntityDict>>[];
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.logTriggers = exports.actionAuthTriggers = void 0;
3
+ exports.triggers = exports.actionAuthTriggers = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const types_1 = require("../types");
6
6
  const uuid_1 = require("../utils/uuid");
@@ -176,7 +176,7 @@ async function redoLog(log, context) {
176
176
  dontCreateOper: true,
177
177
  });
178
178
  }
179
- exports.logTriggers = [
179
+ exports.triggers = [
180
180
  {
181
181
  name: '当log被undo时,同一entity上所有在其之后的log全部回滚',
182
182
  entity: 'log',
@@ -383,4 +383,25 @@ exports.logTriggers = [
383
383
  return result.oper?.remove || 0;
384
384
  }
385
385
  },
386
+ // 当删除userRelation时,一并删除掉关联的userEntityClaim,这个设计似乎不是太好
387
+ {
388
+ name: '当删除userRelation时,一并删除掉关联的userEntityClaim',
389
+ action: 'remove',
390
+ entity: 'userRelation',
391
+ when: 'before',
392
+ fn: async ({ operation }, context, option) => {
393
+ const { filter } = operation;
394
+ const close = context.openRootMode();
395
+ const result = await context.operate('userEntityClaim', {
396
+ id: await (0, uuid_1.generateNewIdAsync)(),
397
+ action: 'remove',
398
+ data: {},
399
+ filter: {
400
+ userRelation: filter,
401
+ },
402
+ }, option);
403
+ close();
404
+ return result.userEntityClaim?.remove || 0;
405
+ }
406
+ },
386
407
  ];
@@ -11,7 +11,7 @@ export declare abstract class AppLoader<ED extends EntityDict & BaseEntityDict,
11
11
  message?: string;
12
12
  result: any;
13
13
  }>;
14
- abstract initialize(dropIfExists?: boolean): Promise<void>;
14
+ abstract initialize(ifExists?: 'drop' | 'omit' | 'dropIfNotStatic'): Promise<void>;
15
15
  abstract mount(): Promise<void>;
16
16
  abstract unmount(): Promise<void>;
17
17
  abstract getStore(): AsyncRowStore<ED, Cxt>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oak-domain",
3
- "version": "5.1.27",
3
+ "version": "5.1.28",
4
4
  "author": {
5
5
  "name": "XuChang"
6
6
  },
@@ -38,7 +38,4 @@ const entityDesc: EntityDesc<Schema> = {
38
38
  },
39
39
  },
40
40
  ],
41
- configuration: {
42
- static: true,
43
- }
44
41
  };
@@ -39,7 +39,4 @@ const entityDesc: EntityDesc<Schema> = {
39
39
  },
40
40
  }
41
41
  ],
42
- configuration: {
43
- static: true,
44
- }
45
42
  };
@@ -5,7 +5,7 @@ import { EntityDesc } from '../types/EntityDesc';
5
5
  export interface Schema extends EntityShape {
6
6
  destEntity: String<32>;
7
7
  value: String<256>;
8
- recursive: Boolean;
8
+ recursive?: Boolean;
9
9
  sourceEntity: String<32>;
10
10
  desc?: String<256>;
11
11
  };
@@ -42,7 +42,4 @@ const entityDesc: EntityDesc<Schema> = {
42
42
  },
43
43
  },
44
44
  },
45
- configuration: {
46
- static: true,
47
- }
48
45
  };
@@ -41,7 +41,4 @@ const entityDesc: EntityDesc<Schema> = {
41
41
  },
42
42
  },
43
43
  },
44
- configuration: {
45
- static: true,
46
- }
47
44
  };