From 9709fd2c63a0294b78241442859559f1d8fda558 Mon Sep 17 00:00:00 2001 From: "Xc@centOs" Date: Wed, 8 Feb 2023 15:12:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=E6=B3=A8=E5=85=A5=E5=A4=84=E7=90=86=E8=A2=AB?= =?UTF-8?q?merge=E7=94=A8=E6=88=B7=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/mobile/me/index.js | 20 ++-- lib/routines/start.js | 183 ++++++++++++++++++++--------------- src/pages/mobile/me/index.ts | 20 ++-- src/routines/start.ts | 138 ++++++++++++++------------ 4 files changed, 202 insertions(+), 159 deletions(-) diff --git a/lib/pages/mobile/me/index.js b/lib/pages/mobile/me/index.js index 7dcfb64bb..31ac92a13 100644 --- a/lib/pages/mobile/me/index.js +++ b/lib/pages/mobile/me/index.js @@ -14,17 +14,15 @@ exports.default = OakComponent({ filter: function () { var token = this.features.token.getToken(); return { - user: { - id: { - $in: { - entity: 'token', - data: { - userId: 1, - }, - filter: { - id: token === null || token === void 0 ? void 0 : token.id, - ableState: 'enabled', - }, + userId: { + $in: { + entity: 'token', + data: { + userId: 1, + }, + filter: { + id: token === null || token === void 0 ? void 0 : token.id, + ableState: 'enabled', }, }, }, diff --git a/lib/routines/start.js b/lib/routines/start.js index 63dc24e54..b0fadd877 100644 --- a/lib/routines/start.js +++ b/lib/routines/start.js @@ -3,105 +3,134 @@ Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var selection_1 = require("oak-domain/lib/store/selection"); var relation_1 = require("oak-domain/lib/store/relation"); -var console_1 = require("console"); +var types_1 = require("oak-domain/lib/types"); +var assert_1 = tslib_1.__importDefault(require("assert")); function rewriteFilter(schema, entity, filter) { - var _a, _b, _c, _d; + var e_1, _a, _b, _c, _d, _e; for (var attr in filter) { - /** - * 这里要处理的就是把userId受到的约束扩展到存在merge的case - * 大部分这类约束都来自relation类型的checker(auth)。来自auth的由系统创建的checker一定是{ userId: xxx }的形式,但用户手写的有可能是{ user: { id: xxxx }}的形式 - */ - if (attr.endsWith('Id') && attr !== 'entityId') { - // 只要是指向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((_a = {}, - _a[attr] = f, - _a), (_b = {}, - _b[attr.slice(0, attr.length - 2)] = { - userState: 'merged', - refId: f, - }, - _b)); + if (attr === '#id' || attr === '$text' || attr.toLowerCase().startsWith(types_1.EXPRESSION_PREFIX)) { + } + else if (['$and', '$or'].includes(attr)) { + try { + for (var _f = (e_1 = void 0, tslib_1.__values(filter[attr])), _g = _f.next(); !_g.done; _g = _f.next()) { + var node = _g.value; + rewriteFilter(schema, entity, node); } - else { - filter.$or = [ - (_c = {}, - _c[attr] = f, - _c), - (_d = {}, - _d[attr.slice(0, attr.length - 2)] = { + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_g && !_g.done && (_a = _f.return)) _a.call(_f); + } + 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') { + // 只要是指向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, }, - _d) - ]; + _c)); + } + else { + filter.$or = [ + (_d = {}, + _d[attr] = f, + _d), + (_e = {}, + _e[attr.slice(0, attr.length - 2)] = { + userState: 'merged', + refId: f, + }, + _e) + ]; + } } } - } - else if (attr === 'entity' && filter[attr] === 'user') { - (0, console_1.assert)(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 = [ - { + 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 { - var rel = (0, relation_1.judgeRelation)(schema, entity, attr); - if (rel === 2) { - rewriteFilter(schema, attr, filter[attr]); - } - else if (typeof rel === 'string') { - rewriteFilter(schema, rel, filter[attr]); - } - else if (rel instanceof Array) { - var _e = tslib_1.__read(rel, 1), e = _e[0]; - var f = filter[attr].filter; - if (f) { - rewriteFilter(schema, e, f); + }); + } + else { + filter.$or = [ + { + entityId: f, + }, + { + user: { + userState: 'merged', + refId: f, + } + } + ]; } } else { - // 还要处理子查询 - var _f = filter[attr], $in = _f.$in, $nin = _f.$nin; - if ($in && !($in instanceof Array)) { - var e = $in.entity, f = $in.filter; - rewriteFilter(schema, e, f); + 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]); } - if ($nin && !($nin instanceof Array)) { - var e = $nin.entity, f = $nin.filter; - rewriteFilter(schema, e, f); + 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 _h = tslib_1.__read(rel, 1), e = _h[0]; + var f = filter[attr].filter; + if (f) { + rewriteFilter(schema, e, f); + } + } + 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); + } } } } } - // 先防一手写出{ user: { id: xxxxx }} + // { user: { id: xxxxx }} 的查询大都来自cascade查询,只能先不处理 if (entity === 'user' && filter.id) { - throw new Error('不应该出现{user: {id:}}格式的查询'); + // throw new Error('不应该出现{user: {id:}}格式的查询'); } } function rewriteSelection(schema, entity, selection) { diff --git a/src/pages/mobile/me/index.ts b/src/pages/mobile/me/index.ts index 3a1b42f43..c44bfff98 100644 --- a/src/pages/mobile/me/index.ts +++ b/src/pages/mobile/me/index.ts @@ -12,17 +12,15 @@ export default OakComponent({ filter() { const token = this.features.token.getToken(); return { - user: { - id: { - $in: { - entity: 'token', - data: { - userId: 1, - }, - filter: { - id: token?.id, - ableState: 'enabled', - }, + userId: { + $in: { + entity: 'token', + data: { + userId: 1, + }, + filter: { + id: token?.id, + ableState: 'enabled', }, }, }, diff --git a/src/routines/start.ts b/src/routines/start.ts index 8b03288c7..2c216256b 100644 --- a/src/routines/start.ts +++ b/src/routines/start.ts @@ -4,50 +4,61 @@ import { EntityDict } from 'oak-domain/lib/types/Entity'; import { judgeRelation } from 'oak-domain/lib/store/relation'; import { EntityDict as BaseEntityDict } from '../general-app-domain'; import { BackendRuntimeContext } from '../context/BackendRuntimeContext'; -import { StorageSchema } from 'oak-domain/lib/types'; -import { assert } from 'console'; +import { EXPRESSION_PREFIX, StorageSchema } from 'oak-domain/lib/types'; +import assert from 'assert'; function rewriteFilter( schema: StorageSchema, entity: T, filter: ED[T]['Selection']['filter']) { for (const attr in filter) { - /** - * 这里要处理的就是把userId受到的约束扩展到存在merge的case - * 大部分这类约束都来自relation类型的checker(auth)。来自auth的由系统创建的checker一定是{ userId: xxx }的形式,但用户手写的有可能是{ user: { id: xxxx }}的形式 - */ - if (attr.endsWith('Id') && attr !== 'entityId') { - // 只要是指向user的ref都要处理 - const rel = judgeRelation(schema, entity, attr.slice(0, attr.length - 2)); - if (rel === 'user') { - const f = filter[attr]; - delete filter[attr]; - if (filter.$or) { - filter.$or.push({ - [attr]: f, - }, { - [attr.slice(0, attr.length -2)]: { - userState: 'merged', - refId: f, - } - }); - } - else { - filter.$or = [ - { + if (attr === '#id' || attr === '$text' || attr.toLowerCase().startsWith(EXPRESSION_PREFIX)) { + } + else if (['$and', '$or'].includes(attr)) { + for (const node of filter[attr]!) { + rewriteFilter(schema, entity, node); + } + } + 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') { + // 只要是指向user的ref都要处理 + const rel = judgeRelation(schema, entity, attr.slice(0, attr.length - 2)); + if (rel === 'user') { + const f = filter[attr]; + delete filter[attr]; + if (filter.$or) { + filter.$or.push({ [attr]: f, - }, - { - [attr.slice(0, attr.length -2)]: { + }, { + [attr.slice(0, attr.length - 2)]: { userState: 'merged', refId: f, } - } - ]; + }); + } + else { + filter.$or = [ + { + [attr]: f, + }, + { + [attr.slice(0, attr.length - 2)]: { + userState: 'merged', + refId: f, + } + } + ]; + } } } - } - else if (attr === 'entity' && filter[attr] === 'user') { - assert(filter.entityId); - const f = filter.entityId; + else if (attr === 'entity' && filter[attr] === 'user') { + assert(filter.entityId); + const f = filter.entityId; delete filter.entityId; if (filter.$or) { filter.$or.push({ @@ -63,7 +74,7 @@ function rewriteFilter