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.
Files changed (171) hide show
  1. package/lib/actions/action.d.ts +16 -16
  2. package/lib/actions/action.js +17 -17
  3. package/lib/actions/relation.d.ts +5 -5
  4. package/lib/actions/relation.js +38 -38
  5. package/lib/base-app-domain/ActionDefDict.d.ts +8 -8
  6. package/lib/base-app-domain/ActionDefDict.js +9 -9
  7. package/lib/base-app-domain/EntityDict.d.ts +14 -14
  8. package/lib/base-app-domain/EntityDict.js +2 -2
  9. package/lib/base-app-domain/Modi/Action.d.ts +10 -10
  10. package/lib/base-app-domain/Modi/Action.js +14 -14
  11. package/lib/base-app-domain/Modi/Schema.d.ts +146 -146
  12. package/lib/base-app-domain/Modi/Schema.js +2 -2
  13. package/lib/base-app-domain/Modi/Storage.d.ts +3 -3
  14. package/lib/base-app-domain/Modi/Storage.js +60 -60
  15. package/lib/base-app-domain/ModiEntity/Schema.d.ts +189 -189
  16. package/lib/base-app-domain/ModiEntity/Schema.js +2 -2
  17. package/lib/base-app-domain/ModiEntity/Storage.d.ts +3 -3
  18. package/lib/base-app-domain/ModiEntity/Storage.js +27 -27
  19. package/lib/base-app-domain/Oper/Schema.d.ts +144 -144
  20. package/lib/base-app-domain/Oper/Schema.js +2 -2
  21. package/lib/base-app-domain/Oper/Storage.d.ts +3 -3
  22. package/lib/base-app-domain/Oper/Storage.js +29 -29
  23. package/lib/base-app-domain/OperEntity/Schema.d.ts +205 -205
  24. package/lib/base-app-domain/OperEntity/Schema.js +2 -2
  25. package/lib/base-app-domain/OperEntity/Storage.d.ts +3 -3
  26. package/lib/base-app-domain/OperEntity/Storage.js +27 -27
  27. package/lib/base-app-domain/Storage.d.ts +3 -3
  28. package/lib/base-app-domain/Storage.js +17 -17
  29. package/lib/base-app-domain/User/Action.d.ts +10 -10
  30. package/lib/base-app-domain/User/Action.js +12 -12
  31. package/lib/base-app-domain/User/Schema.d.ts +180 -180
  32. package/lib/base-app-domain/User/Schema.js +2 -2
  33. package/lib/base-app-domain/User/Storage.d.ts +3 -3
  34. package/lib/base-app-domain/User/Storage.js +36 -36
  35. package/lib/base-app-domain/UserEntityGrant/Schema.d.ts +121 -121
  36. package/lib/base-app-domain/UserEntityGrant/Schema.js +2 -2
  37. package/lib/base-app-domain/UserEntityGrant/Storage.d.ts +3 -3
  38. package/lib/base-app-domain/UserEntityGrant/Storage.js +28 -28
  39. package/lib/base-app-domain/_SubQuery.d.ts +44 -44
  40. package/lib/base-app-domain/_SubQuery.js +2 -2
  41. package/lib/base-app-domain/index.d.ts +3 -3
  42. package/lib/base-app-domain/index.js +6 -6
  43. package/lib/checkers/index.d.ts +5 -5
  44. package/lib/checkers/index.js +16 -16
  45. package/lib/compiler/env.d.ts +11 -11
  46. package/lib/compiler/env.js +39 -39
  47. package/lib/compiler/schemalBuilder.d.ts +2 -2
  48. package/lib/compiler/schemalBuilder.js +3355 -3355
  49. package/lib/compiler/uiBuilder.d.ts +1 -1
  50. package/lib/compiler/uiBuilder.js +3 -3
  51. package/lib/entities/Modi.d.ts +11 -11
  52. package/lib/entities/Modi.js +46 -46
  53. package/lib/entities/ModiEntity.d.ts +8 -8
  54. package/lib/entities/ModiEntity.js +15 -15
  55. package/lib/entities/Oper.d.ts +10 -10
  56. package/lib/entities/Oper.js +17 -17
  57. package/lib/entities/OperEntity.d.ts +8 -8
  58. package/lib/entities/OperEntity.js +15 -15
  59. package/lib/entities/User.d.ts +8 -8
  60. package/lib/entities/User.js +28 -28
  61. package/lib/entities/UserEntityGrant.d.ts +7 -7
  62. package/lib/entities/UserEntityGrant.js +12 -12
  63. package/lib/store/AsyncRowStore.d.ts +51 -48
  64. package/lib/store/AsyncRowStore.js +189 -183
  65. package/lib/store/CascadeStore.d.ts +91 -91
  66. package/lib/store/CascadeStore.js +1634 -1603
  67. package/lib/store/SyncRowStore.d.ts +29 -29
  68. package/lib/store/SyncRowStore.js +48 -48
  69. package/lib/store/TriggerExecutor.d.ts +32 -32
  70. package/lib/store/TriggerExecutor.js +532 -532
  71. package/lib/store/actionDef.d.ts +9 -9
  72. package/lib/store/actionDef.js +333 -333
  73. package/lib/store/checker.d.ts +26 -26
  74. package/lib/store/checker.js +829 -867
  75. package/lib/store/filter.d.ts +109 -109
  76. package/lib/store/filter.js +893 -893
  77. package/lib/store/modi.d.ts +13 -13
  78. package/lib/store/modi.js +216 -216
  79. package/lib/store/relation.d.ts +13 -13
  80. package/lib/store/relation.js +66 -66
  81. package/lib/store/selection.d.ts +19 -7
  82. package/lib/store/selection.js +265 -238
  83. package/lib/triggers/index.d.ts +6 -6
  84. package/lib/triggers/index.js +11 -11
  85. package/lib/triggers/modi.d.ts +5 -5
  86. package/lib/triggers/modi.js +72 -72
  87. package/lib/types/Action.d.ts +20 -20
  88. package/lib/types/Action.js +2 -2
  89. package/lib/types/AppLoader.d.ts +11 -11
  90. package/lib/types/AppLoader.js +10 -10
  91. package/lib/types/Aspect.d.ts +13 -12
  92. package/lib/types/Aspect.js +4 -4
  93. package/lib/types/Auth.d.ts +69 -69
  94. package/lib/types/Auth.js +2 -2
  95. package/lib/types/Connector.d.ts +27 -26
  96. package/lib/types/Connector.js +9 -9
  97. package/lib/types/Context.d.ts +7 -7
  98. package/lib/types/Context.js +3 -3
  99. package/lib/types/DataType.d.ts +18 -18
  100. package/lib/types/DataType.js +5 -5
  101. package/lib/types/Demand.d.ts +77 -77
  102. package/lib/types/Demand.js +9 -9
  103. package/lib/types/Endpoint.d.ts +11 -11
  104. package/lib/types/Endpoint.js +3 -3
  105. package/lib/types/Entity.d.ts +183 -183
  106. package/lib/types/Entity.js +14 -14
  107. package/lib/types/Exception.d.ts +100 -98
  108. package/lib/types/Exception.js +327 -283
  109. package/lib/types/Expression.d.ts +163 -163
  110. package/lib/types/Expression.js +427 -427
  111. package/lib/types/Geo.d.ts +18 -18
  112. package/lib/types/Geo.js +2 -2
  113. package/lib/types/Locale.d.ts +24 -24
  114. package/lib/types/Locale.js +2 -2
  115. package/lib/types/Logger.d.ts +5 -5
  116. package/lib/types/Logger.js +3 -3
  117. package/lib/types/Polyfill.d.ts +23 -23
  118. package/lib/types/Polyfill.js +2 -2
  119. package/lib/types/Port.d.ts +17 -17
  120. package/lib/types/Port.js +2 -2
  121. package/lib/types/RowStore.d.ts +12 -12
  122. package/lib/types/RowStore.js +34 -34
  123. package/lib/types/Storage.d.ts +56 -56
  124. package/lib/types/Storage.js +2 -2
  125. package/lib/types/Timer.d.ts +13 -13
  126. package/lib/types/Timer.js +2 -2
  127. package/lib/types/Trigger.d.ts +109 -109
  128. package/lib/types/Trigger.js +49 -49
  129. package/lib/types/Txn.d.ts +2 -2
  130. package/lib/types/Txn.js +3 -3
  131. package/lib/types/Watcher.d.ts +19 -19
  132. package/lib/types/Watcher.js +4 -4
  133. package/lib/types/index.d.ts +21 -21
  134. package/lib/types/index.js +24 -24
  135. package/lib/types/schema/DataTypes.d.ts +32 -32
  136. package/lib/types/schema/DataTypes.js +3 -3
  137. package/lib/utils/SimpleConnector.d.ts +35 -30
  138. package/lib/utils/SimpleConnector.js +134 -117
  139. package/lib/utils/assert.d.ts +5 -5
  140. package/lib/utils/assert.js +9 -9
  141. package/lib/utils/concurrent.d.ts +15 -15
  142. package/lib/utils/concurrent.js +89 -89
  143. package/lib/utils/cron.d.ts +1 -1
  144. package/lib/utils/cron.js +18 -18
  145. package/lib/utils/date.d.ts +1 -1
  146. package/lib/utils/date.js +18 -18
  147. package/lib/utils/geo.d.ts +4 -4
  148. package/lib/utils/geo.js +24 -24
  149. package/lib/utils/lodash.d.ts +20 -20
  150. package/lib/utils/lodash.js +55 -55
  151. package/lib/utils/random/random.d.ts +1 -1
  152. package/lib/utils/random/random.js +24 -24
  153. package/lib/utils/random/random.mp.d.ts +1 -1
  154. package/lib/utils/random/random.mp.js +25 -25
  155. package/lib/utils/random/random.web.d.ts +1 -1
  156. package/lib/utils/random/random.web.js +17 -17
  157. package/lib/utils/string.d.ts +22 -22
  158. package/lib/utils/string.js +70 -70
  159. package/lib/utils/url.d.ts +1 -0
  160. package/lib/utils/url.js +12 -0
  161. package/lib/utils/uuid.d.ts +12 -12
  162. package/lib/utils/uuid.js +194 -194
  163. package/lib/utils/validator.d.ts +23 -23
  164. package/lib/utils/validator.js +123 -123
  165. package/package.json +48 -48
  166. package/src/entities/Modi.ts +68 -68
  167. package/src/entities/ModiEntity.ts +24 -24
  168. package/src/entities/Oper.ts +28 -28
  169. package/src/entities/OperEntity.ts +24 -24
  170. package/src/entities/User.ts +44 -44
  171. package/src/entities/UserEntityGrant.ts +24 -24
@@ -1,867 +1,829 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createRemoveCheckers = exports.createAuthCheckers = exports.translateCheckerInSyncContext = exports.translateCheckerInAsyncContext = void 0;
4
- var tslib_1 = require("tslib");
5
- var assert_1 = tslib_1.__importDefault(require("assert"));
6
- var filter_1 = require("../store/filter");
7
- var Exception_1 = require("../types/Exception");
8
- var types_1 = require("../types");
9
- var actionDef_1 = require("./actionDef");
10
- var string_1 = require("../utils/string");
11
- var lodash_1 = require("../utils/lodash");
12
- var relation_1 = require("./relation");
13
- var uuid_1 = require("../utils/uuid");
14
- function translateCheckerInAsyncContext(checker) {
15
- var _this = this;
16
- var entity = checker.entity, type = checker.type, action = checker.action;
17
- var when = ((action === 'create' || action instanceof Array && action.includes('create')) && ['relation'].includes(type)) ? 'after' : 'before';
18
- switch (type) {
19
- case 'data': {
20
- var checkerFn_1 = checker.checker;
21
- var fn = (function (_a, context) {
22
- var operation = _a.operation;
23
- return tslib_1.__awaiter(_this, void 0, void 0, function () {
24
- var data;
25
- return tslib_1.__generator(this, function (_b) {
26
- switch (_b.label) {
27
- case 0:
28
- data = operation.data;
29
- return [4 /*yield*/, checkerFn_1(data, context)];
30
- case 1:
31
- _b.sent();
32
- return [2 /*return*/, 0];
33
- }
34
- });
35
- });
36
- });
37
- return {
38
- fn: fn,
39
- when: when,
40
- };
41
- }
42
- case 'row': {
43
- var filter_2 = checker.filter, errMsg_1 = checker.errMsg, inconsistentRows_1 = checker.inconsistentRows;
44
- var fn = (function (_a, context, option) {
45
- var operation = _a.operation;
46
- return tslib_1.__awaiter(_this, void 0, void 0, function () {
47
- var operationFilter, action, filter2, _b, entity2, selection2, rows2, data_1, rows2, data_2;
48
- var _c, _d;
49
- return tslib_1.__generator(this, function (_e) {
50
- switch (_e.label) {
51
- case 0:
52
- operationFilter = operation.filter, action = operation.action;
53
- if (!(typeof filter_2 === 'function')) return [3 /*break*/, 2];
54
- return [4 /*yield*/, filter_2(operation, context, option)];
55
- case 1:
56
- _b = _e.sent();
57
- return [3 /*break*/, 3];
58
- case 2:
59
- _b = filter_2;
60
- _e.label = 3;
61
- case 3:
62
- filter2 = _b;
63
- if (!['select', 'count', 'stat'].includes(action)) return [3 /*break*/, 4];
64
- operation.filter = (0, filter_1.addFilterSegment)(operationFilter || {}, filter2);
65
- return [2 /*return*/, 0];
66
- case 4: return [4 /*yield*/, (0, filter_1.checkFilterContains)(entity, context, filter2, operationFilter || {}, true)];
67
- case 5:
68
- if (_e.sent()) {
69
- return [2 /*return*/, 0];
70
- }
71
- if (!inconsistentRows_1) return [3 /*break*/, 7];
72
- entity2 = inconsistentRows_1.entity, selection2 = inconsistentRows_1.selection;
73
- return [4 /*yield*/, context.select(entity2, selection2(operationFilter), {
74
- dontCollect: true,
75
- blockTrigger: true,
76
- })];
77
- case 6:
78
- rows2 = _e.sent();
79
- data_1 = {};
80
- rows2.forEach(function (ele) {
81
- var _a;
82
- return Object.assign(data_1, (_a = {},
83
- _a[ele.id] = ele,
84
- _a));
85
- });
86
- throw new Exception_1.OakRowInconsistencyException({
87
- a: 's',
88
- d: (_c = {},
89
- _c[entity2] = data_1,
90
- _c)
91
- }, errMsg_1);
92
- case 7: return [4 /*yield*/, context.select(entity, {
93
- data: (0, actionDef_1.getFullProjection)(entity, context.getSchema()),
94
- filter: Object.assign({}, operationFilter, {
95
- $not: filter2,
96
- })
97
- }, {
98
- dontCollect: true,
99
- blockTrigger: true,
100
- })];
101
- case 8:
102
- rows2 = _e.sent();
103
- data_2 = {};
104
- rows2.forEach(function (ele) {
105
- var _a;
106
- return Object.assign(data_2, (_a = {},
107
- _a[ele.id] = ele,
108
- _a));
109
- });
110
- throw new Exception_1.OakRowInconsistencyException({
111
- a: 's',
112
- d: (_d = {},
113
- _d[entity] = data_2,
114
- _d)
115
- }, errMsg_1);
116
- }
117
- });
118
- });
119
- });
120
- return {
121
- fn: fn,
122
- when: when,
123
- };
124
- }
125
- case 'relation': {
126
- var relationFilter_1 = checker.relationFilter, errMsg_2 = checker.errMsg;
127
- var fn = (function (_a, context, option) {
128
- var operation = _a.operation;
129
- return tslib_1.__awaiter(_this, void 0, void 0, function () {
130
- var filter2, data, filter, _b, _c, _d;
131
- return tslib_1.__generator(this, function (_e) {
132
- switch (_e.label) {
133
- case 0:
134
- if (context.isRoot()) {
135
- return [2 /*return*/, 0];
136
- }
137
- if (!(operation.action === 'create')) return [3 /*break*/, 3];
138
- return [4 /*yield*/, relationFilter_1(operation, context, option)];
139
- case 1:
140
- filter2 = _e.sent();
141
- data = operation.data;
142
- filter = data instanceof Array ? {
143
- id: {
144
- $in: data.map(function (ele) { return ele.id; }),
145
- },
146
- } : {
147
- id: data.id,
148
- };
149
- return [4 /*yield*/, (0, filter_1.checkFilterContains)(entity, context, filter2, filter, true)];
150
- case 2:
151
- if (_e.sent()) {
152
- return [2 /*return*/, 0];
153
- }
154
- throw new Exception_1.OakUserUnpermittedException(errMsg_2);
155
- case 3:
156
- _b = operation;
157
- _c = filter_1.combineFilters;
158
- _d = [operation.filter];
159
- return [4 /*yield*/, relationFilter_1(operation, context, option)];
160
- case 4:
161
- _b.filter = _c.apply(void 0, [_d.concat([_e.sent()])]);
162
- _e.label = 5;
163
- case 5: return [2 /*return*/, 0];
164
- }
165
- });
166
- });
167
- });
168
- return {
169
- fn: fn,
170
- when: when,
171
- };
172
- }
173
- case 'logical':
174
- case 'logicalRelation': {
175
- var checkerFn_2 = checker.checker;
176
- var fn = (function (_a, context, option) {
177
- var operation = _a.operation;
178
- return tslib_1.__awaiter(_this, void 0, void 0, function () {
179
- return tslib_1.__generator(this, function (_b) {
180
- switch (_b.label) {
181
- case 0:
182
- if (context.isRoot() && type === 'logicalRelation') {
183
- return [2 /*return*/, 0];
184
- }
185
- return [4 /*yield*/, checkerFn_2(operation, context, option)];
186
- case 1:
187
- _b.sent();
188
- return [2 /*return*/, 0];
189
- }
190
- });
191
- });
192
- });
193
- return {
194
- fn: fn,
195
- when: when,
196
- };
197
- }
198
- default: {
199
- (0, assert_1.default)(false);
200
- }
201
- }
202
- }
203
- exports.translateCheckerInAsyncContext = translateCheckerInAsyncContext;
204
- function translateCheckerInSyncContext(checker) {
205
- var entity = checker.entity, type = checker.type, action = checker.action;
206
- var when = ((action === 'create' || action instanceof Array && action.includes('create')) && ['relation'].includes(type)) ? 'after' : 'before';
207
- switch (type) {
208
- case 'data': {
209
- var checkerFn_3 = checker.checker;
210
- var fn = function (operation, context) { return checkerFn_3(operation.data, context); };
211
- return {
212
- fn: fn,
213
- when: when,
214
- };
215
- }
216
- case 'row': {
217
- var filter_3 = checker.filter, errMsg_3 = checker.errMsg;
218
- var fn = function (operation, context, option) {
219
- var operationFilter = operation.filter, action = operation.action;
220
- var filter2 = typeof filter_3 === 'function' ? filter_3(operation, context, option) : filter_3;
221
- (0, assert_1.default)(operationFilter);
222
- if (['select', 'count', 'stat'].includes(action)) {
223
- operation.filter = (0, filter_1.addFilterSegment)(operationFilter, filter2);
224
- return 0;
225
- }
226
- else {
227
- (0, assert_1.default)(!(filter2 instanceof Promise));
228
- if ((0, filter_1.checkFilterContains)(entity, context, filter2, operationFilter, true)) {
229
- return;
230
- }
231
- throw new Exception_1.OakRowInconsistencyException(undefined, errMsg_3);
232
- }
233
- };
234
- return {
235
- fn: fn,
236
- when: when,
237
- };
238
- }
239
- case 'relation': {
240
- var relationFilter_2 = checker.relationFilter, errMsg_4 = checker.errMsg;
241
- var fn = function (operation, context, option) {
242
- if (context.isRoot()) {
243
- return;
244
- }
245
- var filter2 = typeof relationFilter_2 === 'function' ? relationFilter_2(operation, context, option) : relationFilter_2;
246
- var filter = operation.filter, action = operation.action;
247
- var filter3 = filter;
248
- if (action === 'create') {
249
- var data = operation.data;
250
- filter3 = data instanceof Array ? {
251
- id: {
252
- $in: data.map(function (ele) { return ele.id; }),
253
- },
254
- } : { id: data.id };
255
- }
256
- (0, assert_1.default)(filter3);
257
- (0, assert_1.default)(!(filter2 instanceof Promise));
258
- if ((0, filter_1.checkFilterContains)(entity, context, filter2, filter3, true)) {
259
- return;
260
- }
261
- throw new Exception_1.OakUserUnpermittedException(errMsg_4);
262
- };
263
- return {
264
- fn: fn,
265
- when: when,
266
- };
267
- }
268
- case 'logical':
269
- case 'logicalRelation': {
270
- var checkerFn_4 = checker.checker;
271
- var fn = function (operation, context, option) {
272
- if (context.isRoot() && type === 'logicalRelation') {
273
- return;
274
- }
275
- checkerFn_4(operation, context, option);
276
- };
277
- return {
278
- fn: fn,
279
- when: when,
280
- };
281
- }
282
- default: {
283
- (0, assert_1.default)(false);
284
- }
285
- }
286
- }
287
- exports.translateCheckerInSyncContext = translateCheckerInSyncContext;
288
- function translateCascadeRelationFilterMaker(schema, lch, entity2) {
289
- var cascadePath = lch.cascadePath, relations = lch.relations;
290
- var paths = cascadePath.split('.');
291
- var translateRelationFilter = function (entity) {
292
- // 有两种情况,此entity和user有Relation定义,或是此entity已经指向user
293
- if (entity === 'user') {
294
- return function (userId) { return ({
295
- id: userId,
296
- }); };
297
- }
298
- else if (schema[entity].relation) {
299
- if (relations) {
300
- var diff = (0, lodash_1.difference)(relations, schema[entity].relation);
301
- if (diff.length > 0) {
302
- throw new Error("".concat(entity2, "\u4E0A\u67D0auth\u5B9A\u4E49\u7684relations\u4E2D\u542B\u6709\u4E0D\u53EF\u8BC6\u522B\u7684\u5173\u7CFB\u5B9A\u4E49").concat(diff.join(','), "\uFF0C \u8BF7\u4ED4\u7EC6\u68C0\u67E5"));
303
- }
304
- }
305
- var relationEntityName_1 = "user".concat((0, string_1.firstLetterUpperCase)(entity));
306
- return function (userId) {
307
- var _a;
308
- var filter = relations ? {
309
- userId: userId,
310
- relation: {
311
- $in: relations,
312
- },
313
- } : {
314
- userId: userId,
315
- };
316
- return {
317
- id: {
318
- $in: {
319
- entity: relationEntityName_1,
320
- data: (_a = {},
321
- _a["".concat(entity, "Id")] = 1,
322
- _a),
323
- filter: filter,
324
- },
325
- },
326
- };
327
- };
328
- }
329
- else {
330
- (0, assert_1.default)(false, "".concat(entity2, "\u4E0A\u67D0auth\u5B9A\u4E49\u7684cascadePath").concat(cascadePath, "\u4E0D\u80FD\u5B9A\u4F4D\u5230User\u5BF9\u8C61\u6216\u8005\u548CUser\u5173\u8054\u7684\u5173\u7CFB\u5BF9\u8C61\uFF0C \u8BF7\u4ED4\u7EC6\u68C0\u67E5"));
331
- }
332
- };
333
- var translateFilterMakerIter = function (entity, iter) {
334
- var relation = (0, relation_1.judgeRelation)(schema, entity, paths[iter]);
335
- if (iter === paths.length - 1) {
336
- if (relation === 2) {
337
- var filterMaker_1 = translateRelationFilter(paths[iter]);
338
- return function (userId) {
339
- var filter = filterMaker_1(userId);
340
- (0, assert_1.default)(filter.id);
341
- return {
342
- entity: paths[iter],
343
- entityId: filter.id,
344
- };
345
- };
346
- }
347
- (0, assert_1.default)(typeof relation === 'string');
348
- var filterMaker_2 = translateRelationFilter(relation);
349
- return function (userId) {
350
- var _a;
351
- var filter = filterMaker_2(userId);
352
- (0, assert_1.default)(filter.id);
353
- return _a = {},
354
- _a["".concat(paths[iter], "Id")] = filter.id,
355
- _a;
356
- };
357
- }
358
- else {
359
- var subFilterMaker_1 = translateFilterMakerIter(paths[iter], iter + 1);
360
- if (iter === 0) {
361
- return function (userId) {
362
- var _a;
363
- var subFilter = subFilterMaker_1(userId);
364
- return _a = {},
365
- _a[paths[iter]] = subFilter,
366
- _a;
367
- };
368
- }
369
- return function (userId) {
370
- var _a;
371
- return (_a = {},
372
- _a[paths[iter]] = subFilterMaker_1(userId),
373
- _a);
374
- };
375
- }
376
- };
377
- var filter = cascadePath ? translateFilterMakerIter(entity2, 0) : translateRelationFilter(entity2);
378
- return filter;
379
- }
380
- function translateActionAuthFilterMaker(schema, relationItem, entity) {
381
- if (relationItem instanceof Array) {
382
- var maker_1 = relationItem.map(function (ele) {
383
- if (ele instanceof Array) {
384
- return ele.map(function (ele2) { return translateCascadeRelationFilterMaker(schema, ele2, entity); });
385
- }
386
- return [translateCascadeRelationFilterMaker(schema, ele, entity)];
387
- });
388
- return function (userId) { return ({
389
- $or: maker_1.map(function (ele) { return ({
390
- $and: ele.map(function (ele2) { return ele2(userId); })
391
- }); })
392
- }); };
393
- }
394
- var filterMaker = translateCascadeRelationFilterMaker(schema, relationItem, entity);
395
- return function (userId) { return filterMaker(userId); };
396
- }
397
- /**
398
- * 根据权限定义,创建出相应的checker
399
- * @param schema
400
- * @param authDict
401
- * @returns
402
- */
403
- function createAuthCheckers(schema, authDict) {
404
- var checkers = [];
405
- var _loop_1 = function (entity) {
406
- var _a;
407
- if (authDict[entity]) {
408
- var _b = authDict[entity], relationAuth = _b.relationAuth, actionAuth = _b.actionAuth;
409
- if (relationAuth) {
410
- var raFilterMakerDict_1 = {};
411
- var userEntityName_1 = "user".concat((0, string_1.firstLetterUpperCase)(entity));
412
- for (var r in relationAuth) {
413
- Object.assign(raFilterMakerDict_1, (_a = {},
414
- _a[r] = translateActionAuthFilterMaker(schema, relationAuth[r], entity),
415
- _a));
416
- }
417
- var entityIdAttr_1 = "".concat(entity, "Id");
418
- checkers.push({
419
- entity: userEntityName_1,
420
- action: 'create',
421
- type: 'relation',
422
- relationFilter: function (operation, context) {
423
- var _a;
424
- var data = operation.data;
425
- (0, assert_1.default)(!(data instanceof Array));
426
- var _b = data, relation = _b.relation, _c = entityIdAttr_1, entityId = _b[_c];
427
- var userId = context.getCurrentUserId();
428
- if (!raFilterMakerDict_1[relation]) {
429
- return;
430
- }
431
- var filter = raFilterMakerDict_1[relation](userId);
432
- return _a = {},
433
- _a[entity] = filter,
434
- _a;
435
- },
436
- errMsg: '越权操作',
437
- });
438
- checkers.push({
439
- entity: userEntityName_1,
440
- action: 'remove',
441
- type: 'relation',
442
- relationFilter: function (operation, context) {
443
- var _a;
444
- var userId = context.getCurrentUserId();
445
- var filter = operation.filter;
446
- var makeFilterFromRows = function (rows) {
447
- var relations = (0, lodash_1.uniq)(rows.map(function (ele) { return ele.relation; }));
448
- var entityIds = (0, lodash_1.uniq)(rows.map(function (ele) { return ele[entityIdAttr_1]; }));
449
- (0, assert_1.default)(entityIds.length === 1, "\u5728\u56DE\u6536".concat(userEntityName_1, "\u4E0A\u6743\u9650\u65F6\uFF0C\u5355\u6B21\u56DE\u6536\u6D89\u53CA\u5230\u4E86\u4E0D\u540C\u7684\u5BF9\u8C61\uFF0C\u6B64\u64CD\u4F5C\u4E0D\u88AB\u5141\u8BB8"));
450
- // const entityId = entityIds[0]!;
451
- // 所有的relation条件要同时满足and关系(注意这里的filter翻译出来是在entity对象上,不是在userEntity对象上)
452
- return {
453
- $and: relations.map(function (relation) { return raFilterMakerDict_1[relation]; }).filter(function (ele) { return !!ele; }).map(function (ele) {
454
- var _a;
455
- return (_a = {},
456
- _a[entity] = ele(userId),
457
- _a);
458
- })
459
- };
460
- };
461
- var toBeRemoved = context.select(userEntityName_1, {
462
- data: (_a = {
463
- id: 1,
464
- relation: 1
465
- },
466
- _a[entityIdAttr_1] = 1,
467
- _a),
468
- filter: filter,
469
- }, { dontCollect: true });
470
- if (toBeRemoved instanceof Promise) {
471
- return toBeRemoved.then(function (rows) { return makeFilterFromRows(rows); });
472
- }
473
- return makeFilterFromRows(toBeRemoved);
474
- },
475
- errMsg: '越权操作',
476
- });
477
- // 转让权限现在用update动作,只允许update userId给其它人
478
- // todo 等实现的时候再写
479
- }
480
- if (actionAuth) {
481
- var _loop_2 = function (a) {
482
- var filterMaker = translateActionAuthFilterMaker(schema, actionAuth[a], entity);
483
- checkers.push({
484
- entity: entity,
485
- action: a,
486
- type: 'relation',
487
- relationFilter: function (operation, context) {
488
- // const { filter } = operation;
489
- var filter = filterMaker(context.getCurrentUserId());
490
- return filter;
491
- },
492
- errMsg: '定义的actionAuth中检查出来越权操作',
493
- });
494
- };
495
- for (var a in actionAuth) {
496
- _loop_2(a);
497
- }
498
- }
499
- }
500
- };
501
- for (var entity in schema) {
502
- _loop_1(entity);
503
- }
504
- return checkers;
505
- }
506
- exports.createAuthCheckers = createAuthCheckers;
507
- /**
508
- * 对对象的删除,检查其是否会产生其他行上的空指针,不允许这种情况的出现
509
- * @param schema
510
- * @returns
511
- * 如果有的对象允许删除,需要使用trigger来处理其相关联的外键对象,这些trigger写作before,则会在checker之前执行,仍然可以删除成功
512
- */
513
- function createRemoveCheckers(schema, authDict) {
514
- var e_1, _a;
515
- var checkers = [];
516
- // 先建立所有的一对多的关系
517
- var OneToManyMatrix = {};
518
- var OneToManyOnEntityMatrix = {};
519
- var addToMto = function (e, f, attr) {
520
- var _a;
521
- if (OneToManyMatrix[f]) {
522
- (_a = OneToManyMatrix[f]) === null || _a === void 0 ? void 0 : _a.push([e, attr]);
523
- }
524
- else {
525
- OneToManyMatrix[f] = [[e, attr]];
526
- }
527
- };
528
- var addToMtoEntity = function (e, fs) {
529
- var e_2, _a;
530
- var _b;
531
- try {
532
- for (var fs_1 = tslib_1.__values(fs), fs_1_1 = fs_1.next(); !fs_1_1.done; fs_1_1 = fs_1.next()) {
533
- var f = fs_1_1.value;
534
- if (!OneToManyOnEntityMatrix[f]) {
535
- OneToManyOnEntityMatrix[f] = [e];
536
- }
537
- else {
538
- (_b = OneToManyOnEntityMatrix[f]) === null || _b === void 0 ? void 0 : _b.push(e);
539
- }
540
- }
541
- }
542
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
543
- finally {
544
- try {
545
- if (fs_1_1 && !fs_1_1.done && (_a = fs_1.return)) _a.call(fs_1);
546
- }
547
- finally { if (e_2) throw e_2.error; }
548
- }
549
- };
550
- for (var entity in schema) {
551
- if (['operEntity', 'modiEntity', 'userEntityGrant'].includes(entity)) {
552
- continue; // 系统功能性数据,不用处理
553
- }
554
- var attributes = schema[entity].attributes;
555
- for (var attr in attributes) {
556
- if (attributes[attr].type === 'ref') {
557
- addToMto(entity, attributes[attr].ref, attr);
558
- }
559
- else if (attr === 'entity') {
560
- if (attributes[attr].ref) {
561
- addToMtoEntity(entity, attributes[attr].ref);
562
- }
563
- else if (process.env.NODE_ENV === 'development') {
564
- console.warn("".concat(entity, "\u7684entity\u53CD\u6307\u6307\u9488\u627E\u4E0D\u5230\u6709\u6548\u7684\u5BF9\u8C61"));
565
- }
566
- }
567
- }
568
- }
569
- // 当删除一时,要确认多上面没有指向一的数据
570
- var entities = (0, lodash_1.union)(Object.keys(OneToManyMatrix), Object.keys(OneToManyOnEntityMatrix));
571
- var _loop_3 = function (entity) {
572
- checkers.push({
573
- entity: entity,
574
- action: 'remove',
575
- type: 'logical',
576
- checker: function (operation, context, option) {
577
- var e_3, _a, e_4, _b;
578
- var promises = [];
579
- if (OneToManyMatrix[entity]) {
580
- var _loop_5 = function (otm) {
581
- var _g, _h, _j, _k;
582
- var _l = tslib_1.__read(otm, 2), e = _l[0], attr = _l[1];
583
- var proj = (_g = {
584
- id: 1
585
- },
586
- _g[attr] = 1,
587
- _g);
588
- var filter = operation.filter && (_h = {},
589
- _h[attr.slice(0, attr.length - 2)] = operation.filter,
590
- _h);
591
- var result = context.select(e, {
592
- data: proj,
593
- filter: filter,
594
- indexFrom: 0,
595
- count: 1
596
- }, { dontCollect: true });
597
- if (result instanceof Promise) {
598
- promises.push(result.then(function (_a) {
599
- var _b, _c;
600
- var _d = tslib_1.__read(_a, 1), row = _d[0];
601
- if (row) {
602
- var record = {
603
- a: 's',
604
- d: (_b = {},
605
- _b[e] = (_c = {},
606
- _c[row.id] = row,
607
- _c),
608
- _b)
609
- };
610
- throw new Exception_1.OakRowInconsistencyException(record, "\u60A8\u65E0\u6CD5\u5220\u9664\u5B58\u5728\u6709\u6548\u6570\u636E\u300C".concat(e, "\u300D\u5173\u8054\u7684\u884C"));
611
- }
612
- }));
613
- }
614
- else {
615
- var _m = tslib_1.__read(result, 1), row = _m[0];
616
- if (row) {
617
- var record = {
618
- a: 's',
619
- d: (_j = {},
620
- _j[e] = (_k = {},
621
- _k[row.id] = row,
622
- _k),
623
- _j)
624
- };
625
- throw new Exception_1.OakRowInconsistencyException(record, "\u60A8\u65E0\u6CD5\u5220\u9664\u5B58\u5728\u6709\u6548\u6570\u636E\u300C".concat(e, "\u300D\u5173\u8054\u7684\u884C"));
626
- }
627
- }
628
- };
629
- try {
630
- for (var _c = (e_3 = void 0, tslib_1.__values(OneToManyMatrix[entity])), _d = _c.next(); !_d.done; _d = _c.next()) {
631
- var otm = _d.value;
632
- _loop_5(otm);
633
- }
634
- }
635
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
636
- finally {
637
- try {
638
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
639
- }
640
- finally { if (e_3) throw e_3.error; }
641
- }
642
- }
643
- if (OneToManyOnEntityMatrix[entity]) {
644
- var _loop_6 = function (otm) {
645
- var _o, _p, _q;
646
- var proj = {
647
- id: 1,
648
- entity: 1,
649
- entityId: 1,
650
- };
651
- var filter = operation.filter && (_o = {},
652
- _o[entity] = operation.filter,
653
- _o);
654
- var result = context.select(otm, {
655
- data: proj,
656
- filter: filter,
657
- indexFrom: 0,
658
- count: 1
659
- }, { dontCollect: true });
660
- if (result instanceof Promise) {
661
- promises.push(result.then(function (_a) {
662
- var _b, _c;
663
- var _d = tslib_1.__read(_a, 1), row = _d[0];
664
- if (row) {
665
- var record = {
666
- a: 's',
667
- d: (_b = {},
668
- _b[otm] = (_c = {},
669
- _c[row.id] = row,
670
- _c),
671
- _b)
672
- };
673
- throw new Exception_1.OakRowInconsistencyException(record, "\u60A8\u65E0\u6CD5\u5220\u9664\u5B58\u5728\u6709\u6548\u6570\u636E\u300C".concat(otm, "\u300D\u5173\u8054\u7684\u884C"));
674
- }
675
- }));
676
- }
677
- else {
678
- var _r = tslib_1.__read(result, 1), row = _r[0];
679
- if (row) {
680
- var record = {
681
- a: 's',
682
- d: (_p = {},
683
- _p[otm] = (_q = {},
684
- _q[row.id] = row,
685
- _q),
686
- _p)
687
- };
688
- throw new Exception_1.OakRowInconsistencyException(record, "\u60A8\u65E0\u6CD5\u5220\u9664\u5B58\u5728\u6709\u6548\u6570\u636E\u300C".concat(otm, "\u300D\u5173\u8054\u7684\u884C"));
689
- }
690
- }
691
- };
692
- try {
693
- for (var _e = (e_4 = void 0, tslib_1.__values(OneToManyOnEntityMatrix[entity])), _f = _e.next(); !_f.done; _f = _e.next()) {
694
- var otm = _f.value;
695
- _loop_6(otm);
696
- }
697
- }
698
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
699
- finally {
700
- try {
701
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
702
- }
703
- finally { if (e_4) throw e_4.error; }
704
- }
705
- }
706
- if (promises.length > 0) {
707
- return Promise.all(promises).then(function () { return undefined; });
708
- }
709
- }
710
- });
711
- };
712
- try {
713
- for (var entities_1 = tslib_1.__values(entities), entities_1_1 = entities_1.next(); !entities_1_1.done; entities_1_1 = entities_1.next()) {
714
- var entity = entities_1_1.value;
715
- _loop_3(entity);
716
- }
717
- }
718
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
719
- finally {
720
- try {
721
- if (entities_1_1 && !entities_1_1.done && (_a = entities_1.return)) _a.call(entities_1);
722
- }
723
- finally { if (e_1) throw e_1.error; }
724
- }
725
- var _loop_4 = function (entity) {
726
- var e_5, _b;
727
- var cascadeRemove = authDict[entity].cascadeRemove;
728
- if (cascadeRemove) {
729
- var entitiesOnEntityAttr = [];
730
- var hasAllEntity = false;
731
- var _loop_7 = function (attr) {
732
- if (attr === '@entity') {
733
- hasAllEntity = true;
734
- return "continue";
735
- }
736
- var rel = (0, relation_1.judgeRelation)(schema, entity, attr);
737
- if (rel === 2) {
738
- entitiesOnEntityAttr.push(attr);
739
- checkers.push({
740
- entity: attr,
741
- action: 'remove',
742
- type: 'logical',
743
- priority: types_1.REMOVE_CASCADE_PRIORITY,
744
- checker: function (operation, context) {
745
- var _a, _b;
746
- var filter = operation.filter;
747
- if (cascadeRemove[attr] === 'remove') {
748
- return context.operate(entity, {
749
- id: (0, uuid_1.generateNewId)(),
750
- action: 'remove',
751
- data: {},
752
- filter: filter ? (_a = {},
753
- _a[attr] = filter,
754
- _a) : undefined,
755
- }, { dontCollect: true });
756
- }
757
- return context.operate(entity, {
758
- id: (0, uuid_1.generateNewId)(),
759
- action: 'update',
760
- data: {
761
- entity: null,
762
- entityId: null,
763
- },
764
- filter: filter ? (_b = {},
765
- _b[attr] = filter,
766
- _b) : undefined,
767
- }, { dontCollect: true });
768
- }
769
- });
770
- }
771
- else {
772
- (0, assert_1.default)(typeof rel === 'string');
773
- checkers.push({
774
- entity: rel,
775
- action: 'remove',
776
- type: 'logical',
777
- priority: types_1.REMOVE_CASCADE_PRIORITY,
778
- checker: function (operation, context) {
779
- var _a, _b, _c;
780
- var filter = operation.filter;
781
- if (cascadeRemove[attr] === 'remove') {
782
- return context.operate(entity, {
783
- id: (0, uuid_1.generateNewId)(),
784
- action: 'remove',
785
- data: {},
786
- filter: filter ? (_a = {},
787
- _a[attr] = filter,
788
- _a) : undefined,
789
- }, { dontCollect: true });
790
- }
791
- return context.operate(entity, {
792
- id: (0, uuid_1.generateNewId)(),
793
- action: 'update',
794
- data: (_b = {},
795
- _b["".concat(attr, "Id")] = null,
796
- _b),
797
- filter: filter ? (_c = {},
798
- _c[attr] = filter,
799
- _c) : undefined,
800
- }, { dontCollect: true });
801
- }
802
- });
803
- }
804
- };
805
- for (var attr in cascadeRemove) {
806
- _loop_7(attr);
807
- }
808
- if (hasAllEntity) {
809
- var attributes = schema[entity].attributes;
810
- var ref = attributes.entity.ref;
811
- var restEntities = (0, lodash_1.difference)(ref, entitiesOnEntityAttr);
812
- var _loop_8 = function (e) {
813
- checkers.push({
814
- entity: e,
815
- action: 'remove',
816
- type: 'logical',
817
- priority: types_1.REMOVE_CASCADE_PRIORITY,
818
- checker: function (operation, context) {
819
- var _a, _b;
820
- var filter = operation.filter;
821
- if (cascadeRemove['@entity'] === 'remove') {
822
- return context.operate(entity, {
823
- id: (0, uuid_1.generateNewId)(),
824
- action: 'remove',
825
- data: {},
826
- filter: filter ? (_a = {},
827
- _a[e] = filter,
828
- _a) : undefined,
829
- }, { dontCollect: true });
830
- }
831
- return context.operate(entity, {
832
- id: (0, uuid_1.generateNewId)(),
833
- action: 'update',
834
- data: {
835
- entity: null,
836
- entityId: null,
837
- },
838
- filter: filter ? (_b = {},
839
- _b[e] = filter,
840
- _b) : undefined,
841
- }, { dontCollect: true });
842
- }
843
- });
844
- };
845
- try {
846
- for (var restEntities_1 = (e_5 = void 0, tslib_1.__values(restEntities)), restEntities_1_1 = restEntities_1.next(); !restEntities_1_1.done; restEntities_1_1 = restEntities_1.next()) {
847
- var e = restEntities_1_1.value;
848
- _loop_8(e);
849
- }
850
- }
851
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
852
- finally {
853
- try {
854
- if (restEntities_1_1 && !restEntities_1_1.done && (_b = restEntities_1.return)) _b.call(restEntities_1);
855
- }
856
- finally { if (e_5) throw e_5.error; }
857
- }
858
- }
859
- }
860
- };
861
- // 注入声明的cascade删除时的外键处理动作
862
- for (var entity in authDict) {
863
- _loop_4(entity);
864
- }
865
- return checkers;
866
- }
867
- exports.createRemoveCheckers = createRemoveCheckers;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRemoveCheckers = exports.createAuthCheckers = exports.translateCheckerInSyncContext = exports.translateCheckerInAsyncContext = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var assert_1 = tslib_1.__importDefault(require("assert"));
6
+ var filter_1 = require("../store/filter");
7
+ var Exception_1 = require("../types/Exception");
8
+ var types_1 = require("../types");
9
+ var actionDef_1 = require("./actionDef");
10
+ var string_1 = require("../utils/string");
11
+ var lodash_1 = require("../utils/lodash");
12
+ var relation_1 = require("./relation");
13
+ var uuid_1 = require("../utils/uuid");
14
+ function translateCheckerInAsyncContext(checker) {
15
+ var _this = this;
16
+ var entity = checker.entity, type = checker.type, action = checker.action;
17
+ var when = ((action === 'create' || action instanceof Array && action.includes('create')) && ['relation'].includes(type)) ? 'after' : 'before';
18
+ switch (type) {
19
+ case 'data': {
20
+ var checkerFn_1 = checker.checker;
21
+ var fn = (function (_a, context) {
22
+ var operation = _a.operation;
23
+ return tslib_1.__awaiter(_this, void 0, void 0, function () {
24
+ var data;
25
+ return tslib_1.__generator(this, function (_b) {
26
+ switch (_b.label) {
27
+ case 0:
28
+ data = operation.data;
29
+ return [4 /*yield*/, checkerFn_1(data, context)];
30
+ case 1:
31
+ _b.sent();
32
+ return [2 /*return*/, 0];
33
+ }
34
+ });
35
+ });
36
+ });
37
+ return {
38
+ fn: fn,
39
+ when: when,
40
+ };
41
+ }
42
+ case 'row': {
43
+ var filter_2 = checker.filter, errMsg_1 = checker.errMsg, inconsistentRows_1 = checker.inconsistentRows;
44
+ var fn = (function (_a, context, option) {
45
+ var operation = _a.operation;
46
+ return tslib_1.__awaiter(_this, void 0, void 0, function () {
47
+ var operationFilter, action, filter2, _b, entity2, selection2, rows2, e, rows2, e;
48
+ return tslib_1.__generator(this, function (_c) {
49
+ switch (_c.label) {
50
+ case 0:
51
+ operationFilter = operation.filter, action = operation.action;
52
+ if (!(typeof filter_2 === 'function')) return [3 /*break*/, 2];
53
+ return [4 /*yield*/, filter_2(operation, context, option)];
54
+ case 1:
55
+ _b = _c.sent();
56
+ return [3 /*break*/, 3];
57
+ case 2:
58
+ _b = filter_2;
59
+ _c.label = 3;
60
+ case 3:
61
+ filter2 = _b;
62
+ if (!['select', 'count', 'stat'].includes(action)) return [3 /*break*/, 4];
63
+ operation.filter = (0, filter_1.addFilterSegment)(operationFilter || {}, filter2);
64
+ return [2 /*return*/, 0];
65
+ case 4: return [4 /*yield*/, (0, filter_1.checkFilterContains)(entity, context, filter2, operationFilter || {}, true)];
66
+ case 5:
67
+ if (_c.sent()) {
68
+ return [2 /*return*/, 0];
69
+ }
70
+ if (!inconsistentRows_1) return [3 /*break*/, 7];
71
+ entity2 = inconsistentRows_1.entity, selection2 = inconsistentRows_1.selection;
72
+ return [4 /*yield*/, context.select(entity2, selection2(operationFilter), {
73
+ dontCollect: true,
74
+ blockTrigger: true,
75
+ })];
76
+ case 6:
77
+ rows2 = _c.sent();
78
+ e = new Exception_1.OakRowInconsistencyException(undefined, errMsg_1);
79
+ e.addData(entity2, rows2);
80
+ throw e;
81
+ case 7: return [4 /*yield*/, context.select(entity, {
82
+ data: (0, actionDef_1.getFullProjection)(entity, context.getSchema()),
83
+ filter: Object.assign({}, operationFilter, {
84
+ $not: filter2,
85
+ })
86
+ }, {
87
+ dontCollect: true,
88
+ blockTrigger: true,
89
+ })];
90
+ case 8:
91
+ rows2 = _c.sent();
92
+ e = new Exception_1.OakRowInconsistencyException(undefined, errMsg_1);
93
+ e.addData(entity, rows2);
94
+ throw e;
95
+ }
96
+ });
97
+ });
98
+ });
99
+ return {
100
+ fn: fn,
101
+ when: when,
102
+ };
103
+ }
104
+ case 'relation': {
105
+ var relationFilter_1 = checker.relationFilter, errMsg_2 = checker.errMsg;
106
+ var fn = (function (_a, context, option) {
107
+ var operation = _a.operation;
108
+ return tslib_1.__awaiter(_this, void 0, void 0, function () {
109
+ var filter2, data, filter, _b, _c, _d;
110
+ return tslib_1.__generator(this, function (_e) {
111
+ switch (_e.label) {
112
+ case 0:
113
+ if (context.isRoot()) {
114
+ return [2 /*return*/, 0];
115
+ }
116
+ if (!(operation.action === 'create')) return [3 /*break*/, 3];
117
+ return [4 /*yield*/, relationFilter_1(operation, context, option)];
118
+ case 1:
119
+ filter2 = _e.sent();
120
+ data = operation.data;
121
+ filter = data instanceof Array ? {
122
+ id: {
123
+ $in: data.map(function (ele) { return ele.id; }),
124
+ },
125
+ } : {
126
+ id: data.id,
127
+ };
128
+ return [4 /*yield*/, (0, filter_1.checkFilterContains)(entity, context, filter2, filter, true)];
129
+ case 2:
130
+ if (_e.sent()) {
131
+ return [2 /*return*/, 0];
132
+ }
133
+ throw new Exception_1.OakUserUnpermittedException(errMsg_2);
134
+ case 3:
135
+ _b = operation;
136
+ _c = filter_1.combineFilters;
137
+ _d = [operation.filter];
138
+ return [4 /*yield*/, relationFilter_1(operation, context, option)];
139
+ case 4:
140
+ _b.filter = _c.apply(void 0, [_d.concat([_e.sent()])]);
141
+ _e.label = 5;
142
+ case 5: return [2 /*return*/, 0];
143
+ }
144
+ });
145
+ });
146
+ });
147
+ return {
148
+ fn: fn,
149
+ when: when,
150
+ };
151
+ }
152
+ case 'logical':
153
+ case 'logicalRelation': {
154
+ var checkerFn_2 = checker.checker;
155
+ var fn = (function (_a, context, option) {
156
+ var operation = _a.operation;
157
+ return tslib_1.__awaiter(_this, void 0, void 0, function () {
158
+ return tslib_1.__generator(this, function (_b) {
159
+ switch (_b.label) {
160
+ case 0:
161
+ if (context.isRoot() && type === 'logicalRelation') {
162
+ return [2 /*return*/, 0];
163
+ }
164
+ return [4 /*yield*/, checkerFn_2(operation, context, option)];
165
+ case 1:
166
+ _b.sent();
167
+ return [2 /*return*/, 0];
168
+ }
169
+ });
170
+ });
171
+ });
172
+ return {
173
+ fn: fn,
174
+ when: when,
175
+ };
176
+ }
177
+ default: {
178
+ (0, assert_1.default)(false);
179
+ }
180
+ }
181
+ }
182
+ exports.translateCheckerInAsyncContext = translateCheckerInAsyncContext;
183
+ function translateCheckerInSyncContext(checker) {
184
+ var entity = checker.entity, type = checker.type, action = checker.action;
185
+ var when = ((action === 'create' || action instanceof Array && action.includes('create')) && ['relation'].includes(type)) ? 'after' : 'before';
186
+ switch (type) {
187
+ case 'data': {
188
+ var checkerFn_3 = checker.checker;
189
+ var fn = function (operation, context) { return checkerFn_3(operation.data, context); };
190
+ return {
191
+ fn: fn,
192
+ when: when,
193
+ };
194
+ }
195
+ case 'row': {
196
+ var filter_3 = checker.filter, errMsg_3 = checker.errMsg;
197
+ var fn = function (operation, context, option) {
198
+ var operationFilter = operation.filter, action = operation.action;
199
+ var filter2 = typeof filter_3 === 'function' ? filter_3(operation, context, option) : filter_3;
200
+ (0, assert_1.default)(operationFilter);
201
+ if (['select', 'count', 'stat'].includes(action)) {
202
+ operation.filter = (0, filter_1.addFilterSegment)(operationFilter, filter2);
203
+ return 0;
204
+ }
205
+ else {
206
+ (0, assert_1.default)(!(filter2 instanceof Promise));
207
+ if ((0, filter_1.checkFilterContains)(entity, context, filter2, operationFilter, true)) {
208
+ return;
209
+ }
210
+ var e = new Exception_1.OakRowInconsistencyException(undefined, errMsg_3);
211
+ throw e;
212
+ }
213
+ };
214
+ return {
215
+ fn: fn,
216
+ when: when,
217
+ };
218
+ }
219
+ case 'relation': {
220
+ var relationFilter_2 = checker.relationFilter, errMsg_4 = checker.errMsg;
221
+ var fn = function (operation, context, option) {
222
+ if (context.isRoot()) {
223
+ return;
224
+ }
225
+ var filter2 = typeof relationFilter_2 === 'function' ? relationFilter_2(operation, context, option) : relationFilter_2;
226
+ var filter = operation.filter, action = operation.action;
227
+ var filter3 = filter;
228
+ if (action === 'create') {
229
+ var data = operation.data;
230
+ filter3 = data instanceof Array ? {
231
+ id: {
232
+ $in: data.map(function (ele) { return ele.id; }),
233
+ },
234
+ } : { id: data.id };
235
+ }
236
+ (0, assert_1.default)(filter3);
237
+ (0, assert_1.default)(!(filter2 instanceof Promise));
238
+ if ((0, filter_1.checkFilterContains)(entity, context, filter2, filter3, true)) {
239
+ return;
240
+ }
241
+ throw new Exception_1.OakUserUnpermittedException(errMsg_4);
242
+ };
243
+ return {
244
+ fn: fn,
245
+ when: when,
246
+ };
247
+ }
248
+ case 'logical':
249
+ case 'logicalRelation': {
250
+ var checkerFn_4 = checker.checker;
251
+ var fn = function (operation, context, option) {
252
+ if (context.isRoot() && type === 'logicalRelation') {
253
+ return;
254
+ }
255
+ checkerFn_4(operation, context, option);
256
+ };
257
+ return {
258
+ fn: fn,
259
+ when: when,
260
+ };
261
+ }
262
+ default: {
263
+ (0, assert_1.default)(false);
264
+ }
265
+ }
266
+ }
267
+ exports.translateCheckerInSyncContext = translateCheckerInSyncContext;
268
+ function translateCascadeRelationFilterMaker(schema, lch, entity2) {
269
+ var cascadePath = lch.cascadePath, relations = lch.relations;
270
+ var paths = cascadePath.split('.');
271
+ var translateRelationFilter = function (entity) {
272
+ // 有两种情况,此entity和user有Relation定义,或是此entity已经指向user
273
+ if (entity === 'user') {
274
+ return function (userId) { return ({
275
+ id: userId,
276
+ }); };
277
+ }
278
+ else if (schema[entity].relation) {
279
+ if (relations) {
280
+ var diff = (0, lodash_1.difference)(relations, schema[entity].relation);
281
+ if (diff.length > 0) {
282
+ throw new Error("".concat(entity2, "\u4E0A\u67D0auth\u5B9A\u4E49\u7684relations\u4E2D\u542B\u6709\u4E0D\u53EF\u8BC6\u522B\u7684\u5173\u7CFB\u5B9A\u4E49").concat(diff.join(','), "\uFF0C \u8BF7\u4ED4\u7EC6\u68C0\u67E5"));
283
+ }
284
+ }
285
+ var relationEntityName_1 = "user".concat((0, string_1.firstLetterUpperCase)(entity));
286
+ return function (userId) {
287
+ var _a;
288
+ var filter = relations ? {
289
+ userId: userId,
290
+ relation: {
291
+ $in: relations,
292
+ },
293
+ } : {
294
+ userId: userId,
295
+ };
296
+ return {
297
+ id: {
298
+ $in: {
299
+ entity: relationEntityName_1,
300
+ data: (_a = {},
301
+ _a["".concat(entity, "Id")] = 1,
302
+ _a),
303
+ filter: filter,
304
+ },
305
+ },
306
+ };
307
+ };
308
+ }
309
+ else {
310
+ (0, assert_1.default)(false, "".concat(entity2, "\u4E0A\u67D0auth\u5B9A\u4E49\u7684cascadePath").concat(cascadePath, "\u4E0D\u80FD\u5B9A\u4F4D\u5230User\u5BF9\u8C61\u6216\u8005\u548CUser\u5173\u8054\u7684\u5173\u7CFB\u5BF9\u8C61\uFF0C \u8BF7\u4ED4\u7EC6\u68C0\u67E5"));
311
+ }
312
+ };
313
+ var translateFilterMakerIter = function (entity, iter) {
314
+ var relation = (0, relation_1.judgeRelation)(schema, entity, paths[iter]);
315
+ if (iter === paths.length - 1) {
316
+ if (relation === 2) {
317
+ var filterMaker_1 = translateRelationFilter(paths[iter]);
318
+ return function (userId) {
319
+ var filter = filterMaker_1(userId);
320
+ (0, assert_1.default)(filter.id);
321
+ return {
322
+ entity: paths[iter],
323
+ entityId: filter.id,
324
+ };
325
+ };
326
+ }
327
+ (0, assert_1.default)(typeof relation === 'string');
328
+ var filterMaker_2 = translateRelationFilter(relation);
329
+ return function (userId) {
330
+ var _a;
331
+ var filter = filterMaker_2(userId);
332
+ (0, assert_1.default)(filter.id);
333
+ return _a = {},
334
+ _a["".concat(paths[iter], "Id")] = filter.id,
335
+ _a;
336
+ };
337
+ }
338
+ else {
339
+ var subFilterMaker_1 = translateFilterMakerIter(paths[iter], iter + 1);
340
+ if (iter === 0) {
341
+ return function (userId) {
342
+ var _a;
343
+ var subFilter = subFilterMaker_1(userId);
344
+ return _a = {},
345
+ _a[paths[iter]] = subFilter,
346
+ _a;
347
+ };
348
+ }
349
+ return function (userId) {
350
+ var _a;
351
+ return (_a = {},
352
+ _a[paths[iter]] = subFilterMaker_1(userId),
353
+ _a);
354
+ };
355
+ }
356
+ };
357
+ var filter = cascadePath ? translateFilterMakerIter(entity2, 0) : translateRelationFilter(entity2);
358
+ return filter;
359
+ }
360
+ function translateActionAuthFilterMaker(schema, relationItem, entity) {
361
+ if (relationItem instanceof Array) {
362
+ var maker_1 = relationItem.map(function (ele) {
363
+ if (ele instanceof Array) {
364
+ return ele.map(function (ele2) { return translateCascadeRelationFilterMaker(schema, ele2, entity); });
365
+ }
366
+ return [translateCascadeRelationFilterMaker(schema, ele, entity)];
367
+ });
368
+ return function (userId) { return ({
369
+ $or: maker_1.map(function (ele) { return ({
370
+ $and: ele.map(function (ele2) { return ele2(userId); })
371
+ }); })
372
+ }); };
373
+ }
374
+ var filterMaker = translateCascadeRelationFilterMaker(schema, relationItem, entity);
375
+ return function (userId) { return filterMaker(userId); };
376
+ }
377
+ /**
378
+ * 根据权限定义,创建出相应的checker
379
+ * @param schema
380
+ * @param authDict
381
+ * @returns
382
+ */
383
+ function createAuthCheckers(schema, authDict) {
384
+ var checkers = [];
385
+ var _loop_1 = function (entity) {
386
+ var _a;
387
+ if (authDict[entity]) {
388
+ var _b = authDict[entity], relationAuth = _b.relationAuth, actionAuth = _b.actionAuth;
389
+ if (relationAuth) {
390
+ var raFilterMakerDict_1 = {};
391
+ var userEntityName_1 = "user".concat((0, string_1.firstLetterUpperCase)(entity));
392
+ for (var r in relationAuth) {
393
+ Object.assign(raFilterMakerDict_1, (_a = {},
394
+ _a[r] = translateActionAuthFilterMaker(schema, relationAuth[r], entity),
395
+ _a));
396
+ }
397
+ var entityIdAttr_1 = "".concat(entity, "Id");
398
+ checkers.push({
399
+ entity: userEntityName_1,
400
+ action: 'create',
401
+ type: 'relation',
402
+ relationFilter: function (operation, context) {
403
+ var _a;
404
+ var data = operation.data;
405
+ (0, assert_1.default)(!(data instanceof Array));
406
+ var _b = data, relation = _b.relation, _c = entityIdAttr_1, entityId = _b[_c];
407
+ var userId = context.getCurrentUserId();
408
+ if (!raFilterMakerDict_1[relation]) {
409
+ return;
410
+ }
411
+ var filter = raFilterMakerDict_1[relation](userId);
412
+ return _a = {},
413
+ _a[entity] = filter,
414
+ _a;
415
+ },
416
+ errMsg: '越权操作',
417
+ });
418
+ checkers.push({
419
+ entity: userEntityName_1,
420
+ action: 'remove',
421
+ type: 'relation',
422
+ relationFilter: function (operation, context) {
423
+ var _a;
424
+ var userId = context.getCurrentUserId();
425
+ var filter = operation.filter;
426
+ var makeFilterFromRows = function (rows) {
427
+ var relations = (0, lodash_1.uniq)(rows.map(function (ele) { return ele.relation; }));
428
+ var entityIds = (0, lodash_1.uniq)(rows.map(function (ele) { return ele[entityIdAttr_1]; }));
429
+ (0, assert_1.default)(entityIds.length === 1, "\u5728\u56DE\u6536".concat(userEntityName_1, "\u4E0A\u6743\u9650\u65F6\uFF0C\u5355\u6B21\u56DE\u6536\u6D89\u53CA\u5230\u4E86\u4E0D\u540C\u7684\u5BF9\u8C61\uFF0C\u6B64\u64CD\u4F5C\u4E0D\u88AB\u5141\u8BB8"));
430
+ // const entityId = entityIds[0]!;
431
+ // 所有的relation条件要同时满足and关系(注意这里的filter翻译出来是在entity对象上,不是在userEntity对象上)
432
+ return {
433
+ $and: relations.map(function (relation) { return raFilterMakerDict_1[relation]; }).filter(function (ele) { return !!ele; }).map(function (ele) {
434
+ var _a;
435
+ return (_a = {},
436
+ _a[entity] = ele(userId),
437
+ _a);
438
+ })
439
+ };
440
+ };
441
+ var toBeRemoved = context.select(userEntityName_1, {
442
+ data: (_a = {
443
+ id: 1,
444
+ relation: 1
445
+ },
446
+ _a[entityIdAttr_1] = 1,
447
+ _a),
448
+ filter: filter,
449
+ }, { dontCollect: true });
450
+ if (toBeRemoved instanceof Promise) {
451
+ return toBeRemoved.then(function (rows) { return makeFilterFromRows(rows); });
452
+ }
453
+ return makeFilterFromRows(toBeRemoved);
454
+ },
455
+ errMsg: '越权操作',
456
+ });
457
+ // 转让权限现在用update动作,只允许update userId给其它人
458
+ // todo 等实现的时候再写
459
+ }
460
+ if (actionAuth) {
461
+ var _loop_2 = function (a) {
462
+ var filterMaker = translateActionAuthFilterMaker(schema, actionAuth[a], entity);
463
+ checkers.push({
464
+ entity: entity,
465
+ action: a,
466
+ type: 'relation',
467
+ relationFilter: function (operation, context) {
468
+ // const { filter } = operation;
469
+ var filter = filterMaker(context.getCurrentUserId());
470
+ return filter;
471
+ },
472
+ errMsg: '定义的actionAuth中检查出来越权操作',
473
+ });
474
+ };
475
+ for (var a in actionAuth) {
476
+ _loop_2(a);
477
+ }
478
+ }
479
+ }
480
+ };
481
+ for (var entity in schema) {
482
+ _loop_1(entity);
483
+ }
484
+ return checkers;
485
+ }
486
+ exports.createAuthCheckers = createAuthCheckers;
487
+ /**
488
+ * 对对象的删除,检查其是否会产生其他行上的空指针,不允许这种情况的出现
489
+ * @param schema
490
+ * @returns
491
+ * 如果有的对象允许删除,需要使用trigger来处理其相关联的外键对象,这些trigger写作before,则会在checker之前执行,仍然可以删除成功
492
+ */
493
+ function createRemoveCheckers(schema, authDict) {
494
+ var e_1, _a;
495
+ var checkers = [];
496
+ // 先建立所有的一对多的关系
497
+ var OneToManyMatrix = {};
498
+ var OneToManyOnEntityMatrix = {};
499
+ var addToMto = function (e, f, attr) {
500
+ var _a;
501
+ if (OneToManyMatrix[f]) {
502
+ (_a = OneToManyMatrix[f]) === null || _a === void 0 ? void 0 : _a.push([e, attr]);
503
+ }
504
+ else {
505
+ OneToManyMatrix[f] = [[e, attr]];
506
+ }
507
+ };
508
+ var addToMtoEntity = function (e, fs) {
509
+ var e_2, _a;
510
+ var _b;
511
+ try {
512
+ for (var fs_1 = tslib_1.__values(fs), fs_1_1 = fs_1.next(); !fs_1_1.done; fs_1_1 = fs_1.next()) {
513
+ var f = fs_1_1.value;
514
+ if (!OneToManyOnEntityMatrix[f]) {
515
+ OneToManyOnEntityMatrix[f] = [e];
516
+ }
517
+ else {
518
+ (_b = OneToManyOnEntityMatrix[f]) === null || _b === void 0 ? void 0 : _b.push(e);
519
+ }
520
+ }
521
+ }
522
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
523
+ finally {
524
+ try {
525
+ if (fs_1_1 && !fs_1_1.done && (_a = fs_1.return)) _a.call(fs_1);
526
+ }
527
+ finally { if (e_2) throw e_2.error; }
528
+ }
529
+ };
530
+ for (var entity in schema) {
531
+ if (['operEntity', 'modiEntity', 'userEntityGrant'].includes(entity)) {
532
+ continue; // 系统功能性数据,不用处理
533
+ }
534
+ var attributes = schema[entity].attributes;
535
+ for (var attr in attributes) {
536
+ if (attributes[attr].type === 'ref') {
537
+ addToMto(entity, attributes[attr].ref, attr);
538
+ }
539
+ else if (attr === 'entity') {
540
+ if (attributes[attr].ref) {
541
+ addToMtoEntity(entity, attributes[attr].ref);
542
+ }
543
+ else if (process.env.NODE_ENV === 'development') {
544
+ console.warn("".concat(entity, "\u7684entity\u53CD\u6307\u6307\u9488\u627E\u4E0D\u5230\u6709\u6548\u7684\u5BF9\u8C61"));
545
+ }
546
+ }
547
+ }
548
+ }
549
+ // 当删除一时,要确认多上面没有指向一的数据
550
+ var entities = (0, lodash_1.union)(Object.keys(OneToManyMatrix), Object.keys(OneToManyOnEntityMatrix));
551
+ var _loop_3 = function (entity) {
552
+ checkers.push({
553
+ entity: entity,
554
+ action: 'remove',
555
+ type: 'logical',
556
+ checker: function (operation, context, option) {
557
+ var e_3, _a, e_4, _b;
558
+ var promises = [];
559
+ if (OneToManyMatrix[entity]) {
560
+ var _loop_5 = function (otm) {
561
+ var _g, _h;
562
+ var _j = tslib_1.__read(otm, 2), e = _j[0], attr = _j[1];
563
+ var proj = (_g = {
564
+ id: 1
565
+ },
566
+ _g[attr] = 1,
567
+ _g);
568
+ var filter = operation.filter && (_h = {},
569
+ _h[attr.slice(0, attr.length - 2)] = operation.filter,
570
+ _h);
571
+ var result = context.select(e, {
572
+ data: proj,
573
+ filter: filter,
574
+ indexFrom: 0,
575
+ count: 1
576
+ }, { dontCollect: true });
577
+ if (result instanceof Promise) {
578
+ promises.push(result.then(function (_a) {
579
+ var _b = tslib_1.__read(_a, 1), row = _b[0];
580
+ if (row) {
581
+ var err = new Exception_1.OakRowInconsistencyException(undefined, "\u60A8\u65E0\u6CD5\u5220\u9664\u5B58\u5728\u6709\u6548\u6570\u636E\u300C".concat(e, "\u300D\u5173\u8054\u7684\u884C"));
582
+ err.addData(e, [row]);
583
+ throw err;
584
+ }
585
+ }));
586
+ }
587
+ else {
588
+ var _k = tslib_1.__read(result, 1), row = _k[0];
589
+ if (row) {
590
+ var err = new Exception_1.OakRowInconsistencyException(undefined, "\u60A8\u65E0\u6CD5\u5220\u9664\u5B58\u5728\u6709\u6548\u6570\u636E\u300C".concat(e, "\u300D\u5173\u8054\u7684\u884C"));
591
+ err.addData(e, [row]);
592
+ throw err;
593
+ }
594
+ }
595
+ };
596
+ try {
597
+ for (var _c = (e_3 = void 0, tslib_1.__values(OneToManyMatrix[entity])), _d = _c.next(); !_d.done; _d = _c.next()) {
598
+ var otm = _d.value;
599
+ _loop_5(otm);
600
+ }
601
+ }
602
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
603
+ finally {
604
+ try {
605
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
606
+ }
607
+ finally { if (e_3) throw e_3.error; }
608
+ }
609
+ }
610
+ if (OneToManyOnEntityMatrix[entity]) {
611
+ var _loop_6 = function (otm) {
612
+ var _l, _m, _o;
613
+ var proj = {
614
+ id: 1,
615
+ entity: 1,
616
+ entityId: 1,
617
+ };
618
+ var filter = operation.filter && (_l = {},
619
+ _l[entity] = operation.filter,
620
+ _l);
621
+ var result = context.select(otm, {
622
+ data: proj,
623
+ filter: filter,
624
+ indexFrom: 0,
625
+ count: 1
626
+ }, { dontCollect: true });
627
+ if (result instanceof Promise) {
628
+ promises.push(result.then(function (_a) {
629
+ var _b = tslib_1.__read(_a, 1), row = _b[0];
630
+ if (row) {
631
+ var e = new Exception_1.OakRowInconsistencyException(undefined, "\u60A8\u65E0\u6CD5\u5220\u9664\u5B58\u5728\u6709\u6548\u6570\u636E\u300C".concat(otm, "\u300D\u5173\u8054\u7684\u884C"));
632
+ e.addData(otm, [row]);
633
+ throw e;
634
+ }
635
+ }));
636
+ }
637
+ else {
638
+ var _p = tslib_1.__read(result, 1), row = _p[0];
639
+ if (row) {
640
+ var record = {
641
+ a: 's',
642
+ d: (_m = {},
643
+ _m[otm] = (_o = {},
644
+ _o[row.id] = row,
645
+ _o),
646
+ _m)
647
+ };
648
+ var e = new Exception_1.OakRowInconsistencyException(undefined, "\u60A8\u65E0\u6CD5\u5220\u9664\u5B58\u5728\u6709\u6548\u6570\u636E\u300C".concat(otm, "\u300D\u5173\u8054\u7684\u884C"));
649
+ e.addData(otm, [row]);
650
+ throw e;
651
+ }
652
+ }
653
+ };
654
+ try {
655
+ for (var _e = (e_4 = void 0, tslib_1.__values(OneToManyOnEntityMatrix[entity])), _f = _e.next(); !_f.done; _f = _e.next()) {
656
+ var otm = _f.value;
657
+ _loop_6(otm);
658
+ }
659
+ }
660
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
661
+ finally {
662
+ try {
663
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
664
+ }
665
+ finally { if (e_4) throw e_4.error; }
666
+ }
667
+ }
668
+ if (promises.length > 0) {
669
+ return Promise.all(promises).then(function () { return undefined; });
670
+ }
671
+ }
672
+ });
673
+ };
674
+ try {
675
+ for (var entities_1 = tslib_1.__values(entities), entities_1_1 = entities_1.next(); !entities_1_1.done; entities_1_1 = entities_1.next()) {
676
+ var entity = entities_1_1.value;
677
+ _loop_3(entity);
678
+ }
679
+ }
680
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
681
+ finally {
682
+ try {
683
+ if (entities_1_1 && !entities_1_1.done && (_a = entities_1.return)) _a.call(entities_1);
684
+ }
685
+ finally { if (e_1) throw e_1.error; }
686
+ }
687
+ var _loop_4 = function (entity) {
688
+ var e_5, _b;
689
+ var cascadeRemove = authDict[entity].cascadeRemove;
690
+ if (cascadeRemove) {
691
+ var entitiesOnEntityAttr = [];
692
+ var hasAllEntity = false;
693
+ var _loop_7 = function (attr) {
694
+ if (attr === '@entity') {
695
+ hasAllEntity = true;
696
+ return "continue";
697
+ }
698
+ var rel = (0, relation_1.judgeRelation)(schema, entity, attr);
699
+ if (rel === 2) {
700
+ entitiesOnEntityAttr.push(attr);
701
+ checkers.push({
702
+ entity: attr,
703
+ action: 'remove',
704
+ type: 'logical',
705
+ priority: types_1.REMOVE_CASCADE_PRIORITY,
706
+ checker: function (operation, context) {
707
+ var _a, _b;
708
+ var filter = operation.filter;
709
+ if (cascadeRemove[attr] === 'remove') {
710
+ return context.operate(entity, {
711
+ id: (0, uuid_1.generateNewId)(),
712
+ action: 'remove',
713
+ data: {},
714
+ filter: filter ? (_a = {},
715
+ _a[attr] = filter,
716
+ _a) : undefined,
717
+ }, { dontCollect: true });
718
+ }
719
+ return context.operate(entity, {
720
+ id: (0, uuid_1.generateNewId)(),
721
+ action: 'update',
722
+ data: {
723
+ entity: null,
724
+ entityId: null,
725
+ },
726
+ filter: filter ? (_b = {},
727
+ _b[attr] = filter,
728
+ _b) : undefined,
729
+ }, { dontCollect: true });
730
+ }
731
+ });
732
+ }
733
+ else {
734
+ (0, assert_1.default)(typeof rel === 'string');
735
+ checkers.push({
736
+ entity: rel,
737
+ action: 'remove',
738
+ type: 'logical',
739
+ priority: types_1.REMOVE_CASCADE_PRIORITY,
740
+ checker: function (operation, context) {
741
+ var _a, _b, _c;
742
+ var filter = operation.filter;
743
+ if (cascadeRemove[attr] === 'remove') {
744
+ return context.operate(entity, {
745
+ id: (0, uuid_1.generateNewId)(),
746
+ action: 'remove',
747
+ data: {},
748
+ filter: filter ? (_a = {},
749
+ _a[attr] = filter,
750
+ _a) : undefined,
751
+ }, { dontCollect: true });
752
+ }
753
+ return context.operate(entity, {
754
+ id: (0, uuid_1.generateNewId)(),
755
+ action: 'update',
756
+ data: (_b = {},
757
+ _b["".concat(attr, "Id")] = null,
758
+ _b),
759
+ filter: filter ? (_c = {},
760
+ _c[attr] = filter,
761
+ _c) : undefined,
762
+ }, { dontCollect: true });
763
+ }
764
+ });
765
+ }
766
+ };
767
+ for (var attr in cascadeRemove) {
768
+ _loop_7(attr);
769
+ }
770
+ if (hasAllEntity) {
771
+ var attributes = schema[entity].attributes;
772
+ var ref = attributes.entity.ref;
773
+ var restEntities = (0, lodash_1.difference)(ref, entitiesOnEntityAttr);
774
+ var _loop_8 = function (e) {
775
+ checkers.push({
776
+ entity: e,
777
+ action: 'remove',
778
+ type: 'logical',
779
+ priority: types_1.REMOVE_CASCADE_PRIORITY,
780
+ checker: function (operation, context) {
781
+ var _a, _b;
782
+ var filter = operation.filter;
783
+ if (cascadeRemove['@entity'] === 'remove') {
784
+ return context.operate(entity, {
785
+ id: (0, uuid_1.generateNewId)(),
786
+ action: 'remove',
787
+ data: {},
788
+ filter: filter ? (_a = {},
789
+ _a[e] = filter,
790
+ _a) : undefined,
791
+ }, { dontCollect: true });
792
+ }
793
+ return context.operate(entity, {
794
+ id: (0, uuid_1.generateNewId)(),
795
+ action: 'update',
796
+ data: {
797
+ entity: null,
798
+ entityId: null,
799
+ },
800
+ filter: filter ? (_b = {},
801
+ _b[e] = filter,
802
+ _b) : undefined,
803
+ }, { dontCollect: true });
804
+ }
805
+ });
806
+ };
807
+ try {
808
+ for (var restEntities_1 = (e_5 = void 0, tslib_1.__values(restEntities)), restEntities_1_1 = restEntities_1.next(); !restEntities_1_1.done; restEntities_1_1 = restEntities_1.next()) {
809
+ var e = restEntities_1_1.value;
810
+ _loop_8(e);
811
+ }
812
+ }
813
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
814
+ finally {
815
+ try {
816
+ if (restEntities_1_1 && !restEntities_1_1.done && (_b = restEntities_1.return)) _b.call(restEntities_1);
817
+ }
818
+ finally { if (e_5) throw e_5.error; }
819
+ }
820
+ }
821
+ }
822
+ };
823
+ // 注入声明的cascade删除时的外键处理动作
824
+ for (var entity in authDict) {
825
+ _loop_4(entity);
826
+ }
827
+ return checkers;
828
+ }
829
+ exports.createRemoveCheckers = createRemoveCheckers;