174 lines
7.0 KiB
JavaScript
174 lines
7.0 KiB
JavaScript
"use strict";
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
exports.rewriteOperation = exports.rewriteSelection = void 0;
|
||
var tslib_1 = require("tslib");
|
||
var relation_1 = require("oak-domain/lib/store/relation");
|
||
var types_1 = require("oak-domain/lib/types");
|
||
var assert_1 = tslib_1.__importDefault(require("assert"));
|
||
function rewriteFilter(schema, entity, filter) {
|
||
var e_1, _a, _b, _c, _d, _e;
|
||
var _f;
|
||
for (var attr in filter) {
|
||
if (attr === '#id' || attr === '$text' || attr.toLowerCase().startsWith(types_1.EXPRESSION_PREFIX)) {
|
||
}
|
||
else if (['$and', '$or'].includes(attr)) {
|
||
try {
|
||
for (var _g = (e_1 = void 0, tslib_1.__values(filter[attr])), _h = _g.next(); !_h.done; _h = _g.next()) {
|
||
var node = _h.value;
|
||
rewriteFilter(schema, entity, node);
|
||
}
|
||
}
|
||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||
finally {
|
||
try {
|
||
if (_h && !_h.done && (_a = _g.return)) _a.call(_g);
|
||
}
|
||
finally { if (e_1) throw e_1.error; }
|
||
}
|
||
}
|
||
else if (attr === '$not') {
|
||
rewriteFilter(schema, entity, filter[attr]);
|
||
}
|
||
else {
|
||
/**
|
||
* 这里要处理的就是把userId受到的约束扩展到存在merge的case
|
||
* 大部分这类约束都来自relation类型的checker(auth)。来自auth的由系统创建的checker一定是{ userId: xxx }的形式,但用户手写的有可能是{ user: { id: xxxx }}的形式
|
||
*/
|
||
if (attr.endsWith('Id') && attr !== 'entityId' && ((_f = schema[entity].attributes[attr]) === null || _f === void 0 ? void 0 : _f.type) === 'ref') {
|
||
// 只要是指向user的ref都要处理
|
||
var rel = (0, relation_1.judgeRelation)(schema, entity, attr.slice(0, attr.length - 2));
|
||
if (rel === 'user') {
|
||
var f = filter[attr];
|
||
delete filter[attr];
|
||
if (filter.$or) {
|
||
filter.$or.push((_b = {},
|
||
_b[attr] = f,
|
||
_b), (_c = {},
|
||
_c[attr.slice(0, attr.length - 2)] = {
|
||
userState: 'merged',
|
||
refId: f,
|
||
},
|
||
_c));
|
||
}
|
||
else {
|
||
filter.$or = [
|
||
(_d = {},
|
||
_d[attr] = f,
|
||
_d),
|
||
(_e = {},
|
||
_e[attr.slice(0, attr.length - 2)] = {
|
||
userState: 'merged',
|
||
refId: f,
|
||
},
|
||
_e)
|
||
];
|
||
}
|
||
}
|
||
else {
|
||
var _j = filter[attr], $in = _j.$in, $nin = _j.$nin;
|
||
if ($in && !($in instanceof Array)) {
|
||
var e = $in.entity, f = $in.filter;
|
||
rewriteFilter(schema, e, f);
|
||
}
|
||
if ($nin && !($nin instanceof Array)) {
|
||
var e = $nin.entity, f = $nin.filter;
|
||
rewriteFilter(schema, e, f);
|
||
}
|
||
}
|
||
}
|
||
else if (attr === 'entity' && filter[attr] === 'user') {
|
||
(0, assert_1.default)(filter.entityId);
|
||
var f = filter.entityId;
|
||
delete filter.entityId;
|
||
if (filter.$or) {
|
||
filter.$or.push({
|
||
entityId: f,
|
||
}, {
|
||
user: {
|
||
userState: 'merged',
|
||
refId: f,
|
||
}
|
||
});
|
||
}
|
||
else {
|
||
filter.$or = [
|
||
{
|
||
entityId: f,
|
||
},
|
||
{
|
||
user: {
|
||
userState: 'merged',
|
||
refId: f,
|
||
}
|
||
}
|
||
];
|
||
}
|
||
}
|
||
else {
|
||
var rel = (0, relation_1.judgeRelation)(schema, entity, attr);
|
||
if (rel === 2) {
|
||
if (attr === 'user' && filter[attr].id) {
|
||
throw new Error('不应该出现{user: {id:}}格式的查询');
|
||
}
|
||
rewriteFilter(schema, attr, filter[attr]);
|
||
}
|
||
else if (typeof rel === 'string') {
|
||
if (rel === 'user' && filter[attr].id) {
|
||
throw new Error('不应该出现{user: {id:}}格式的查询');
|
||
}
|
||
rewriteFilter(schema, rel, filter[attr]);
|
||
}
|
||
else if (rel instanceof Array) {
|
||
var _k = tslib_1.__read(rel, 1), e = _k[0];
|
||
var f = filter[attr].filter;
|
||
if (f) {
|
||
rewriteFilter(schema, e, f);
|
||
}
|
||
}
|
||
else if (typeof filter[attr] === 'object') {
|
||
// 还要处理子查询
|
||
var _l = filter[attr], $in = _l.$in, $nin = _l.$nin;
|
||
if ($in && !($in instanceof Array)) {
|
||
var e = $in.entity, f = $in.filter;
|
||
rewriteFilter(schema, e, f);
|
||
}
|
||
if ($nin && !($nin instanceof Array)) {
|
||
var e = $nin.entity, f = $nin.filter;
|
||
rewriteFilter(schema, e, f);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// { user: { id: xxxxx }} 的查询大都来自cascade查询,只能先不处理
|
||
if (entity === 'user' && filter.id) {
|
||
// throw new Error('不应该出现{user: {id:}}格式的查询');
|
||
}
|
||
}
|
||
function rewriteSelection(schema, entity, selection) {
|
||
var _a;
|
||
var filter = selection.filter;
|
||
if (filter && !filter['#oak-general-business--rewrited']) {
|
||
rewriteFilter(schema, entity, filter);
|
||
// 避免被重写多次
|
||
Object.assign(filter, (_a = {},
|
||
_a['#oak-general-business--rewrited'] = true,
|
||
_a));
|
||
}
|
||
return;
|
||
}
|
||
exports.rewriteSelection = rewriteSelection;
|
||
function rewriteOperation(schema, entity, operation) {
|
||
var _a;
|
||
var filter = operation.filter;
|
||
if (filter && !filter['#oak-general-business--rewrited']) {
|
||
rewriteFilter(schema, entity, filter);
|
||
// 避免被重写多次
|
||
Object.assign(filter, (_a = {},
|
||
_a['#oak-general-business--rewrited'] = true,
|
||
_a));
|
||
}
|
||
return;
|
||
}
|
||
exports.rewriteOperation = rewriteOperation;
|