oak-domain 2.6.9 → 3.0.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.
- package/lib/actions/action.d.ts +1 -1
- package/lib/actions/action.js +2 -2
- package/lib/base-app-domain/ActionAuth/Schema.d.ts +25 -21
- package/lib/base-app-domain/ActionAuth/Storage.js +6 -13
- package/lib/base-app-domain/ActionDefDict.d.ts +1 -0
- package/lib/base-app-domain/ActionDefDict.js +3 -1
- package/lib/base-app-domain/EntityDict.d.ts +2 -0
- package/lib/base-app-domain/I18n/Schema.d.ts +129 -0
- package/lib/base-app-domain/I18n/Schema.js +2 -0
- package/lib/base-app-domain/I18n/Storage.d.ts +3 -0
- package/lib/base-app-domain/I18n/Storage.js +59 -0
- package/lib/base-app-domain/Modi/Action.d.ts +1 -1
- package/lib/base-app-domain/Modi/Schema.d.ts +10 -9
- package/lib/base-app-domain/ModiEntity/Schema.d.ts +42 -28
- package/lib/base-app-domain/ModiEntity/Storage.js +1 -1
- package/lib/base-app-domain/Oper/Schema.d.ts +15 -13
- package/lib/base-app-domain/OperEntity/Schema.d.ts +41 -27
- package/lib/base-app-domain/OperEntity/Storage.js +1 -1
- package/lib/base-app-domain/Relation/Schema.d.ts +50 -22
- package/lib/base-app-domain/Relation/Storage.js +1 -4
- package/lib/base-app-domain/Relation.d.ts +10 -0
- package/lib/base-app-domain/Relation.js +10 -0
- package/lib/base-app-domain/RelationAuth/Schema.d.ts +67 -43
- package/lib/base-app-domain/RelationAuth/Storage.js +9 -12
- package/lib/base-app-domain/Storage.js +20 -18
- package/lib/base-app-domain/User/Action.d.ts +1 -1
- package/lib/base-app-domain/User/Schema.d.ts +20 -14
- package/lib/base-app-domain/User/Storage.js +1 -2
- package/lib/base-app-domain/UserEntityGrant/Action.d.ts +5 -0
- package/lib/base-app-domain/UserEntityGrant/Action.js +5 -0
- package/lib/base-app-domain/UserEntityGrant/Schema.d.ts +53 -17
- package/lib/base-app-domain/UserEntityGrant/Storage.js +5 -7
- package/lib/base-app-domain/UserRelation/Schema.d.ts +35 -16
- package/lib/base-app-domain/UserRelation/Storage.js +21 -1
- package/lib/base-app-domain/_SubQuery.d.ts +40 -4
- package/lib/base-app-domain/index.d.ts +1 -0
- package/lib/base-app-domain/index.js +1 -0
- package/lib/checkers/index.d.ts +2 -2
- package/lib/checkers/index.js +2 -5
- package/lib/compiler/env.d.ts +3 -1
- package/lib/compiler/env.js +12 -2
- package/lib/compiler/localeBuilder.d.ts +22 -0
- package/lib/compiler/localeBuilder.js +169 -0
- package/lib/compiler/schemalBuilder.d.ts +9 -0
- package/lib/compiler/schemalBuilder.js +774 -362
- package/lib/entities/ActionAuth.d.ts +3 -2
- package/lib/entities/ActionAuth.js +21 -22
- package/lib/entities/I18n.d.ts +9 -0
- package/lib/entities/I18n.js +37 -0
- package/lib/entities/Modi.js +35 -33
- package/lib/entities/ModiEntity.js +12 -10
- package/lib/entities/Oper.js +15 -13
- package/lib/entities/OperEntity.js +12 -10
- package/lib/entities/Relation.d.ts +3 -3
- package/lib/entities/Relation.js +27 -25
- package/lib/entities/RelationAuth.d.ts +2 -5
- package/lib/entities/RelationAuth.js +27 -23
- package/lib/entities/User.js +20 -18
- package/lib/entities/UserEntityGrant.d.ts +2 -1
- package/lib/entities/UserEntityGrant.js +12 -7
- package/lib/entities/UserRelation.d.ts +3 -0
- package/lib/entities/UserRelation.js +30 -20
- package/lib/store/AsyncRowStore.d.ts +3 -0
- package/lib/store/AsyncRowStore.js +3 -0
- package/lib/store/CascadeStore.d.ts +9 -3
- package/lib/store/CascadeStore.js +247 -113
- package/lib/store/RelationAuth.d.ts +96 -0
- package/lib/store/RelationAuth.js +1307 -0
- package/lib/store/TriggerExecutor.d.ts +1 -2
- package/lib/store/TriggerExecutor.js +22 -22
- package/lib/store/actionAuth.d.ts +4 -0
- package/lib/store/actionAuth.js +40 -0
- package/lib/store/actionDef.d.ts +4 -3
- package/lib/store/actionDef.js +63 -45
- package/lib/store/checker.d.ts +2 -9
- package/lib/store/checker.js +39 -815
- package/lib/store/filter.d.ts +31 -18
- package/lib/store/filter.js +1256 -422
- package/lib/store/modi.d.ts +1 -1
- package/lib/store/modi.js +108 -9
- package/lib/store/relation.d.ts +3 -4
- package/lib/timers/oper.js +1 -1
- package/lib/timers/vaccum.js +2 -2
- package/lib/triggers/index.d.ts +2 -3
- package/lib/triggers/index.js +2 -5
- package/lib/types/Auth.d.ts +5 -0
- package/lib/types/DataType.d.ts +3 -0
- package/lib/types/Demand.d.ts +11 -0
- package/lib/types/Demand.js +2 -1
- package/lib/types/Entity.d.ts +10 -3
- package/lib/types/EntityDesc.d.ts +8 -0
- package/lib/types/EntityDesc.js +2 -0
- package/lib/types/Environment.d.ts +57 -0
- package/lib/types/Environment.js +2 -0
- package/lib/types/Exception.d.ts +6 -0
- package/lib/types/Exception.js +25 -1
- package/lib/types/Logger.d.ts +1 -0
- package/lib/types/Port.d.ts +3 -2
- package/lib/types/RowStore.d.ts +6 -4
- package/lib/types/Style.d.ts +1 -1
- package/lib/types/Trigger.d.ts +4 -5
- package/lib/types/Trigger.js +11 -6
- package/lib/types/index.d.ts +2 -0
- package/lib/types/index.js +2 -0
- package/lib/utils/SimpleConnector.js +1 -1
- package/lib/utils/money.js +1 -1
- package/lib/utils/string.d.ts +6 -0
- package/lib/utils/string.js +13 -1
- package/lib/utils/uuid.d.ts +5 -0
- package/lib/utils/uuid.js +64 -1
- package/package.json +3 -3
- package/src/entities/ActionAuth.ts +25 -33
- package/src/entities/I18n.ts +46 -0
- package/src/entities/Modi.ts +36 -36
- package/src/entities/ModiEntity.ts +14 -13
- package/src/entities/Oper.ts +17 -16
- package/src/entities/OperEntity.ts +13 -11
- package/src/entities/Relation.ts +31 -37
- package/src/entities/RelationAuth.ts +31 -37
- package/src/entities/User.ts +24 -21
- package/src/entities/UserEntityGrant.ts +16 -14
- package/src/entities/UserRelation.ts +33 -27
- package/lib/triggers/modi.d.ts +0 -5
- package/lib/triggers/modi.js +0 -72
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EntityDict, OperateOption, SelectOption } from "../types/Entity";
|
|
2
2
|
import { EntityDict as BaseEntityDict } from '../base-app-domain';
|
|
3
3
|
import { Logger } from "../types/Logger";
|
|
4
|
-
import { Checker
|
|
4
|
+
import { Checker } from '../types/Auth';
|
|
5
5
|
import { Trigger } from "../types/Trigger";
|
|
6
6
|
import { AsyncContext } from './AsyncRowStore';
|
|
7
7
|
/**
|
|
@@ -16,7 +16,6 @@ export declare class TriggerExecutor<ED extends EntityDict & BaseEntityDict> {
|
|
|
16
16
|
private contextBuilder;
|
|
17
17
|
constructor(contextBuilder: (cxtString: string) => Promise<AsyncContext<ED>>, logger?: Logger);
|
|
18
18
|
registerChecker<T extends keyof ED, Cxt extends AsyncContext<ED>>(checker: Checker<ED, T, Cxt>): void;
|
|
19
|
-
getCheckers<T extends keyof ED>(entity: T, action: ED[T]['Action'], checkerTypes?: CheckerType[]): Trigger<ED, T, AsyncContext<ED>>[] | undefined;
|
|
20
19
|
registerTrigger<T extends keyof ED, Cxt extends AsyncContext<ED>>(trigger: Trigger<ED, T, Cxt>): void;
|
|
21
20
|
unregisterTrigger<T extends keyof ED, Cxt extends AsyncContext<ED>>(trigger: Trigger<ED, T, Cxt>): void;
|
|
22
21
|
private preCommitTrigger;
|
|
@@ -34,11 +34,10 @@ var TriggerExecutor = /** @class */ (function () {
|
|
|
34
34
|
var entity = checker.entity, action = checker.action, type = checker.type, conditionalFilter = checker.conditionalFilter;
|
|
35
35
|
var triggerName = "".concat(String(entity)).concat(action, "\u6743\u9650\u68C0\u67E5-").concat(this.counter++);
|
|
36
36
|
var _a = (0, checker_1.translateCheckerInAsyncContext)(checker), fn = _a.fn, when = _a.when;
|
|
37
|
-
var priority = type === 'data' ? Trigger_1.DATA_CHECKER_DEFAULT_PRIORITY : Trigger_1.CHECKER_DEFAULT_PRIORITY; // checker的默认优先级最低(前面的trigger可能会赋上一些相应的值)
|
|
38
37
|
var trigger = {
|
|
39
38
|
checkerType: type,
|
|
40
39
|
name: triggerName,
|
|
41
|
-
priority: checker.priority ||
|
|
40
|
+
priority: checker.priority || Trigger_1.CHECKER_PRIORITY_MAP[type],
|
|
42
41
|
entity: entity,
|
|
43
42
|
action: action,
|
|
44
43
|
fn: fn,
|
|
@@ -47,12 +46,13 @@ var TriggerExecutor = /** @class */ (function () {
|
|
|
47
46
|
};
|
|
48
47
|
this.registerTrigger(trigger);
|
|
49
48
|
};
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
/* getCheckers<T extends keyof ED>(entity: T, action: ED[T]['Action'], checkerTypes?: CheckerType[]) {
|
|
50
|
+
const triggers = this.triggerMap[entity] && this.triggerMap[entity]![action]?.filter(
|
|
51
|
+
trigger => (typeof trigger.action === 'string' && trigger.action === action || trigger.action instanceof Array && trigger.action.includes(action as any)
|
|
52
|
+
&& (!checkerTypes || trigger.checkerType && checkerTypes.includes(trigger.checkerType)))
|
|
53
|
+
);
|
|
54
|
+
return triggers;
|
|
55
|
+
} */
|
|
56
56
|
TriggerExecutor.prototype.registerTrigger = function (trigger) {
|
|
57
57
|
var _a;
|
|
58
58
|
var _this = this;
|
|
@@ -64,7 +64,7 @@ var TriggerExecutor = /** @class */ (function () {
|
|
|
64
64
|
trigger.priority = Trigger_1.TRIGGER_DEFAULT_PRIORITY; // 默认值
|
|
65
65
|
}
|
|
66
66
|
else {
|
|
67
|
-
(0, assert_1.default)(trigger.priority <= Trigger_1.
|
|
67
|
+
(0, assert_1.default)(trigger.priority <= Trigger_1.CHECKER_MAX_PRIORITY && trigger.priority >= Trigger_1.TRIGGER_MIN_PRIORITY, "trigger\u300C".concat(trigger.name, "\u300D\u7684\u4F18\u5148\u7EA7\u5B9A\u4E49\u8D8A\u754C\uFF0C\u5E94\u8BE5\u5728").concat(Trigger_1.TRIGGER_MIN_PRIORITY, "\u5230").concat(Trigger_1.CHECKER_MAX_PRIORITY, "\u4E4B\u95F4"));
|
|
68
68
|
}
|
|
69
69
|
if (trigger.filter) {
|
|
70
70
|
(0, assert_1.default)(typeof trigger.action === 'string' && trigger.action !== 'create'
|
|
@@ -153,20 +153,20 @@ var TriggerExecutor = /** @class */ (function () {
|
|
|
153
153
|
_c.label = 2;
|
|
154
154
|
case 2:
|
|
155
155
|
filter = operation.filter;
|
|
156
|
-
filter2 = (0, filter_1.
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
156
|
+
filter2 = (0, filter_1.combineFilters)(entity, context.getSchema(), [{
|
|
157
|
+
$or: [
|
|
158
|
+
{
|
|
159
|
+
$$triggerData$$: {
|
|
160
|
+
$exists: true,
|
|
161
|
+
},
|
|
161
162
|
},
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
]
|
|
169
|
-
}, filter);
|
|
163
|
+
{
|
|
164
|
+
$$triggerTimestamp$$: {
|
|
165
|
+
$exists: true,
|
|
166
|
+
},
|
|
167
|
+
}
|
|
168
|
+
],
|
|
169
|
+
}, filter]);
|
|
170
170
|
return [4 /*yield*/, context.count(entity, {
|
|
171
171
|
filter: filter2
|
|
172
172
|
}, {})];
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.triggers = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var uuid_1 = require("../utils/uuid");
|
|
6
|
+
exports.triggers = [
|
|
7
|
+
{
|
|
8
|
+
name: '当actionAuth的deActions被置空后,删除此条数据',
|
|
9
|
+
entity: 'actionAuth',
|
|
10
|
+
action: 'update',
|
|
11
|
+
fn: function (_a, context, option) {
|
|
12
|
+
var operation = _a.operation;
|
|
13
|
+
return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|
|
14
|
+
var data, filter, _b, _c, _d;
|
|
15
|
+
var _e;
|
|
16
|
+
return tslib_1.__generator(this, function (_f) {
|
|
17
|
+
switch (_f.label) {
|
|
18
|
+
case 0:
|
|
19
|
+
data = operation.data, filter = operation.filter;
|
|
20
|
+
if (!(data.deActions && data.deActions.length === 0)) return [3 /*break*/, 3];
|
|
21
|
+
_c = (_b = context).operate;
|
|
22
|
+
_d = ['actionAuth'];
|
|
23
|
+
_e = {};
|
|
24
|
+
return [4 /*yield*/, (0, uuid_1.generateNewIdAsync)()];
|
|
25
|
+
case 1: return [4 /*yield*/, _c.apply(_b, _d.concat([(_e.id = _f.sent(),
|
|
26
|
+
_e.action = 'remove',
|
|
27
|
+
_e.data = {},
|
|
28
|
+
_e.filter = filter,
|
|
29
|
+
_e), option]))];
|
|
30
|
+
case 2:
|
|
31
|
+
_f.sent();
|
|
32
|
+
return [2 /*return*/, 1];
|
|
33
|
+
case 3: return [2 /*return*/, 0];
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
when: 'after',
|
|
39
|
+
}
|
|
40
|
+
];
|
package/lib/store/actionDef.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { ActionDictOfEntityDict, BBWatcher, Checker, EntityDict, StorageSchema, Trigger } from "../types";
|
|
2
2
|
import { SyncContext } from "./SyncRowStore";
|
|
3
3
|
import { AsyncContext } from "./AsyncRowStore";
|
|
4
|
-
|
|
5
|
-
export declare function
|
|
4
|
+
import { EntityDict as BaseEntityDict } from '../base-app-domain/EntityDict';
|
|
5
|
+
export declare function getFullProjection<ED extends EntityDict & BaseEntityDict, T extends keyof ED>(entity: T, schema: StorageSchema<ED>): ED[T]["Selection"]["data"];
|
|
6
|
+
export declare function makeIntrinsicCTWs<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED>, FrontCxt extends SyncContext<ED>>(schema: StorageSchema<ED>, actionDefDict: ActionDictOfEntityDict<ED>): {
|
|
6
7
|
triggers: Trigger<ED, keyof ED, Cxt>[];
|
|
7
|
-
checkers: Checker<ED, keyof ED, Cxt>[];
|
|
8
|
+
checkers: Checker<ED, keyof ED, Cxt | FrontCxt>[];
|
|
8
9
|
watchers: BBWatcher<ED, keyof ED>[];
|
|
9
10
|
};
|
package/lib/store/actionDef.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.makeIntrinsicCTWs = exports.getFullProjection = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var types_1 = require("../types");
|
|
6
6
|
var lodash_1 = require("../utils/lodash");
|
|
7
7
|
var filter_1 = require("./filter");
|
|
8
|
+
var checkers_1 = require("../checkers");
|
|
9
|
+
var triggers_1 = require("../triggers");
|
|
10
|
+
var actionAuth_1 = require("./actionAuth");
|
|
8
11
|
function getFullProjection(entity, schema) {
|
|
9
12
|
var attributes = schema[entity].attributes;
|
|
10
13
|
var projection = {
|
|
@@ -50,34 +53,48 @@ function makeIntrinsicWatchers(schema) {
|
|
|
50
53
|
return watchers;
|
|
51
54
|
}
|
|
52
55
|
function checkUniqueBetweenRows(rows, uniqAttrs) {
|
|
56
|
+
var e_1, _a, e_2, _b;
|
|
53
57
|
// 先检查这些行本身之间有无unique冲突
|
|
54
|
-
var
|
|
55
|
-
|
|
56
|
-
var
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
var dict = {};
|
|
59
|
+
try {
|
|
60
|
+
for (var rows_1 = tslib_1.__values(rows), rows_1_1 = rows_1.next(); !rows_1_1.done; rows_1_1 = rows_1.next()) {
|
|
61
|
+
var row = rows_1_1.value;
|
|
62
|
+
var s = '';
|
|
63
|
+
try {
|
|
64
|
+
for (var uniqAttrs_1 = (e_2 = void 0, tslib_1.__values(uniqAttrs)), uniqAttrs_1_1 = uniqAttrs_1.next(); !uniqAttrs_1_1.done; uniqAttrs_1_1 = uniqAttrs_1.next()) {
|
|
65
|
+
var a = uniqAttrs_1_1.value;
|
|
66
|
+
if (row[a] === null || row[a] === undefined) {
|
|
67
|
+
s + row.id;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
s + "-".concat(row[a]);
|
|
71
|
+
}
|
|
62
72
|
}
|
|
63
|
-
|
|
64
|
-
|
|
73
|
+
}
|
|
74
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
75
|
+
finally {
|
|
76
|
+
try {
|
|
77
|
+
if (uniqAttrs_1_1 && !uniqAttrs_1_1.done && (_b = uniqAttrs_1.return)) _b.call(uniqAttrs_1);
|
|
65
78
|
}
|
|
79
|
+
finally { if (e_2) throw e_2.error; }
|
|
66
80
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
81
|
+
if (dict[s]) {
|
|
82
|
+
throw new types_1.OakUniqueViolationException([{
|
|
83
|
+
id: row.id,
|
|
84
|
+
attrs: uniqAttrs,
|
|
85
|
+
}]);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
dict[s] = 1;
|
|
72
89
|
}
|
|
73
|
-
finally { if (e_1) throw e_1.error; }
|
|
74
90
|
}
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
91
|
+
}
|
|
92
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
93
|
+
finally {
|
|
94
|
+
try {
|
|
95
|
+
if (rows_1_1 && !rows_1_1.done && (_a = rows_1.return)) _a.call(rows_1);
|
|
96
|
+
}
|
|
97
|
+
finally { if (e_1) throw e_1.error; }
|
|
81
98
|
}
|
|
82
99
|
}
|
|
83
100
|
function checkCountLessThan(count, uniqAttrs, than, id) {
|
|
@@ -110,14 +127,14 @@ function checkUnique(entity, row, context, uniqAttrs, extraFilter) {
|
|
|
110
127
|
// 说明有null值,不需要检查约束
|
|
111
128
|
return;
|
|
112
129
|
}
|
|
113
|
-
var filter2 = extraFilter ? (0, filter_1.
|
|
130
|
+
var filter2 = extraFilter ? (0, filter_1.combineFilters)(entity, context.getSchema(), [filter, extraFilter]) : filter;
|
|
114
131
|
var count = context.count(entity, { filter: filter2 }, { dontCollect: true });
|
|
115
132
|
return checkCountLessThan(count, uniqAttrs, 0, row.id);
|
|
116
133
|
}
|
|
117
|
-
function
|
|
134
|
+
function makeIntrinsicCTWs(schema, actionDefDict) {
|
|
118
135
|
var _a;
|
|
119
|
-
var checkers =
|
|
120
|
-
var triggers =
|
|
136
|
+
var checkers = (0, checkers_1.createDynamicCheckers)(schema);
|
|
137
|
+
var triggers = (0, triggers_1.createDynamicTriggers)(schema);
|
|
121
138
|
// action状态转换矩阵相应的checker
|
|
122
139
|
for (var entity in actionDefDict) {
|
|
123
140
|
var _loop_1 = function (attr) {
|
|
@@ -140,11 +157,11 @@ function analyzeActionDefDict(schema, actionDefDict) {
|
|
|
140
157
|
filter: conditionalFilter,
|
|
141
158
|
errMsg: '',
|
|
142
159
|
});
|
|
160
|
+
// 这里用data类型的checker改数据了不太好,先这样
|
|
143
161
|
checkers.push({
|
|
144
162
|
action: action,
|
|
145
163
|
type: 'data',
|
|
146
164
|
entity: entity,
|
|
147
|
-
priority: 10,
|
|
148
165
|
checker: function (data) {
|
|
149
166
|
var _a;
|
|
150
167
|
Object.assign(data, (_a = {},
|
|
@@ -190,7 +207,7 @@ function analyzeActionDefDict(schema, actionDefDict) {
|
|
|
190
207
|
}
|
|
191
208
|
}
|
|
192
209
|
var _loop_2 = function (entity) {
|
|
193
|
-
var
|
|
210
|
+
var e_3, _e;
|
|
194
211
|
var indexes = schema[entity].indexes;
|
|
195
212
|
if (indexes) {
|
|
196
213
|
var _loop_4 = function (index) {
|
|
@@ -201,7 +218,7 @@ function analyzeActionDefDict(schema, actionDefDict) {
|
|
|
201
218
|
entity: entity,
|
|
202
219
|
action: 'create',
|
|
203
220
|
type: 'logical',
|
|
204
|
-
priority:
|
|
221
|
+
priority: types_1.CHECKER_MAX_PRIORITY,
|
|
205
222
|
checker: function (operation, context) {
|
|
206
223
|
var data = operation.data;
|
|
207
224
|
if (data instanceof Array) {
|
|
@@ -219,9 +236,9 @@ function analyzeActionDefDict(schema, actionDefDict) {
|
|
|
219
236
|
entity: entity,
|
|
220
237
|
action: 'update',
|
|
221
238
|
type: 'logical',
|
|
222
|
-
priority:
|
|
239
|
+
priority: types_1.CHECKER_MAX_PRIORITY,
|
|
223
240
|
checker: function (operation, context) {
|
|
224
|
-
var
|
|
241
|
+
var e_4, _a, e_5, _b, _c;
|
|
225
242
|
var _d = operation, data = _d.data, operationFilter = _d.filter;
|
|
226
243
|
var attrs = Object.keys(data);
|
|
227
244
|
var refAttrs = (0, lodash_1.intersection)(attrs, uniqAttrs_2);
|
|
@@ -230,7 +247,7 @@ function analyzeActionDefDict(schema, actionDefDict) {
|
|
|
230
247
|
return;
|
|
231
248
|
}
|
|
232
249
|
try {
|
|
233
|
-
for (var refAttrs_1 = (
|
|
250
|
+
for (var refAttrs_1 = (e_4 = void 0, tslib_1.__values(refAttrs)), refAttrs_1_1 = refAttrs_1.next(); !refAttrs_1_1.done; refAttrs_1_1 = refAttrs_1.next()) {
|
|
234
251
|
var attr = refAttrs_1_1.value;
|
|
235
252
|
// 如果有更新为null值,不用再检查约束
|
|
236
253
|
if (data[attr] === null || data[attr] === undefined) {
|
|
@@ -238,28 +255,28 @@ function analyzeActionDefDict(schema, actionDefDict) {
|
|
|
238
255
|
}
|
|
239
256
|
}
|
|
240
257
|
}
|
|
241
|
-
catch (
|
|
258
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
242
259
|
finally {
|
|
243
260
|
try {
|
|
244
261
|
if (refAttrs_1_1 && !refAttrs_1_1.done && (_a = refAttrs_1.return)) _a.call(refAttrs_1);
|
|
245
262
|
}
|
|
246
|
-
finally { if (
|
|
263
|
+
finally { if (e_4) throw e_4.error; }
|
|
247
264
|
}
|
|
248
265
|
if (refAttrs.length === uniqAttrs_2.length) {
|
|
249
266
|
// 如果更新了全部属性,直接检查
|
|
250
267
|
var filter = (0, lodash_1.pick)(data, refAttrs);
|
|
251
268
|
// 在这些行以外的行不和更新后的键值冲突
|
|
252
269
|
var count = context.count(entity, {
|
|
253
|
-
filter: (0, filter_1.
|
|
270
|
+
filter: (0, filter_1.combineFilters)(entity, context.getSchema(), [filter, {
|
|
254
271
|
$not: operationFilter,
|
|
255
272
|
}]),
|
|
256
273
|
}, { dontCollect: true });
|
|
257
|
-
var checkCount = checkCountLessThan(count, uniqAttrs_2);
|
|
274
|
+
var checkCount = checkCountLessThan(count, uniqAttrs_2, 0, operationFilter === null || operationFilter === void 0 ? void 0 : operationFilter.id);
|
|
258
275
|
// 更新的行只能有一行
|
|
259
276
|
var rowCount = context.count(entity, {
|
|
260
277
|
filter: operationFilter,
|
|
261
278
|
}, { dontCollect: true });
|
|
262
|
-
var checkRowCount = checkCountLessThan(rowCount, uniqAttrs_2, 1);
|
|
279
|
+
var checkRowCount = checkCountLessThan(rowCount, uniqAttrs_2, 1, operationFilter === null || operationFilter === void 0 ? void 0 : operationFilter.id);
|
|
263
280
|
// 如果更新的行数为零似乎也可以,但这应该不可能出现吧,by Xc 20230131
|
|
264
281
|
if (checkRowCount instanceof Promise) {
|
|
265
282
|
return Promise.all([checkCount, checkRowCount]).then(function () { return undefined; });
|
|
@@ -268,19 +285,19 @@ function analyzeActionDefDict(schema, actionDefDict) {
|
|
|
268
285
|
// 否则需要结合本行现有的属性来进行检查
|
|
269
286
|
var projection = { id: 1 };
|
|
270
287
|
try {
|
|
271
|
-
for (var uniqAttrs_3 = (
|
|
288
|
+
for (var uniqAttrs_3 = (e_5 = void 0, tslib_1.__values(uniqAttrs_2)), uniqAttrs_3_1 = uniqAttrs_3.next(); !uniqAttrs_3_1.done; uniqAttrs_3_1 = uniqAttrs_3.next()) {
|
|
272
289
|
var attr = uniqAttrs_3_1.value;
|
|
273
290
|
Object.assign(projection, (_c = {},
|
|
274
291
|
_c[attr] = 1,
|
|
275
292
|
_c));
|
|
276
293
|
}
|
|
277
294
|
}
|
|
278
|
-
catch (
|
|
295
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
279
296
|
finally {
|
|
280
297
|
try {
|
|
281
298
|
if (uniqAttrs_3_1 && !uniqAttrs_3_1.done && (_b = uniqAttrs_3.return)) _b.call(uniqAttrs_3);
|
|
282
299
|
}
|
|
283
|
-
finally { if (
|
|
300
|
+
finally { if (e_5) throw e_5.error; }
|
|
284
301
|
}
|
|
285
302
|
var checkWithRows = function (rows2) {
|
|
286
303
|
var rows22 = rows2.map(function (ele) { return Object.assign(ele, data); });
|
|
@@ -306,17 +323,17 @@ function analyzeActionDefDict(schema, actionDefDict) {
|
|
|
306
323
|
}
|
|
307
324
|
};
|
|
308
325
|
try {
|
|
309
|
-
for (var indexes_1 = (
|
|
326
|
+
for (var indexes_1 = (e_3 = void 0, tslib_1.__values(indexes)), indexes_1_1 = indexes_1.next(); !indexes_1_1.done; indexes_1_1 = indexes_1.next()) {
|
|
310
327
|
var index = indexes_1_1.value;
|
|
311
328
|
_loop_4(index);
|
|
312
329
|
}
|
|
313
330
|
}
|
|
314
|
-
catch (
|
|
331
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
315
332
|
finally {
|
|
316
333
|
try {
|
|
317
334
|
if (indexes_1_1 && !indexes_1_1.done && (_e = indexes_1.return)) _e.call(indexes_1);
|
|
318
335
|
}
|
|
319
|
-
finally { if (
|
|
336
|
+
finally { if (e_3) throw e_3.error; }
|
|
320
337
|
}
|
|
321
338
|
}
|
|
322
339
|
};
|
|
@@ -324,10 +341,11 @@ function analyzeActionDefDict(schema, actionDefDict) {
|
|
|
324
341
|
for (var entity in schema) {
|
|
325
342
|
_loop_2(entity);
|
|
326
343
|
}
|
|
344
|
+
triggers.push.apply(triggers, tslib_1.__spreadArray([], tslib_1.__read(actionAuth_1.triggers), false));
|
|
327
345
|
return {
|
|
328
346
|
triggers: triggers,
|
|
329
347
|
checkers: checkers,
|
|
330
348
|
watchers: makeIntrinsicWatchers(schema),
|
|
331
349
|
};
|
|
332
350
|
}
|
|
333
|
-
exports.
|
|
351
|
+
exports.makeIntrinsicCTWs = makeIntrinsicCTWs;
|
package/lib/store/checker.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Checker, EntityDict, OperateOption, SelectOption, StorageSchema, Trigger } from "../types";
|
|
2
2
|
import { EntityDict as BaseEntityDict } from '../base-app-domain';
|
|
3
3
|
import { AsyncContext } from "./AsyncRowStore";
|
|
4
4
|
import { SyncContext } from './SyncRowStore';
|
|
@@ -16,18 +16,11 @@ export declare function translateCheckerInSyncContext<ED extends EntityDict & Ba
|
|
|
16
16
|
fn: (operation: ED[T]['Operation'], context: Cxt, option: OperateOption | SelectOption) => void;
|
|
17
17
|
when: 'before' | 'after';
|
|
18
18
|
};
|
|
19
|
-
/**
|
|
20
|
-
* 根据权限定义,创建出相应的checker
|
|
21
|
-
* @param schema
|
|
22
|
-
* @param authDict
|
|
23
|
-
* @returns
|
|
24
|
-
*/
|
|
25
|
-
export declare function createAuthCheckers<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>>(schema: StorageSchema<ED>, authDict: AuthDefDict<ED>): Checker<ED, keyof ED, Cxt>[];
|
|
26
19
|
/**
|
|
27
20
|
* 对对象的删除,检查其是否会产生其他行上的空指针,不允许这种情况的出现
|
|
28
21
|
* @param schema
|
|
29
22
|
* @returns
|
|
30
23
|
* 如果有的对象允许删除,需要使用trigger来处理其相关联的外键对象,这些trigger写作before,则会在checker之前执行,仍然可以删除成功
|
|
31
24
|
*/
|
|
32
|
-
export declare function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>>(schema: StorageSchema<ED
|
|
25
|
+
export declare function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>>(schema: StorageSchema<ED>): Checker<ED, keyof ED, Cxt>[];
|
|
33
26
|
export declare function createCreateCheckers<ED extends EntityDict & BaseEntityDict, Cxt extends AsyncContext<ED> | SyncContext<ED>>(schema: StorageSchema<ED>): Checker<ED, keyof ED, Cxt>[];
|