oak-domain 2.5.2 → 2.6.2
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 +16 -16
- package/lib/actions/action.js +17 -17
- package/lib/actions/relation.d.ts +5 -5
- package/lib/actions/relation.js +38 -38
- package/lib/base-app-domain/ActionDefDict.d.ts +8 -8
- package/lib/base-app-domain/ActionDefDict.js +9 -9
- package/lib/base-app-domain/EntityDict.d.ts +14 -14
- package/lib/base-app-domain/EntityDict.js +2 -2
- package/lib/base-app-domain/Modi/Action.d.ts +10 -10
- package/lib/base-app-domain/Modi/Action.js +14 -14
- package/lib/base-app-domain/Modi/Schema.d.ts +146 -146
- package/lib/base-app-domain/Modi/Schema.js +2 -2
- package/lib/base-app-domain/Modi/Storage.d.ts +3 -3
- package/lib/base-app-domain/Modi/Storage.js +60 -60
- package/lib/base-app-domain/ModiEntity/Schema.d.ts +189 -189
- package/lib/base-app-domain/ModiEntity/Schema.js +2 -2
- package/lib/base-app-domain/ModiEntity/Storage.d.ts +3 -3
- package/lib/base-app-domain/ModiEntity/Storage.js +27 -27
- package/lib/base-app-domain/Oper/Schema.d.ts +144 -144
- package/lib/base-app-domain/Oper/Schema.js +2 -2
- package/lib/base-app-domain/Oper/Storage.d.ts +3 -3
- package/lib/base-app-domain/Oper/Storage.js +29 -29
- package/lib/base-app-domain/OperEntity/Schema.d.ts +205 -205
- package/lib/base-app-domain/OperEntity/Schema.js +2 -2
- package/lib/base-app-domain/OperEntity/Storage.d.ts +3 -3
- package/lib/base-app-domain/OperEntity/Storage.js +27 -27
- package/lib/base-app-domain/Storage.d.ts +3 -3
- package/lib/base-app-domain/Storage.js +17 -17
- package/lib/base-app-domain/User/Action.d.ts +10 -10
- package/lib/base-app-domain/User/Action.js +12 -12
- package/lib/base-app-domain/User/Schema.d.ts +180 -180
- package/lib/base-app-domain/User/Schema.js +2 -2
- package/lib/base-app-domain/User/Storage.d.ts +3 -3
- package/lib/base-app-domain/User/Storage.js +36 -36
- package/lib/base-app-domain/UserEntityGrant/Schema.d.ts +121 -121
- package/lib/base-app-domain/UserEntityGrant/Schema.js +2 -2
- package/lib/base-app-domain/UserEntityGrant/Storage.d.ts +3 -3
- package/lib/base-app-domain/UserEntityGrant/Storage.js +28 -28
- package/lib/base-app-domain/_SubQuery.d.ts +44 -44
- package/lib/base-app-domain/_SubQuery.js +2 -2
- package/lib/base-app-domain/index.d.ts +3 -3
- package/lib/base-app-domain/index.js +6 -6
- package/lib/checkers/index.d.ts +5 -5
- package/lib/checkers/index.js +16 -16
- package/lib/compiler/env.d.ts +11 -11
- package/lib/compiler/env.js +39 -39
- package/lib/compiler/schemalBuilder.d.ts +2 -2
- package/lib/compiler/schemalBuilder.js +3355 -3355
- package/lib/compiler/uiBuilder.d.ts +1 -1
- package/lib/compiler/uiBuilder.js +3 -3
- package/lib/entities/Modi.d.ts +11 -11
- package/lib/entities/Modi.js +46 -46
- package/lib/entities/ModiEntity.d.ts +8 -8
- package/lib/entities/ModiEntity.js +15 -15
- package/lib/entities/Oper.d.ts +10 -10
- package/lib/entities/Oper.js +17 -17
- package/lib/entities/OperEntity.d.ts +8 -8
- package/lib/entities/OperEntity.js +15 -15
- package/lib/entities/User.d.ts +8 -8
- package/lib/entities/User.js +28 -28
- package/lib/entities/UserEntityGrant.d.ts +7 -7
- package/lib/entities/UserEntityGrant.js +12 -12
- package/lib/store/AsyncRowStore.d.ts +51 -48
- package/lib/store/AsyncRowStore.js +189 -183
- package/lib/store/CascadeStore.d.ts +91 -91
- package/lib/store/CascadeStore.js +1634 -1603
- package/lib/store/SyncRowStore.d.ts +29 -29
- package/lib/store/SyncRowStore.js +48 -48
- package/lib/store/TriggerExecutor.d.ts +32 -32
- package/lib/store/TriggerExecutor.js +532 -532
- package/lib/store/actionDef.d.ts +9 -9
- package/lib/store/actionDef.js +333 -333
- package/lib/store/checker.d.ts +26 -26
- package/lib/store/checker.js +829 -867
- package/lib/store/filter.d.ts +109 -109
- package/lib/store/filter.js +893 -893
- package/lib/store/modi.d.ts +13 -13
- package/lib/store/modi.js +216 -216
- package/lib/store/relation.d.ts +13 -13
- package/lib/store/relation.js +66 -66
- package/lib/store/selection.d.ts +19 -7
- package/lib/store/selection.js +265 -238
- package/lib/triggers/index.d.ts +6 -6
- package/lib/triggers/index.js +11 -11
- package/lib/triggers/modi.d.ts +5 -5
- package/lib/triggers/modi.js +72 -72
- package/lib/types/Action.d.ts +20 -20
- package/lib/types/Action.js +2 -2
- package/lib/types/AppLoader.d.ts +11 -11
- package/lib/types/AppLoader.js +10 -10
- package/lib/types/Aspect.d.ts +13 -12
- package/lib/types/Aspect.js +4 -4
- package/lib/types/Auth.d.ts +69 -69
- package/lib/types/Auth.js +2 -2
- package/lib/types/Connector.d.ts +27 -26
- package/lib/types/Connector.js +9 -9
- package/lib/types/Context.d.ts +7 -7
- package/lib/types/Context.js +3 -3
- package/lib/types/DataType.d.ts +18 -18
- package/lib/types/DataType.js +5 -5
- package/lib/types/Demand.d.ts +77 -77
- package/lib/types/Demand.js +9 -9
- package/lib/types/Endpoint.d.ts +11 -11
- package/lib/types/Endpoint.js +3 -3
- package/lib/types/Entity.d.ts +183 -183
- package/lib/types/Entity.js +14 -14
- package/lib/types/Exception.d.ts +100 -98
- package/lib/types/Exception.js +327 -283
- package/lib/types/Expression.d.ts +163 -163
- package/lib/types/Expression.js +427 -427
- package/lib/types/Geo.d.ts +18 -18
- package/lib/types/Geo.js +2 -2
- package/lib/types/Locale.d.ts +24 -24
- package/lib/types/Locale.js +2 -2
- package/lib/types/Logger.d.ts +5 -5
- package/lib/types/Logger.js +3 -3
- package/lib/types/Polyfill.d.ts +23 -23
- package/lib/types/Polyfill.js +2 -2
- package/lib/types/Port.d.ts +17 -17
- package/lib/types/Port.js +2 -2
- package/lib/types/RowStore.d.ts +12 -12
- package/lib/types/RowStore.js +34 -34
- package/lib/types/Storage.d.ts +56 -56
- package/lib/types/Storage.js +2 -2
- package/lib/types/Timer.d.ts +13 -13
- package/lib/types/Timer.js +2 -2
- package/lib/types/Trigger.d.ts +109 -109
- package/lib/types/Trigger.js +49 -49
- package/lib/types/Txn.d.ts +2 -2
- package/lib/types/Txn.js +3 -3
- package/lib/types/Watcher.d.ts +19 -19
- package/lib/types/Watcher.js +4 -4
- package/lib/types/index.d.ts +21 -21
- package/lib/types/index.js +24 -24
- package/lib/types/schema/DataTypes.d.ts +32 -32
- package/lib/types/schema/DataTypes.js +3 -3
- package/lib/utils/SimpleConnector.d.ts +35 -30
- package/lib/utils/SimpleConnector.js +134 -117
- package/lib/utils/assert.d.ts +5 -5
- package/lib/utils/assert.js +9 -9
- package/lib/utils/concurrent.d.ts +15 -15
- package/lib/utils/concurrent.js +89 -89
- package/lib/utils/cron.d.ts +1 -1
- package/lib/utils/cron.js +18 -18
- package/lib/utils/date.d.ts +1 -1
- package/lib/utils/date.js +18 -18
- package/lib/utils/geo.d.ts +4 -4
- package/lib/utils/geo.js +24 -24
- package/lib/utils/lodash.d.ts +20 -20
- package/lib/utils/lodash.js +55 -55
- package/lib/utils/random/random.d.ts +1 -1
- package/lib/utils/random/random.js +24 -24
- package/lib/utils/random/random.mp.d.ts +1 -1
- package/lib/utils/random/random.mp.js +25 -25
- package/lib/utils/random/random.web.d.ts +1 -1
- package/lib/utils/random/random.web.js +17 -17
- package/lib/utils/string.d.ts +22 -22
- package/lib/utils/string.js +70 -70
- package/lib/utils/url.d.ts +1 -0
- package/lib/utils/url.js +12 -0
- package/lib/utils/uuid.d.ts +12 -12
- package/lib/utils/uuid.js +194 -194
- package/lib/utils/validator.d.ts +23 -23
- package/lib/utils/validator.js +123 -123
- package/package.json +48 -48
- package/src/entities/Modi.ts +68 -68
- package/src/entities/ModiEntity.ts +24 -24
- package/src/entities/Oper.ts +28 -28
- package/src/entities/OperEntity.ts +24 -24
- package/src/entities/User.ts +44 -44
- package/src/entities/UserEntityGrant.ts +24 -24
package/lib/store/actionDef.js
CHANGED
|
@@ -1,333 +1,333 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.analyzeActionDefDict = exports.getFullProjection = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var types_1 = require("../types");
|
|
6
|
-
var lodash_1 = require("../utils/lodash");
|
|
7
|
-
var filter_1 = require("./filter");
|
|
8
|
-
function getFullProjection(entity, schema) {
|
|
9
|
-
var attributes = schema[entity].attributes;
|
|
10
|
-
var projection = {
|
|
11
|
-
id: 1,
|
|
12
|
-
$$createAt$$: 1,
|
|
13
|
-
$$updateAt$$: 1,
|
|
14
|
-
$$deleteAt$$: 1,
|
|
15
|
-
};
|
|
16
|
-
Object.keys(attributes).forEach(function (k) {
|
|
17
|
-
var _a;
|
|
18
|
-
return Object.assign(projection, (_a = {},
|
|
19
|
-
_a[k] = 1,
|
|
20
|
-
_a));
|
|
21
|
-
});
|
|
22
|
-
return projection;
|
|
23
|
-
}
|
|
24
|
-
exports.getFullProjection = getFullProjection;
|
|
25
|
-
function makeIntrinsicWatchers(schema) {
|
|
26
|
-
var watchers = [];
|
|
27
|
-
for (var entity in schema) {
|
|
28
|
-
var attributes = schema[entity].attributes;
|
|
29
|
-
var expiresAt = attributes.expiresAt, expired = attributes.expired;
|
|
30
|
-
if (expiresAt && expiresAt.type === 'datetime' && expired && expired.type === 'boolean') {
|
|
31
|
-
// 如果有定义expiresAt和expired,则自动生成一个检查的watcher
|
|
32
|
-
watchers.push({
|
|
33
|
-
entity: entity,
|
|
34
|
-
name: "\u5BF9\u8C61".concat(entity, "\u4E0A\u7684\u8FC7\u671F\u81EA\u52A8watcher"),
|
|
35
|
-
filter: function () {
|
|
36
|
-
return {
|
|
37
|
-
expired: false,
|
|
38
|
-
expiresAt: {
|
|
39
|
-
$lte: Date.now(),
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
},
|
|
43
|
-
action: 'update',
|
|
44
|
-
actionData: {
|
|
45
|
-
expired: true,
|
|
46
|
-
},
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return watchers;
|
|
51
|
-
}
|
|
52
|
-
function checkUniqueBetweenRows(rows, uniqAttrs) {
|
|
53
|
-
// 先检查这些行本身之间有无unique冲突
|
|
54
|
-
var uniqRows = (0, lodash_1.uniqBy)(rows, function (d) {
|
|
55
|
-
var e_1, _a;
|
|
56
|
-
var s = '';
|
|
57
|
-
try {
|
|
58
|
-
for (var uniqAttrs_1 = tslib_1.__values(uniqAttrs), uniqAttrs_1_1 = uniqAttrs_1.next(); !uniqAttrs_1_1.done; uniqAttrs_1_1 = uniqAttrs_1.next()) {
|
|
59
|
-
var a = uniqAttrs_1_1.value;
|
|
60
|
-
if (d[a] === null || d[a] === undefined) {
|
|
61
|
-
s + d.id;
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
s + "-".concat(d[a]);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
69
|
-
finally {
|
|
70
|
-
try {
|
|
71
|
-
if (uniqAttrs_1_1 && !uniqAttrs_1_1.done && (_a = uniqAttrs_1.return)) _a.call(uniqAttrs_1);
|
|
72
|
-
}
|
|
73
|
-
finally { if (e_1) throw e_1.error; }
|
|
74
|
-
}
|
|
75
|
-
return s;
|
|
76
|
-
});
|
|
77
|
-
if (uniqRows.length < rows.length) {
|
|
78
|
-
throw new types_1.OakUniqueViolationException([{
|
|
79
|
-
attrs: uniqAttrs,
|
|
80
|
-
}]);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
function checkCountLessThan(count, uniqAttrs, than, id) {
|
|
84
|
-
if (than === void 0) { than = 0; }
|
|
85
|
-
if (count instanceof Promise) {
|
|
86
|
-
return count.then(function (count2) {
|
|
87
|
-
if (count2 > than) {
|
|
88
|
-
throw new types_1.OakUniqueViolationException([{
|
|
89
|
-
id: id,
|
|
90
|
-
attrs: uniqAttrs,
|
|
91
|
-
}]);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
if (count > than) {
|
|
96
|
-
throw new types_1.OakUniqueViolationException([{
|
|
97
|
-
id: id,
|
|
98
|
-
attrs: uniqAttrs,
|
|
99
|
-
}]);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
function checkUnique(entity, row, context, uniqAttrs, extraFilter) {
|
|
103
|
-
var filter = (0, lodash_1.pick)(row, uniqAttrs);
|
|
104
|
-
for (var a in filter) {
|
|
105
|
-
if (filter[a] === null || filter[a] === undefined) {
|
|
106
|
-
delete filter[a];
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
if (Object.keys(filter).length < uniqAttrs.length) {
|
|
110
|
-
// 说明有null值,不需要检查约束
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
var filter2 = extraFilter ? (0, filter_1.addFilterSegment)([filter, extraFilter]) : filter;
|
|
114
|
-
var count = context.count(entity, { filter: filter2 }, { dontCollect: true });
|
|
115
|
-
return checkCountLessThan(count, uniqAttrs, 0, row.id);
|
|
116
|
-
}
|
|
117
|
-
function analyzeActionDefDict(schema, actionDefDict) {
|
|
118
|
-
var _a;
|
|
119
|
-
var checkers = [];
|
|
120
|
-
var triggers = [];
|
|
121
|
-
// action状态转换矩阵相应的checker
|
|
122
|
-
for (var entity in actionDefDict) {
|
|
123
|
-
var _loop_1 = function (attr) {
|
|
124
|
-
var def = actionDefDict[entity][attr];
|
|
125
|
-
var _b = def, stm = _b.stm, is = _b.is;
|
|
126
|
-
var _loop_3 = function (action) {
|
|
127
|
-
var _c, _d;
|
|
128
|
-
var actionStm = stm[action];
|
|
129
|
-
var conditionalFilter = typeof actionStm[0] === 'string' ? (_c = {},
|
|
130
|
-
_c[attr] = actionStm[0],
|
|
131
|
-
_c) : (_d = {},
|
|
132
|
-
_d[attr] = {
|
|
133
|
-
$in: actionStm[0],
|
|
134
|
-
},
|
|
135
|
-
_d);
|
|
136
|
-
checkers.push({
|
|
137
|
-
action: action,
|
|
138
|
-
type: 'row',
|
|
139
|
-
entity: entity,
|
|
140
|
-
filter: conditionalFilter,
|
|
141
|
-
errMsg: '',
|
|
142
|
-
});
|
|
143
|
-
checkers.push({
|
|
144
|
-
action: action,
|
|
145
|
-
type: 'data',
|
|
146
|
-
entity: entity,
|
|
147
|
-
priority: 10,
|
|
148
|
-
checker: function (data) {
|
|
149
|
-
var _a;
|
|
150
|
-
Object.assign(data, (_a = {},
|
|
151
|
-
_a[attr] = stm[action][1],
|
|
152
|
-
_a));
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
};
|
|
156
|
-
for (var action in stm) {
|
|
157
|
-
_loop_3(action);
|
|
158
|
-
}
|
|
159
|
-
if (is) {
|
|
160
|
-
checkers.push({
|
|
161
|
-
action: 'create',
|
|
162
|
-
type: 'data',
|
|
163
|
-
entity: entity,
|
|
164
|
-
priority: 10,
|
|
165
|
-
checker: function (data) {
|
|
166
|
-
var _a;
|
|
167
|
-
if (data instanceof Array) {
|
|
168
|
-
data.forEach(function (ele) {
|
|
169
|
-
var _a;
|
|
170
|
-
if (!ele[attr]) {
|
|
171
|
-
Object.assign(ele, (_a = {},
|
|
172
|
-
_a[attr] = is,
|
|
173
|
-
_a));
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
if (!data[attr]) {
|
|
179
|
-
Object.assign(data, (_a = {},
|
|
180
|
-
_a[attr] = is,
|
|
181
|
-
_a));
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
for (var attr in actionDefDict[entity]) {
|
|
189
|
-
_loop_1(attr);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
var _loop_2 = function (entity) {
|
|
193
|
-
var e_2, _e;
|
|
194
|
-
var indexes = schema[entity].indexes;
|
|
195
|
-
if (indexes) {
|
|
196
|
-
var _loop_4 = function (index) {
|
|
197
|
-
if ((_a = index.config) === null || _a === void 0 ? void 0 : _a.unique) {
|
|
198
|
-
var attributes = index.attributes;
|
|
199
|
-
var uniqAttrs_2 = attributes.map(function (ele) { return ele.name; });
|
|
200
|
-
checkers.push({
|
|
201
|
-
entity: entity,
|
|
202
|
-
action: 'create',
|
|
203
|
-
type: 'logical',
|
|
204
|
-
priority: 20,
|
|
205
|
-
checker: function (operation, context) {
|
|
206
|
-
var data = operation.data;
|
|
207
|
-
if (data instanceof Array) {
|
|
208
|
-
checkUniqueBetweenRows(data, uniqAttrs_2);
|
|
209
|
-
var checkResult = data.map(function (ele) { return checkUnique(entity, ele, context, uniqAttrs_2); });
|
|
210
|
-
if (checkResult[0] instanceof Promise) {
|
|
211
|
-
return Promise.all(checkResult).then(function () { return undefined; });
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
return checkUnique(entity, data, context, uniqAttrs_2);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}, {
|
|
219
|
-
entity: entity,
|
|
220
|
-
action: 'update',
|
|
221
|
-
type: 'logical',
|
|
222
|
-
priority: 20,
|
|
223
|
-
checker: function (operation, context) {
|
|
224
|
-
var e_3, _a, e_4, _b, _c;
|
|
225
|
-
var _d = operation, data = _d.data, operationFilter = _d.filter;
|
|
226
|
-
var attrs = Object.keys(data);
|
|
227
|
-
var refAttrs = (0, lodash_1.intersection)(attrs, uniqAttrs_2);
|
|
228
|
-
if (refAttrs.length === 0) {
|
|
229
|
-
// 如果本次更新和unique约束的属性之间没有交集则直接返回
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
try {
|
|
233
|
-
for (var refAttrs_1 = (e_3 = void 0, tslib_1.__values(refAttrs)), refAttrs_1_1 = refAttrs_1.next(); !refAttrs_1_1.done; refAttrs_1_1 = refAttrs_1.next()) {
|
|
234
|
-
var attr = refAttrs_1_1.value;
|
|
235
|
-
// 如果有更新为null值,不用再检查约束
|
|
236
|
-
if (data[attr] === null || data[attr] === undefined) {
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
242
|
-
finally {
|
|
243
|
-
try {
|
|
244
|
-
if (refAttrs_1_1 && !refAttrs_1_1.done && (_a = refAttrs_1.return)) _a.call(refAttrs_1);
|
|
245
|
-
}
|
|
246
|
-
finally { if (e_3) throw e_3.error; }
|
|
247
|
-
}
|
|
248
|
-
if (refAttrs.length === uniqAttrs_2.length) {
|
|
249
|
-
// 如果更新了全部属性,直接检查
|
|
250
|
-
var filter = (0, lodash_1.pick)(data, refAttrs);
|
|
251
|
-
// 在这些行以外的行不和更新后的键值冲突
|
|
252
|
-
var count = context.count(entity, {
|
|
253
|
-
filter: (0, filter_1.addFilterSegment)([filter, {
|
|
254
|
-
$not: operationFilter,
|
|
255
|
-
}]),
|
|
256
|
-
}, { dontCollect: true });
|
|
257
|
-
var checkCount = checkCountLessThan(count, uniqAttrs_2);
|
|
258
|
-
// 更新的行只能有一行
|
|
259
|
-
var rowCount = context.count(entity, {
|
|
260
|
-
filter: operationFilter,
|
|
261
|
-
}, { dontCollect: true });
|
|
262
|
-
var checkRowCount = checkCountLessThan(rowCount, uniqAttrs_2, 1);
|
|
263
|
-
// 如果更新的行数为零似乎也可以,但这应该不可能出现吧,by Xc 20230131
|
|
264
|
-
if (checkRowCount instanceof Promise) {
|
|
265
|
-
return Promise.all([checkCount, checkRowCount]).then(function () { return undefined; });
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
// 否则需要结合本行现有的属性来进行检查
|
|
269
|
-
var projection = { id: 1 };
|
|
270
|
-
try {
|
|
271
|
-
for (var uniqAttrs_3 = (e_4 = void 0, tslib_1.__values(uniqAttrs_2)), uniqAttrs_3_1 = uniqAttrs_3.next(); !uniqAttrs_3_1.done; uniqAttrs_3_1 = uniqAttrs_3.next()) {
|
|
272
|
-
var attr = uniqAttrs_3_1.value;
|
|
273
|
-
Object.assign(projection, (_c = {},
|
|
274
|
-
_c[attr] = 1,
|
|
275
|
-
_c));
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
279
|
-
finally {
|
|
280
|
-
try {
|
|
281
|
-
if (uniqAttrs_3_1 && !uniqAttrs_3_1.done && (_b = uniqAttrs_3.return)) _b.call(uniqAttrs_3);
|
|
282
|
-
}
|
|
283
|
-
finally { if (e_4) throw e_4.error; }
|
|
284
|
-
}
|
|
285
|
-
var checkWithRows = function (rows2) {
|
|
286
|
-
var rows22 = rows2.map(function (ele) { return Object.assign(ele, data); });
|
|
287
|
-
// 先检查这些行本身之间是否冲突
|
|
288
|
-
checkUniqueBetweenRows(rows22, uniqAttrs_2);
|
|
289
|
-
var checkResults = rows22.map(function (row) { return checkUnique(entity, row, context, uniqAttrs_2, {
|
|
290
|
-
$not: operationFilter
|
|
291
|
-
}); });
|
|
292
|
-
if (checkResults[0] instanceof Promise) {
|
|
293
|
-
return Promise.all(checkResults).then(function () { return undefined; });
|
|
294
|
-
}
|
|
295
|
-
};
|
|
296
|
-
var currentRows = context.select(entity, {
|
|
297
|
-
data: projection,
|
|
298
|
-
filter: operationFilter,
|
|
299
|
-
}, { dontCollect: true });
|
|
300
|
-
if (currentRows instanceof Promise) {
|
|
301
|
-
return currentRows.then(function (row2) { return checkWithRows(row2); });
|
|
302
|
-
}
|
|
303
|
-
return checkWithRows(currentRows);
|
|
304
|
-
}
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
};
|
|
308
|
-
try {
|
|
309
|
-
for (var indexes_1 = (e_2 = void 0, tslib_1.__values(indexes)), indexes_1_1 = indexes_1.next(); !indexes_1_1.done; indexes_1_1 = indexes_1.next()) {
|
|
310
|
-
var index = indexes_1_1.value;
|
|
311
|
-
_loop_4(index);
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
315
|
-
finally {
|
|
316
|
-
try {
|
|
317
|
-
if (indexes_1_1 && !indexes_1_1.done && (_e = indexes_1.return)) _e.call(indexes_1);
|
|
318
|
-
}
|
|
319
|
-
finally { if (e_2) throw e_2.error; }
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
};
|
|
323
|
-
// unique索引相应的checker
|
|
324
|
-
for (var entity in schema) {
|
|
325
|
-
_loop_2(entity);
|
|
326
|
-
}
|
|
327
|
-
return {
|
|
328
|
-
triggers: triggers,
|
|
329
|
-
checkers: checkers,
|
|
330
|
-
watchers: makeIntrinsicWatchers(schema),
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
exports.analyzeActionDefDict = analyzeActionDefDict;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeActionDefDict = exports.getFullProjection = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var types_1 = require("../types");
|
|
6
|
+
var lodash_1 = require("../utils/lodash");
|
|
7
|
+
var filter_1 = require("./filter");
|
|
8
|
+
function getFullProjection(entity, schema) {
|
|
9
|
+
var attributes = schema[entity].attributes;
|
|
10
|
+
var projection = {
|
|
11
|
+
id: 1,
|
|
12
|
+
$$createAt$$: 1,
|
|
13
|
+
$$updateAt$$: 1,
|
|
14
|
+
$$deleteAt$$: 1,
|
|
15
|
+
};
|
|
16
|
+
Object.keys(attributes).forEach(function (k) {
|
|
17
|
+
var _a;
|
|
18
|
+
return Object.assign(projection, (_a = {},
|
|
19
|
+
_a[k] = 1,
|
|
20
|
+
_a));
|
|
21
|
+
});
|
|
22
|
+
return projection;
|
|
23
|
+
}
|
|
24
|
+
exports.getFullProjection = getFullProjection;
|
|
25
|
+
function makeIntrinsicWatchers(schema) {
|
|
26
|
+
var watchers = [];
|
|
27
|
+
for (var entity in schema) {
|
|
28
|
+
var attributes = schema[entity].attributes;
|
|
29
|
+
var expiresAt = attributes.expiresAt, expired = attributes.expired;
|
|
30
|
+
if (expiresAt && expiresAt.type === 'datetime' && expired && expired.type === 'boolean') {
|
|
31
|
+
// 如果有定义expiresAt和expired,则自动生成一个检查的watcher
|
|
32
|
+
watchers.push({
|
|
33
|
+
entity: entity,
|
|
34
|
+
name: "\u5BF9\u8C61".concat(entity, "\u4E0A\u7684\u8FC7\u671F\u81EA\u52A8watcher"),
|
|
35
|
+
filter: function () {
|
|
36
|
+
return {
|
|
37
|
+
expired: false,
|
|
38
|
+
expiresAt: {
|
|
39
|
+
$lte: Date.now(),
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
action: 'update',
|
|
44
|
+
actionData: {
|
|
45
|
+
expired: true,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return watchers;
|
|
51
|
+
}
|
|
52
|
+
function checkUniqueBetweenRows(rows, uniqAttrs) {
|
|
53
|
+
// 先检查这些行本身之间有无unique冲突
|
|
54
|
+
var uniqRows = (0, lodash_1.uniqBy)(rows, function (d) {
|
|
55
|
+
var e_1, _a;
|
|
56
|
+
var s = '';
|
|
57
|
+
try {
|
|
58
|
+
for (var uniqAttrs_1 = tslib_1.__values(uniqAttrs), uniqAttrs_1_1 = uniqAttrs_1.next(); !uniqAttrs_1_1.done; uniqAttrs_1_1 = uniqAttrs_1.next()) {
|
|
59
|
+
var a = uniqAttrs_1_1.value;
|
|
60
|
+
if (d[a] === null || d[a] === undefined) {
|
|
61
|
+
s + d.id;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
s + "-".concat(d[a]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
69
|
+
finally {
|
|
70
|
+
try {
|
|
71
|
+
if (uniqAttrs_1_1 && !uniqAttrs_1_1.done && (_a = uniqAttrs_1.return)) _a.call(uniqAttrs_1);
|
|
72
|
+
}
|
|
73
|
+
finally { if (e_1) throw e_1.error; }
|
|
74
|
+
}
|
|
75
|
+
return s;
|
|
76
|
+
});
|
|
77
|
+
if (uniqRows.length < rows.length) {
|
|
78
|
+
throw new types_1.OakUniqueViolationException([{
|
|
79
|
+
attrs: uniqAttrs,
|
|
80
|
+
}]);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function checkCountLessThan(count, uniqAttrs, than, id) {
|
|
84
|
+
if (than === void 0) { than = 0; }
|
|
85
|
+
if (count instanceof Promise) {
|
|
86
|
+
return count.then(function (count2) {
|
|
87
|
+
if (count2 > than) {
|
|
88
|
+
throw new types_1.OakUniqueViolationException([{
|
|
89
|
+
id: id,
|
|
90
|
+
attrs: uniqAttrs,
|
|
91
|
+
}]);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (count > than) {
|
|
96
|
+
throw new types_1.OakUniqueViolationException([{
|
|
97
|
+
id: id,
|
|
98
|
+
attrs: uniqAttrs,
|
|
99
|
+
}]);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function checkUnique(entity, row, context, uniqAttrs, extraFilter) {
|
|
103
|
+
var filter = (0, lodash_1.pick)(row, uniqAttrs);
|
|
104
|
+
for (var a in filter) {
|
|
105
|
+
if (filter[a] === null || filter[a] === undefined) {
|
|
106
|
+
delete filter[a];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (Object.keys(filter).length < uniqAttrs.length) {
|
|
110
|
+
// 说明有null值,不需要检查约束
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
var filter2 = extraFilter ? (0, filter_1.addFilterSegment)([filter, extraFilter]) : filter;
|
|
114
|
+
var count = context.count(entity, { filter: filter2 }, { dontCollect: true });
|
|
115
|
+
return checkCountLessThan(count, uniqAttrs, 0, row.id);
|
|
116
|
+
}
|
|
117
|
+
function analyzeActionDefDict(schema, actionDefDict) {
|
|
118
|
+
var _a;
|
|
119
|
+
var checkers = [];
|
|
120
|
+
var triggers = [];
|
|
121
|
+
// action状态转换矩阵相应的checker
|
|
122
|
+
for (var entity in actionDefDict) {
|
|
123
|
+
var _loop_1 = function (attr) {
|
|
124
|
+
var def = actionDefDict[entity][attr];
|
|
125
|
+
var _b = def, stm = _b.stm, is = _b.is;
|
|
126
|
+
var _loop_3 = function (action) {
|
|
127
|
+
var _c, _d;
|
|
128
|
+
var actionStm = stm[action];
|
|
129
|
+
var conditionalFilter = typeof actionStm[0] === 'string' ? (_c = {},
|
|
130
|
+
_c[attr] = actionStm[0],
|
|
131
|
+
_c) : (_d = {},
|
|
132
|
+
_d[attr] = {
|
|
133
|
+
$in: actionStm[0],
|
|
134
|
+
},
|
|
135
|
+
_d);
|
|
136
|
+
checkers.push({
|
|
137
|
+
action: action,
|
|
138
|
+
type: 'row',
|
|
139
|
+
entity: entity,
|
|
140
|
+
filter: conditionalFilter,
|
|
141
|
+
errMsg: '',
|
|
142
|
+
});
|
|
143
|
+
checkers.push({
|
|
144
|
+
action: action,
|
|
145
|
+
type: 'data',
|
|
146
|
+
entity: entity,
|
|
147
|
+
priority: 10,
|
|
148
|
+
checker: function (data) {
|
|
149
|
+
var _a;
|
|
150
|
+
Object.assign(data, (_a = {},
|
|
151
|
+
_a[attr] = stm[action][1],
|
|
152
|
+
_a));
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
for (var action in stm) {
|
|
157
|
+
_loop_3(action);
|
|
158
|
+
}
|
|
159
|
+
if (is) {
|
|
160
|
+
checkers.push({
|
|
161
|
+
action: 'create',
|
|
162
|
+
type: 'data',
|
|
163
|
+
entity: entity,
|
|
164
|
+
priority: 10,
|
|
165
|
+
checker: function (data) {
|
|
166
|
+
var _a;
|
|
167
|
+
if (data instanceof Array) {
|
|
168
|
+
data.forEach(function (ele) {
|
|
169
|
+
var _a;
|
|
170
|
+
if (!ele[attr]) {
|
|
171
|
+
Object.assign(ele, (_a = {},
|
|
172
|
+
_a[attr] = is,
|
|
173
|
+
_a));
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
if (!data[attr]) {
|
|
179
|
+
Object.assign(data, (_a = {},
|
|
180
|
+
_a[attr] = is,
|
|
181
|
+
_a));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
for (var attr in actionDefDict[entity]) {
|
|
189
|
+
_loop_1(attr);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
var _loop_2 = function (entity) {
|
|
193
|
+
var e_2, _e;
|
|
194
|
+
var indexes = schema[entity].indexes;
|
|
195
|
+
if (indexes) {
|
|
196
|
+
var _loop_4 = function (index) {
|
|
197
|
+
if ((_a = index.config) === null || _a === void 0 ? void 0 : _a.unique) {
|
|
198
|
+
var attributes = index.attributes;
|
|
199
|
+
var uniqAttrs_2 = attributes.map(function (ele) { return ele.name; });
|
|
200
|
+
checkers.push({
|
|
201
|
+
entity: entity,
|
|
202
|
+
action: 'create',
|
|
203
|
+
type: 'logical',
|
|
204
|
+
priority: 20,
|
|
205
|
+
checker: function (operation, context) {
|
|
206
|
+
var data = operation.data;
|
|
207
|
+
if (data instanceof Array) {
|
|
208
|
+
checkUniqueBetweenRows(data, uniqAttrs_2);
|
|
209
|
+
var checkResult = data.map(function (ele) { return checkUnique(entity, ele, context, uniqAttrs_2); });
|
|
210
|
+
if (checkResult[0] instanceof Promise) {
|
|
211
|
+
return Promise.all(checkResult).then(function () { return undefined; });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
return checkUnique(entity, data, context, uniqAttrs_2);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}, {
|
|
219
|
+
entity: entity,
|
|
220
|
+
action: 'update',
|
|
221
|
+
type: 'logical',
|
|
222
|
+
priority: 20,
|
|
223
|
+
checker: function (operation, context) {
|
|
224
|
+
var e_3, _a, e_4, _b, _c;
|
|
225
|
+
var _d = operation, data = _d.data, operationFilter = _d.filter;
|
|
226
|
+
var attrs = Object.keys(data);
|
|
227
|
+
var refAttrs = (0, lodash_1.intersection)(attrs, uniqAttrs_2);
|
|
228
|
+
if (refAttrs.length === 0) {
|
|
229
|
+
// 如果本次更新和unique约束的属性之间没有交集则直接返回
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
for (var refAttrs_1 = (e_3 = void 0, tslib_1.__values(refAttrs)), refAttrs_1_1 = refAttrs_1.next(); !refAttrs_1_1.done; refAttrs_1_1 = refAttrs_1.next()) {
|
|
234
|
+
var attr = refAttrs_1_1.value;
|
|
235
|
+
// 如果有更新为null值,不用再检查约束
|
|
236
|
+
if (data[attr] === null || data[attr] === undefined) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
242
|
+
finally {
|
|
243
|
+
try {
|
|
244
|
+
if (refAttrs_1_1 && !refAttrs_1_1.done && (_a = refAttrs_1.return)) _a.call(refAttrs_1);
|
|
245
|
+
}
|
|
246
|
+
finally { if (e_3) throw e_3.error; }
|
|
247
|
+
}
|
|
248
|
+
if (refAttrs.length === uniqAttrs_2.length) {
|
|
249
|
+
// 如果更新了全部属性,直接检查
|
|
250
|
+
var filter = (0, lodash_1.pick)(data, refAttrs);
|
|
251
|
+
// 在这些行以外的行不和更新后的键值冲突
|
|
252
|
+
var count = context.count(entity, {
|
|
253
|
+
filter: (0, filter_1.addFilterSegment)([filter, {
|
|
254
|
+
$not: operationFilter,
|
|
255
|
+
}]),
|
|
256
|
+
}, { dontCollect: true });
|
|
257
|
+
var checkCount = checkCountLessThan(count, uniqAttrs_2);
|
|
258
|
+
// 更新的行只能有一行
|
|
259
|
+
var rowCount = context.count(entity, {
|
|
260
|
+
filter: operationFilter,
|
|
261
|
+
}, { dontCollect: true });
|
|
262
|
+
var checkRowCount = checkCountLessThan(rowCount, uniqAttrs_2, 1);
|
|
263
|
+
// 如果更新的行数为零似乎也可以,但这应该不可能出现吧,by Xc 20230131
|
|
264
|
+
if (checkRowCount instanceof Promise) {
|
|
265
|
+
return Promise.all([checkCount, checkRowCount]).then(function () { return undefined; });
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// 否则需要结合本行现有的属性来进行检查
|
|
269
|
+
var projection = { id: 1 };
|
|
270
|
+
try {
|
|
271
|
+
for (var uniqAttrs_3 = (e_4 = void 0, tslib_1.__values(uniqAttrs_2)), uniqAttrs_3_1 = uniqAttrs_3.next(); !uniqAttrs_3_1.done; uniqAttrs_3_1 = uniqAttrs_3.next()) {
|
|
272
|
+
var attr = uniqAttrs_3_1.value;
|
|
273
|
+
Object.assign(projection, (_c = {},
|
|
274
|
+
_c[attr] = 1,
|
|
275
|
+
_c));
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
279
|
+
finally {
|
|
280
|
+
try {
|
|
281
|
+
if (uniqAttrs_3_1 && !uniqAttrs_3_1.done && (_b = uniqAttrs_3.return)) _b.call(uniqAttrs_3);
|
|
282
|
+
}
|
|
283
|
+
finally { if (e_4) throw e_4.error; }
|
|
284
|
+
}
|
|
285
|
+
var checkWithRows = function (rows2) {
|
|
286
|
+
var rows22 = rows2.map(function (ele) { return Object.assign(ele, data); });
|
|
287
|
+
// 先检查这些行本身之间是否冲突
|
|
288
|
+
checkUniqueBetweenRows(rows22, uniqAttrs_2);
|
|
289
|
+
var checkResults = rows22.map(function (row) { return checkUnique(entity, row, context, uniqAttrs_2, {
|
|
290
|
+
$not: operationFilter
|
|
291
|
+
}); });
|
|
292
|
+
if (checkResults[0] instanceof Promise) {
|
|
293
|
+
return Promise.all(checkResults).then(function () { return undefined; });
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
var currentRows = context.select(entity, {
|
|
297
|
+
data: projection,
|
|
298
|
+
filter: operationFilter,
|
|
299
|
+
}, { dontCollect: true });
|
|
300
|
+
if (currentRows instanceof Promise) {
|
|
301
|
+
return currentRows.then(function (row2) { return checkWithRows(row2); });
|
|
302
|
+
}
|
|
303
|
+
return checkWithRows(currentRows);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
try {
|
|
309
|
+
for (var indexes_1 = (e_2 = void 0, tslib_1.__values(indexes)), indexes_1_1 = indexes_1.next(); !indexes_1_1.done; indexes_1_1 = indexes_1.next()) {
|
|
310
|
+
var index = indexes_1_1.value;
|
|
311
|
+
_loop_4(index);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
315
|
+
finally {
|
|
316
|
+
try {
|
|
317
|
+
if (indexes_1_1 && !indexes_1_1.done && (_e = indexes_1.return)) _e.call(indexes_1);
|
|
318
|
+
}
|
|
319
|
+
finally { if (e_2) throw e_2.error; }
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
// unique索引相应的checker
|
|
324
|
+
for (var entity in schema) {
|
|
325
|
+
_loop_2(entity);
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
triggers: triggers,
|
|
329
|
+
checkers: checkers,
|
|
330
|
+
watchers: makeIntrinsicWatchers(schema),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
exports.analyzeActionDefDict = analyzeActionDefDict;
|