在初始化的时候注入处理被merge用户的逻辑

This commit is contained in:
Xu Chang 2023-02-08 15:12:38 +08:00
parent ae8c87450c
commit 9709fd2c63
4 changed files with 202 additions and 159 deletions

View File

@ -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',
},
},
},

View File

@ -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类型的checkerauth来自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类型的checkerauth来自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) {

View File

@ -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',
},
},
},

View File

@ -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类型的checkerauthauth的由系统创建的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类型的checkerauthauth的由系统创建的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:}}格式的查询');
}
}