在初始化的时候注入处理被merge用户的逻辑
This commit is contained in:
parent
ae8c87450c
commit
9709fd2c63
|
|
@ -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',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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<ED extends EntityDict & BaseEntityDict, T extends keyof ED>(
|
||||
schema: StorageSchema<ED>, 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<ED extends EntityDict & BaseEntityDict, T extends keyof E
|
|||
filter.$or = [
|
||||
{
|
||||
entityId: f,
|
||||
},
|
||||
},
|
||||
{
|
||||
user: {
|
||||
userState: 'merged',
|
||||
|
|
@ -72,40 +83,47 @@ function rewriteFilter<ED extends EntityDict & BaseEntityDict, T extends keyof E
|
|||
}
|
||||
];
|
||||
}
|
||||
}
|
||||
else {
|
||||
const rel = 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) {
|
||||
const [e] = rel;
|
||||
const { filter: f } = filter[attr];
|
||||
if (f) {
|
||||
rewriteFilter(schema, e, f);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// 还要处理子查询
|
||||
const { $in, $nin } = filter[attr];
|
||||
if ($in && !($in instanceof Array)) {
|
||||
const { entity: e, filter: f } = $in;
|
||||
rewriteFilter(schema, e, f);
|
||||
const rel = 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)) {
|
||||
const { entity: e, filter: f } = $nin;
|
||||
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) {
|
||||
const [e] = rel;
|
||||
const { filter: f } = filter[attr];
|
||||
if (f) {
|
||||
rewriteFilter(schema, e, f);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// 还要处理子查询
|
||||
const { $in, $nin } = filter[attr];
|
||||
if ($in && !($in instanceof Array)) {
|
||||
const { entity: e, filter: f } = $in;
|
||||
rewriteFilter(schema, e, f);
|
||||
}
|
||||
if ($nin && !($nin instanceof Array)) {
|
||||
const { entity: e, filter: f } = $nin;
|
||||
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:}}格式的查询');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue