oak-domain 5.0.20 → 5.1.0

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.
Files changed (56) hide show
  1. package/lib/base-app-domain/ActionDefDict.d.ts +6 -0
  2. package/lib/base-app-domain/ActionDefDict.js +8 -4
  3. package/lib/base-app-domain/EntityDict.d.ts +2 -0
  4. package/lib/base-app-domain/Log/Action.d.ts +12 -0
  5. package/lib/base-app-domain/Log/Action.js +14 -0
  6. package/lib/base-app-domain/Log/Schema.d.ts +135 -0
  7. package/lib/base-app-domain/Log/Schema.js +2 -0
  8. package/lib/base-app-domain/Log/Storage.d.ts +3 -0
  9. package/lib/base-app-domain/Log/Storage.js +28 -0
  10. package/lib/base-app-domain/Log/Style.d.ts +3 -0
  11. package/lib/base-app-domain/Log/Style.js +15 -0
  12. package/lib/base-app-domain/ModiEntity/Schema.d.ts +34 -5
  13. package/lib/base-app-domain/ModiEntity/Storage.js +1 -1
  14. package/lib/base-app-domain/Oper/Action.d.ts +12 -0
  15. package/lib/base-app-domain/Oper/Action.js +14 -0
  16. package/lib/base-app-domain/Oper/Schema.d.ts +56 -6
  17. package/lib/base-app-domain/Oper/Storage.js +14 -3
  18. package/lib/base-app-domain/Oper/Style.d.ts +3 -0
  19. package/lib/base-app-domain/Oper/Style.js +15 -0
  20. package/lib/base-app-domain/OperEntity/Schema.d.ts +46 -6
  21. package/lib/base-app-domain/OperEntity/Storage.js +1 -1
  22. package/lib/base-app-domain/Storage.js +24 -22
  23. package/lib/base-app-domain/StyleDict.js +8 -4
  24. package/lib/base-app-domain/User/Schema.d.ts +2 -2
  25. package/lib/base-app-domain/_SubQuery.d.ts +12 -0
  26. package/lib/compiler/schemalBuilder.js +22 -1
  27. package/lib/entities/Log.d.ts +16 -0
  28. package/lib/entities/Log.js +45 -0
  29. package/lib/entities/Oper.d.ts +9 -0
  30. package/lib/entities/Oper.js +33 -3
  31. package/lib/store/AsyncRowStore.d.ts +3 -2
  32. package/lib/store/CascadeStore.js +45 -8
  33. package/lib/store/IntrinsicCheckers.js +11 -6
  34. package/lib/store/IntrinsicLogics.js +2 -2
  35. package/lib/store/SyncRowStore.d.ts +3 -2
  36. package/lib/store/triggers.d.ts +6 -0
  37. package/lib/store/triggers.js +351 -0
  38. package/lib/types/AppLoader.d.ts +2 -1
  39. package/lib/types/Aspect.d.ts +3 -2
  40. package/lib/types/Auth.d.ts +8 -7
  41. package/lib/types/Endpoint.d.ts +3 -2
  42. package/lib/types/Entity.d.ts +1 -0
  43. package/lib/types/EntityDesc.d.ts +1 -1
  44. package/lib/types/Port.d.ts +3 -2
  45. package/lib/types/RowStore.d.ts +4 -3
  46. package/lib/types/Storage.d.ts +1 -0
  47. package/lib/types/Timer.d.ts +6 -5
  48. package/lib/types/Trigger.d.ts +21 -20
  49. package/lib/types/Watcher.d.ts +5 -4
  50. package/lib/utils/assert.d.ts +0 -1
  51. package/lib/utils/relationPath.js +1 -1
  52. package/package.json +1 -1
  53. package/src/entities/Log.ts +59 -0
  54. package/src/entities/Oper.ts +45 -4
  55. package/lib/store/actionAuth.d.ts +0 -4
  56. package/lib/store/actionAuth.js +0 -25
@@ -39,6 +39,7 @@ export type OperateOption = {
39
39
  allowExists?: boolean;
40
40
  modiParentId?: string;
41
41
  modiParentEntity?: string;
42
+ logId?: string;
42
43
  deletePhysically?: boolean;
43
44
  applyingModi?: boolean;
44
45
  dummy?: 1;
@@ -18,7 +18,7 @@ export type AttrUpdateMatrix<ED extends EntityDict> = {
18
18
  [T in keyof ED]?: {
19
19
  [A in keyof ED[T]['Update']['data']]?: {
20
20
  actions?: ED[T]['Action'][];
21
- filter?: NonNullable<ED[T]['Selection']['filter']>;
21
+ filter?: (NonNullable<ED[T]['Selection']['filter']>) | ((action: ED[T]['Action']) => NonNullable<ED[T]['Selection']['filter']>);
22
22
  };
23
23
  };
24
24
  };
@@ -1,6 +1,7 @@
1
1
  import { AsyncContext } from "../store/AsyncRowStore";
2
2
  import { EntityDict } from "./Entity";
3
- export type Exportation<ED extends EntityDict, T extends keyof ED, K extends string, Cxt extends AsyncContext<ED>> = {
3
+ import { EntityDict as BaseEntityDict } from '../base-app-domain';
4
+ export type Exportation<ED extends EntityDict & BaseEntityDict, T extends keyof ED, K extends string, Cxt extends AsyncContext<ED>> = {
4
5
  name: string;
5
6
  id: string;
6
7
  entity: T;
@@ -9,7 +10,7 @@ export type Exportation<ED extends EntityDict, T extends keyof ED, K extends str
9
10
  makeHeaders?: (dataList: Partial<ED[T]['Schema']>[]) => string[];
10
11
  fn: (data: ED[T]['Schema'], context?: Cxt, properties?: Record<string, any>) => Promise<Partial<Record<string, string | number | boolean | null>>> | Partial<Record<string, string | number | boolean | null>>;
11
12
  };
12
- export type Importation<ED extends EntityDict, T extends keyof ED, K extends string, Cxt extends AsyncContext<ED>> = {
13
+ export type Importation<ED extends EntityDict & BaseEntityDict, T extends keyof ED, K extends string, Cxt extends AsyncContext<ED>> = {
13
14
  name: string;
14
15
  id: string;
15
16
  entity: T;
@@ -3,12 +3,13 @@ import { StorageSchema } from './Storage';
3
3
  import { AsyncContext } from '../store/AsyncRowStore';
4
4
  import { SyncContext } from '../store/SyncRowStore';
5
5
  import { OperateOption, SelectOption } from '.';
6
+ import { EntityDict as BaseEntityDict } from '../base-app-domain';
6
7
  export type TxnOption = {
7
8
  isolationLevel: 'repeatable read' | 'serializable';
8
9
  };
9
- export type SelectionRewriter<ED extends EntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>, Op extends SelectOption> = (schema: StorageSchema<ED>, entity: keyof ED, selection: ED[keyof ED]['Selection'] | ED[keyof ED]['Aggregation'], context: Cxt, option: Op, isAggr?: true) => void | Promise<void>;
10
- export type OperationRewriter<ED extends EntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>, Op extends OperateOption> = (schema: StorageSchema<ED>, entity: keyof ED, operate: ED[keyof ED]['Operation'], context: Cxt, option: Op) => void | Promise<void>;
11
- export declare abstract class RowStore<ED extends EntityDict> {
10
+ export type SelectionRewriter<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>, Op extends SelectOption> = (schema: StorageSchema<ED>, entity: keyof ED, selection: ED[keyof ED]['Selection'] | ED[keyof ED]['Aggregation'], context: Cxt, option: Op, isAggr?: true) => void | Promise<void>;
11
+ export type OperationRewriter<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>, Op extends OperateOption> = (schema: StorageSchema<ED>, entity: keyof ED, operate: ED[keyof ED]['Operation'], context: Cxt, option: Op) => void | Promise<void>;
12
+ export declare abstract class RowStore<ED extends EntityDict & BaseEntityDict> {
12
13
  protected storageSchema: StorageSchema<ED>;
13
14
  constructor(storageSchema: StorageSchema<ED>);
14
15
  abstract registerOperationRewriter(rewriter: OperationRewriter<ED, AsyncContext<ED> | SyncContext<ED>, SelectOption>): void;
@@ -46,6 +46,7 @@ export interface StorageDesc<SH extends EntityShape> {
46
46
  config?: EntityConfig;
47
47
  toModi?: true;
48
48
  inModi?: true;
49
+ toLog?: true;
49
50
  static?: true;
50
51
  actions: string[];
51
52
  actionType: ActionType;
@@ -1,21 +1,22 @@
1
1
  import { RecurrenceRule, RecurrenceSpecDateRange, RecurrenceSpecObjLit } from 'node-schedule';
2
2
  import { EntityDict } from './Entity';
3
+ import { EntityDict as BaseEntityDict } from '../base-app-domain';
3
4
  import { AsyncContext } from '../store/AsyncRowStore';
4
5
  import { Watcher } from './Watcher';
5
6
  import { OperationResult } from '.';
6
- type FreeOperateFn<ED extends EntityDict, Cxt extends AsyncContext<ED>> = (context: Cxt) => Promise<OperationResult<ED>>;
7
- export type FreeRoutine<ED extends EntityDict, Cxt extends AsyncContext<ED>> = {
7
+ type FreeOperateFn<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED>> = (context: Cxt) => Promise<OperationResult<ED>>;
8
+ export type FreeRoutine<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED>> = {
8
9
  name: string;
9
10
  routine: FreeOperateFn<ED, Cxt>;
10
11
  };
11
- export type FreeTimer<ED extends EntityDict, Cxt extends AsyncContext<ED>> = {
12
+ export type FreeTimer<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED>> = {
12
13
  name: string;
13
14
  cron: RecurrenceRule | RecurrenceSpecDateRange | RecurrenceSpecObjLit | Date | string | number;
14
15
  timer: FreeOperateFn<ED, Cxt>;
15
16
  singleton?: true;
16
17
  };
17
- export type Routine<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>> = FreeRoutine<ED, Cxt> | Watcher<ED, T, Cxt>;
18
- export type Timer<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>> = FreeTimer<ED, Cxt> | Watcher<ED, T, Cxt> & {
18
+ export type Routine<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>> = FreeRoutine<ED, Cxt> | Watcher<ED, T, Cxt>;
19
+ export type Timer<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>> = FreeTimer<ED, Cxt> | Watcher<ED, T, Cxt> & {
19
20
  cron: RecurrenceRule | RecurrenceSpecDateRange | RecurrenceSpecObjLit | Date | string | number;
20
21
  };
21
22
  export {};
@@ -4,6 +4,7 @@ import { AsyncContext } from "../store/AsyncRowStore";
4
4
  import { SyncContext } from "../store/SyncRowStore";
5
5
  import { EntityDict, OperateOption } from "../types/Entity";
6
6
  import { EntityShape } from "../types/Entity";
7
+ import { EntityDict as BaseEntityDict } from '../base-app-domain';
7
8
  export type ModiTurn = 'create' | 'apply' | 'both';
8
9
  /**
9
10
  * 优先级越小,越早执行。定义在1~99之间
@@ -17,25 +18,25 @@ export declare const CHECKER_MAX_PRIORITY = 99;
17
18
  * 允许logicalData去改data中的值
18
19
  */
19
20
  export declare const CHECKER_PRIORITY_MAP: Record<CheckerType, number>;
20
- interface TriggerBase<ED extends EntityDict, T extends keyof ED> {
21
+ interface TriggerBase<ED extends EntityDict & BaseEntityDict, T extends keyof ED> {
21
22
  checkerType?: CheckerType;
22
23
  entity: T;
23
24
  name: string;
24
25
  asRoot?: true;
25
26
  priority?: number;
26
27
  }
27
- export interface CreateTriggerBase<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends TriggerBase<ED, T> {
28
+ export interface CreateTriggerBase<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends TriggerBase<ED, T> {
28
29
  action: 'create';
29
30
  mt?: ModiTurn;
30
31
  check?: (operation: ED[T]['Create']) => boolean;
31
32
  }
32
- export interface CreateTriggerInTxn<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends CreateTriggerBase<ED, T, Cxt> {
33
+ export interface CreateTriggerInTxn<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends CreateTriggerBase<ED, T, Cxt> {
33
34
  when: 'before' | 'after';
34
35
  fn: (event: {
35
36
  operation: ED[T]['Create'];
36
37
  }, context: Cxt, option: OperateOption) => Promise<number> | number;
37
38
  }
38
- interface TriggerCrossTxn<ED extends EntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>> {
39
+ interface TriggerCrossTxn<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>> {
39
40
  when: 'commit';
40
41
  strict?: 'takeEasy' | 'makeSure';
41
42
  cs?: true;
@@ -45,72 +46,72 @@ interface TriggerCrossTxn<ED extends EntityDict, Cxt extends AsyncContext<ED> |
45
46
  ids: string[];
46
47
  }, context: Cxt, option: OperateOption) => Promise<((context: Cxt, option: OperateOption) => Promise<any>) | void>;
47
48
  }
48
- export interface CreateTriggerCrossTxn<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends CreateTriggerBase<ED, T, Cxt>, TriggerCrossTxn<ED, Cxt> {
49
+ export interface CreateTriggerCrossTxn<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends CreateTriggerBase<ED, T, Cxt>, TriggerCrossTxn<ED, Cxt> {
49
50
  }
50
- export type CreateTrigger<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = CreateTriggerInTxn<ED, T, Cxt> | CreateTriggerCrossTxn<ED, T, Cxt>;
51
+ export type CreateTrigger<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = CreateTriggerInTxn<ED, T, Cxt> | CreateTriggerCrossTxn<ED, T, Cxt>;
51
52
  /**
52
53
  * update trigger如果带有filter,说明只对存在限定条件的行起作用。此时系统在进行相应动作时,
53
54
  * 会判定当前动作的filter条件和trigger所定义的filter是否有交集(即有同时满足两个条件的行)
54
55
  * 只要有,就会触发trigger。要注意的是这个条件是exists而不是all
55
56
  */
56
- export interface UpdateTriggerBase<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends TriggerBase<ED, T> {
57
+ export interface UpdateTriggerBase<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends TriggerBase<ED, T> {
57
58
  action: Exclude<ED[T]['Action'], GenericAction> | 'update' | Array<Exclude<ED[T]['Action'], GenericAction> | 'update'>;
58
59
  attributes?: keyof ED[T]['OpSchema'] | Array<keyof ED[T]['OpSchema']>;
59
60
  mt?: ModiTurn;
60
61
  check?: (operation: ED[T]['Update']) => boolean;
61
62
  filter?: ED[T]['Update']['filter'] | ((operation: ED[T]['Update'], context: Cxt, option: OperateOption) => ED[T]['Update']['filter'] | Promise<ED[T]['Update']['filter']>);
62
63
  }
63
- export interface UpdateTriggerInTxn<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends UpdateTriggerBase<ED, T, Cxt> {
64
+ export interface UpdateTriggerInTxn<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends UpdateTriggerBase<ED, T, Cxt> {
64
65
  when: 'before' | 'after';
65
66
  fn: (event: {
66
67
  operation: ED[T]['Update'];
67
68
  }, context: Cxt, option: OperateOption) => Promise<number> | number;
68
69
  }
69
- export interface UpdateTriggerCrossTxn<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends UpdateTriggerBase<ED, T, Cxt>, TriggerCrossTxn<ED, Cxt> {
70
+ export interface UpdateTriggerCrossTxn<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends UpdateTriggerBase<ED, T, Cxt>, TriggerCrossTxn<ED, Cxt> {
70
71
  }
71
- export type UpdateTrigger<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = UpdateTriggerInTxn<ED, T, Cxt> | UpdateTriggerCrossTxn<ED, T, Cxt>;
72
+ export type UpdateTrigger<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = UpdateTriggerInTxn<ED, T, Cxt> | UpdateTriggerCrossTxn<ED, T, Cxt>;
72
73
  /**
73
74
  * 同update trigger一样,remove trigger如果带有filter,说明只对存在限定条件的行起作用。此时系统在进行相应动作时,
74
75
  * 会判定当前动作的filter条件和trigger所定义的filter是否有交集(即有同时满足两个条件的行)
75
76
  * 只要有,就会触发trigger。要注意的是这个条件是exists而不是all
76
77
  */
77
- export interface RemoveTriggerBase<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends TriggerBase<ED, T> {
78
+ export interface RemoveTriggerBase<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends TriggerBase<ED, T> {
78
79
  action: 'remove';
79
80
  mt?: ModiTurn;
80
81
  check?: (operation: ED[T]['Remove']) => boolean;
81
82
  filter?: ED[T]['Remove']['filter'] | ((operation: ED[T]['Remove'], context: Cxt, option: OperateOption) => ED[T]['Remove']['filter'] | Promise<ED[T]['Remove']['filter']>);
82
83
  }
83
- export interface RemoveTriggerInTxn<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends RemoveTriggerBase<ED, T, Cxt> {
84
+ export interface RemoveTriggerInTxn<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends RemoveTriggerBase<ED, T, Cxt> {
84
85
  when: 'before' | 'after';
85
86
  fn: (event: {
86
87
  operation: ED[T]['Remove'];
87
88
  }, context: Cxt, option: OperateOption) => Promise<number> | number;
88
89
  }
89
- export interface RemoveTriggerCrossTxn<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends RemoveTriggerBase<ED, T, Cxt>, TriggerCrossTxn<ED, Cxt> {
90
+ export interface RemoveTriggerCrossTxn<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends RemoveTriggerBase<ED, T, Cxt>, TriggerCrossTxn<ED, Cxt> {
90
91
  }
91
- export type RemoveTrigger<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = RemoveTriggerInTxn<ED, T, Cxt> | RemoveTriggerCrossTxn<ED, T, Cxt>;
92
- export interface SelectTriggerBase<ED extends EntityDict, T extends keyof ED> extends TriggerBase<ED, T> {
92
+ export type RemoveTrigger<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = RemoveTriggerInTxn<ED, T, Cxt> | RemoveTriggerCrossTxn<ED, T, Cxt>;
93
+ export interface SelectTriggerBase<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends TriggerBase<ED, T> {
93
94
  action: 'select';
94
95
  }
95
96
  /**
96
97
  * selection似乎不需要支持跨事务?没想清楚
97
98
  * todo by Xc
98
99
  */
99
- export interface SelectTriggerBefore<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends SelectTriggerBase<ED, T> {
100
+ export interface SelectTriggerBefore<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends SelectTriggerBase<ED, T> {
100
101
  when: 'before';
101
102
  fn: (event: {
102
103
  operation: ED[T]['Selection'];
103
104
  }, context: Cxt, params?: SelectOption) => Promise<number> | number;
104
105
  }
105
- export interface SelectTriggerAfter<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends SelectTriggerBase<ED, T> {
106
+ export interface SelectTriggerAfter<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends SelectTriggerBase<ED, T> {
106
107
  when: 'after';
107
108
  fn: (event: {
108
109
  operation: ED[T]['Selection'];
109
110
  result: Partial<ED[T]['Schema']>[];
110
111
  }, context: Cxt, params?: SelectOption) => Promise<number> | number;
111
112
  }
112
- export type SelectTrigger<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = SelectTriggerBefore<ED, T, Cxt> | SelectTriggerAfter<ED, T, Cxt>;
113
- export type Trigger<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = CreateTrigger<ED, T, Cxt> | UpdateTrigger<ED, T, Cxt> | RemoveTrigger<ED, T, Cxt> | SelectTrigger<ED, T, Cxt>;
113
+ export type SelectTrigger<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = SelectTriggerBefore<ED, T, Cxt> | SelectTriggerAfter<ED, T, Cxt>;
114
+ export type Trigger<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = CreateTrigger<ED, T, Cxt> | UpdateTrigger<ED, T, Cxt> | RemoveTrigger<ED, T, Cxt> | SelectTrigger<ED, T, Cxt>;
114
115
  export interface TriggerEntityShape extends EntityShape {
115
116
  $$triggerData$$?: {
116
117
  name: string;
@@ -118,5 +119,5 @@ export interface TriggerEntityShape extends EntityShape {
118
119
  };
119
120
  $$triggerTimestamp$$?: number;
120
121
  }
121
- export type VolatileTrigger<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = CreateTriggerCrossTxn<ED, T, Cxt> | UpdateTriggerCrossTxn<ED, T, Cxt> | RemoveTriggerCrossTxn<ED, T, Cxt>;
122
+ export type VolatileTrigger<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = CreateTriggerCrossTxn<ED, T, Cxt> | UpdateTriggerCrossTxn<ED, T, Cxt> | RemoveTriggerCrossTxn<ED, T, Cxt>;
122
123
  export {};
@@ -1,8 +1,9 @@
1
1
  import { ReadOnlyAction } from "../actions/action";
2
2
  import { AsyncContext } from "../store/AsyncRowStore";
3
3
  import { EntityDict, OperationResult } from "./Entity";
4
- type ActionData<ED extends EntityDict, T extends keyof ED> = ED[T]['Update']['data'] | ED[T]['Remove']['data'];
5
- export interface BBWatcher<ED extends EntityDict, T extends keyof ED> {
4
+ import { EntityDict as BaseEntityDict } from '../base-app-domain';
5
+ type ActionData<ED extends EntityDict & BaseEntityDict, T extends keyof ED> = ED[T]['Update']['data'] | ED[T]['Remove']['data'];
6
+ export interface BBWatcher<ED extends EntityDict & BaseEntityDict, T extends keyof ED> {
6
7
  name: string;
7
8
  entity: T;
8
9
  filter: ED[T]['Selection']['filter'] | (() => ED[T]['Selection']['filter']);
@@ -10,7 +11,7 @@ export interface BBWatcher<ED extends EntityDict, T extends keyof ED> {
10
11
  actionData: ActionData<ED, T> | (() => Promise<ActionData<ED, T>>);
11
12
  singleton?: true;
12
13
  }
13
- export interface WBWatcher<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>> {
14
+ export interface WBWatcher<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>> {
14
15
  name: string;
15
16
  entity: T;
16
17
  filter: ED[T]['Selection']['filter'] | (() => Promise<ED[T]['Selection']['filter']>);
@@ -18,5 +19,5 @@ export interface WBWatcher<ED extends EntityDict, T extends keyof ED, Cxt extend
18
19
  fn: (context: Cxt, data: Partial<ED[T]['Schema']>[]) => Promise<OperationResult<ED>>;
19
20
  singleton?: true;
20
21
  }
21
- export type Watcher<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>> = BBWatcher<ED, T> | WBWatcher<ED, T, Cxt>;
22
+ export type Watcher<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED>> = BBWatcher<ED, T> | WBWatcher<ED, T, Cxt>;
22
23
  export {};
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  /**
3
2
  * 防止assert打包体积过大,从这里引用
4
3
  */
@@ -60,7 +60,7 @@ function destructRelationPath(schema, entity, path, relationFilter, recursive) {
60
60
  },
61
61
  filter: relationFilter,
62
62
  } // as ED['userRelation']['Selection']
63
- }, // as ED[keyof ED]['Selection']['data'],
63
+ },
64
64
  getData: (d) => {
65
65
  return d.userRelation$entity;
66
66
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oak-domain",
3
- "version": "5.0.20",
3
+ "version": "5.1.0",
4
4
  "author": {
5
5
  "name": "XuChang"
6
6
  },
@@ -0,0 +1,59 @@
1
+ import { ActionDef } from '../types/Action';
2
+ import { String, Int, Datetime, Image, Boolean, Text } from '../types/DataType';
3
+ import { EntityShape } from '../types/Entity';
4
+ import { EntityDesc } from '../types/EntityDesc';
5
+
6
+ export interface Schema extends EntityShape {
7
+ entity: String<32>; // 关联的目标对象
8
+ entityId: String<64>; // 关联的目标对象id
9
+ };
10
+
11
+ export type IState = 'normal' | 'rollbacked';
12
+ export type State = IState;
13
+ export type IAction = 'undo' | 'redo';
14
+ export type Action = IAction;
15
+ export const IActionDef: ActionDef<IAction, IState> = {
16
+ stm: {
17
+ undo: ['normal', 'rollbacked'],
18
+ redo: ['rollbacked', 'normal'],
19
+ },
20
+ is: 'normal',
21
+ };
22
+
23
+
24
+ export const entityDesc: EntityDesc<Schema, Action, '', {
25
+ iState: IState,
26
+ }> = {
27
+ locales: {
28
+ zh_CN: {
29
+ name: '日志',
30
+ attr: {
31
+ entity: '关联对象',
32
+ entityId: '关联对象ID',
33
+ iState: '状态'
34
+ },
35
+ action: {
36
+ undo: '回滚',
37
+ redo: '重做',
38
+ },
39
+ v: {
40
+ iState: {
41
+ normal: '正常的',
42
+ rollbacked: '已回滚',
43
+ }
44
+ }
45
+ },
46
+ },
47
+ style: {
48
+ icon: {
49
+ undo: '',
50
+ redo: '',
51
+ },
52
+ color: {
53
+ iState: {
54
+ normal: '#229954',
55
+ rollbacked: '#2C3E50',
56
+ },
57
+ },
58
+ },
59
+ };
@@ -2,6 +2,8 @@ import { String, Int, Datetime, Image, Boolean, Text } from '../types/DataType';
2
2
  import { EntityShape } from '../types/Entity';
3
3
  import { Schema as User } from './User';
4
4
  import { EntityDesc } from '../types/EntityDesc';
5
+ import { Schema as Log } from './Log';
6
+ import { ActionDef } from '../types/Action';
5
7
 
6
8
  export interface Schema extends EntityShape {
7
9
  action: String<24>;
@@ -11,9 +13,26 @@ export interface Schema extends EntityShape {
11
13
  operator?: User;
12
14
  targetEntity: String<32>;
13
15
  bornAt?: Datetime;
16
+ log?: Log;
17
+ undoData?: Object;
14
18
  };
15
19
 
16
- const entityDesc: EntityDesc<Schema> = {
20
+
21
+ export type IState = 'normal' | 'rollbacked';
22
+ export type State = IState;
23
+ export type IAction = 'undo' | 'redo';
24
+ export type Action = IAction;
25
+ export const IActionDef: ActionDef<IAction, IState> = {
26
+ stm: {
27
+ undo: ['normal', 'rollbacked'],
28
+ redo: ['rollbacked', 'normal'],
29
+ },
30
+ is: 'normal',
31
+ };
32
+
33
+ const entityDesc: EntityDesc<Schema, Action, '', {
34
+ iState: IState,
35
+ }> = {
17
36
  locales: {
18
37
  zh_CN: {
19
38
  name: '操作',
@@ -24,12 +43,34 @@ const entityDesc: EntityDesc<Schema> = {
24
43
  extra: '其它',
25
44
  operator: '操作者',
26
45
  targetEntity: '关联对象',
27
- bornAt: '诞生时间'
46
+ bornAt: '诞生时间',
47
+ log: '关联日志',
48
+ undoData: '回滚数据',
49
+ iState: '状态',
28
50
  },
51
+ action: {
52
+ undo: '回滚',
53
+ redo: '重做',
54
+ },
55
+ v: {
56
+ iState: {
57
+ normal: '正常的',
58
+ rollbacked: '已回滚',
59
+ }
60
+ }
29
61
  },
30
62
  },
31
- configuration: {
32
- actionType: 'appendOnly',
63
+ style: {
64
+ icon: {
65
+ undo: '',
66
+ redo: '',
67
+ },
68
+ color: {
69
+ iState: {
70
+ normal: '#229954',
71
+ rollbacked: '#2C3E50',
72
+ },
73
+ },
33
74
  },
34
75
  indexes: [
35
76
  {
@@ -1,4 +0,0 @@
1
- import { EntityDict } from '../types/Entity';
2
- import { Trigger } from '../types';
3
- import { AsyncContext } from './AsyncRowStore';
4
- export declare const triggers: Trigger<EntityDict, 'actionAuth', AsyncContext<EntityDict>>[];
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.triggers = void 0;
4
- const uuid_1 = require("../utils/uuid");
5
- exports.triggers = [
6
- {
7
- name: '当actionAuth的deActions被置空后,删除此条数据',
8
- entity: 'actionAuth',
9
- action: 'update',
10
- fn: async ({ operation }, context, option) => {
11
- const { data, filter } = operation;
12
- if (data.deActions && data.deActions.length === 0) {
13
- await context.operate('actionAuth', {
14
- id: await (0, uuid_1.generateNewIdAsync)(),
15
- action: 'remove',
16
- data: {},
17
- filter,
18
- }, option);
19
- return 1;
20
- }
21
- return 0;
22
- },
23
- when: 'after',
24
- }
25
- ];