Merge branch 'dev' of gitea.51mars.com:Oak-Team/oak-domain into dev
This commit is contained in:
commit
14154e5f82
|
|
@ -79,7 +79,7 @@ function createUniqueCheckers(schema) {
|
||||||
entity,
|
entity,
|
||||||
action: 'create',
|
action: 'create',
|
||||||
type: 'logicalData',
|
type: 'logicalData',
|
||||||
priority: types_1.CHECKER_MAX_PRIORITY, // 优先级要放在最低,所有前置的checker/trigger将数据完整之后再在这里检测
|
priority: types_1.CHECKER_MAX_PRIORITY,
|
||||||
checker: (operation, context) => {
|
checker: (operation, context) => {
|
||||||
const { data } = operation;
|
const { data } = operation;
|
||||||
if (data instanceof Array) {
|
if (data instanceof Array) {
|
||||||
|
|
@ -95,9 +95,9 @@ function createUniqueCheckers(schema) {
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
entity,
|
entity,
|
||||||
action: 'update', // 只检查update,其它状态转换的action应该不会涉及unique约束的属性
|
action: 'update',
|
||||||
type: 'logicalData',
|
type: 'logicalData',
|
||||||
priority: types_1.CHECKER_MAX_PRIORITY, // 优先级要放在最低,所有前置的checker/trigger将数据完整之后再在这里检测
|
priority: types_1.CHECKER_MAX_PRIORITY,
|
||||||
checker: (operation, context) => {
|
checker: (operation, context) => {
|
||||||
const { data, filter: operationFilter } = operation;
|
const { data, filter: operationFilter } = operation;
|
||||||
if (data) {
|
if (data) {
|
||||||
|
|
@ -227,7 +227,7 @@ function createActionTransformerCheckers(actionDefDict) {
|
||||||
action: 'create',
|
action: 'create',
|
||||||
type: 'logical',
|
type: 'logical',
|
||||||
entity,
|
entity,
|
||||||
priority: 10, // 优先级要高,先于真正的data检查进行
|
priority: 10,
|
||||||
checker: (operation) => {
|
checker: (operation) => {
|
||||||
const { data } = operation;
|
const { data } = operation;
|
||||||
if (data instanceof Array) {
|
if (data instanceof Array) {
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ function translateCheckerInAsyncContext(checker, schema) {
|
||||||
blockTrigger: true,
|
blockTrigger: true,
|
||||||
});
|
});
|
||||||
const e = new Exception_1.OakRowInconsistencyException(errMsg);
|
const e = new Exception_1.OakRowInconsistencyException(errMsg);
|
||||||
e.addData(entity2, rows2);
|
e.addData(entity2, rows2, context.getSchema());
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -265,7 +265,7 @@ function createRemoveCheckers(schema) {
|
||||||
promises.push(result.then(([row]) => {
|
promises.push(result.then(([row]) => {
|
||||||
if (row) {
|
if (row) {
|
||||||
const err = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${e}」关联的行`);
|
const err = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${e}」关联的行`);
|
||||||
err.addData(e, [row]);
|
err.addData(e, [row], context.getSchema());
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
@ -274,7 +274,7 @@ function createRemoveCheckers(schema) {
|
||||||
const [row] = result;
|
const [row] = result;
|
||||||
if (row) {
|
if (row) {
|
||||||
const err = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${e}」关联的行`);
|
const err = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${e}」关联的行`);
|
||||||
err.addData(e, [row]);
|
err.addData(e, [row], context.getSchema());
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -300,7 +300,7 @@ function createRemoveCheckers(schema) {
|
||||||
promises.push(result.then(([row]) => {
|
promises.push(result.then(([row]) => {
|
||||||
if (row) {
|
if (row) {
|
||||||
const e = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${otm}」关联的行`);
|
const e = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${otm}」关联的行`);
|
||||||
e.addData(otm, [row]);
|
e.addData(otm, [row], context.getSchema());
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
@ -317,7 +317,7 @@ function createRemoveCheckers(schema) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const e = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${otm}」关联的行`);
|
const e = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${otm}」关联的行`);
|
||||||
e.addData(otm, [row]);
|
e.addData(otm, [row], context.getSchema());
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -425,6 +425,7 @@ function unionFilterSegment(entity, schema, ...filters) {
|
||||||
['#sqp']: sqpOp1,
|
['#sqp']: sqpOp1,
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// not in情况子查询变成and
|
// not in情况子查询变成and
|
||||||
|
|
@ -434,6 +435,7 @@ function unionFilterSegment(entity, schema, ...filters) {
|
||||||
['#sqp']: sqpOp1,
|
['#sqp']: sqpOp1,
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,9 @@
|
||||||
import { IncomingHttpHeaders } from "http";
|
import { IncomingHttpHeaders } from "http";
|
||||||
import { SyncContext } from "../store/SyncRowStore";
|
import { SyncContext } from "../store/SyncRowStore";
|
||||||
import { EntityDict, OpRecord } from "./Entity";
|
import { EntityDict, OpRecord } from "./Entity";
|
||||||
|
import { EntityDict as BaseEntityDict } from '../base-app-domain';
|
||||||
import { OakException } from "./Exception";
|
import { OakException } from "./Exception";
|
||||||
export interface Connector<ED extends EntityDict, FrontCxt extends SyncContext<ED>> {
|
export interface Connector<ED extends EntityDict & BaseEntityDict, FrontCxt extends SyncContext<ED>> {
|
||||||
callAspect: (name: string, params: any, context?: FrontCxt) => Promise<{
|
callAspect: (name: string, params: any, context?: FrontCxt) => Promise<{
|
||||||
result: any;
|
result: any;
|
||||||
opRecords?: OpRecord<ED>[];
|
opRecords?: OpRecord<ED>[];
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
|
import { StorageSchema } from ".";
|
||||||
import { EntityDict, OpRecord } from "./Entity";
|
import { EntityDict, OpRecord } from "./Entity";
|
||||||
export declare class OakException<ED extends EntityDict> extends Error {
|
import { EntityDict as BaseEntityDict } from '../base-app-domain';
|
||||||
|
export declare class OakException<ED extends EntityDict & BaseEntityDict> extends Error {
|
||||||
opRecords: OpRecord<ED>[];
|
opRecords: OpRecord<ED>[];
|
||||||
constructor(message?: string);
|
constructor(message?: string);
|
||||||
addData<T extends keyof ED>(entity: T, rows: Partial<ED[T]['OpSchema']>[]): void;
|
addData<T extends keyof ED>(entity: T, rows: Partial<ED[T]['Schema']>[], schema: StorageSchema<ED>): void;
|
||||||
setOpRecords(opRecords: OpRecord<ED>[]): void;
|
setOpRecords(opRecords: OpRecord<ED>[]): void;
|
||||||
getSerialData(): {
|
getSerialData(): {
|
||||||
name: string;
|
name: string;
|
||||||
|
|
@ -17,19 +19,19 @@ export declare class OakException<ED extends EntityDict> extends Error {
|
||||||
tag2?: boolean;
|
tag2?: boolean;
|
||||||
tag3?: any;
|
tag3?: any;
|
||||||
}
|
}
|
||||||
export declare class OakMakeSureByMySelfException<ED extends EntityDict> extends OakException<ED> {
|
export declare class OakMakeSureByMySelfException<ED extends EntityDict & BaseEntityDict> extends OakException<ED> {
|
||||||
}
|
}
|
||||||
export declare class OakDataException<ED extends EntityDict> extends OakException<ED> {
|
export declare class OakDataException<ED extends EntityDict & BaseEntityDict> extends OakException<ED> {
|
||||||
}
|
}
|
||||||
export declare class OakNoRelationDefException<ED extends EntityDict, T extends keyof ED> extends OakDataException<ED> {
|
export declare class OakNoRelationDefException<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends OakDataException<ED> {
|
||||||
entity: T;
|
entity: T;
|
||||||
actions: ED[T]['Action'][];
|
actions: ED[T]['Action'][];
|
||||||
constructor(entity: T, actions: ED[T]['Action'][], msg?: string);
|
constructor(entity: T, actions: ED[T]['Action'][], msg?: string);
|
||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
export declare class OakOperExistedException<ED extends EntityDict> extends OakDataException<ED> {
|
export declare class OakOperExistedException<ED extends EntityDict & BaseEntityDict> extends OakDataException<ED> {
|
||||||
}
|
}
|
||||||
export declare class OakRowUnexistedException<ED extends EntityDict> extends OakDataException<ED> {
|
export declare class OakRowUnexistedException<ED extends EntityDict & BaseEntityDict> extends OakDataException<ED> {
|
||||||
private rows;
|
private rows;
|
||||||
constructor(rows: Array<{
|
constructor(rows: Array<{
|
||||||
entity: any;
|
entity: any;
|
||||||
|
|
@ -44,9 +46,9 @@ export declare class OakRowUnexistedException<ED extends EntityDict> extends Oak
|
||||||
/**
|
/**
|
||||||
* 可接受的、由用户操作造成的异常
|
* 可接受的、由用户操作造成的异常
|
||||||
*/
|
*/
|
||||||
export declare class OakUserException<ED extends EntityDict> extends OakException<ED> {
|
export declare class OakUserException<ED extends EntityDict & BaseEntityDict> extends OakException<ED> {
|
||||||
}
|
}
|
||||||
export declare class OakUniqueViolationException<ED extends EntityDict> extends OakUserException<ED> {
|
export declare class OakUniqueViolationException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
rows: Array<{
|
rows: Array<{
|
||||||
id?: string;
|
id?: string;
|
||||||
attrs: string[];
|
attrs: string[];
|
||||||
|
|
@ -56,7 +58,7 @@ export declare class OakUniqueViolationException<ED extends EntityDict> extends
|
||||||
attrs: string[];
|
attrs: string[];
|
||||||
}>, message?: string);
|
}>, message?: string);
|
||||||
}
|
}
|
||||||
export declare class OakImportDataParseException<ED extends EntityDict> extends OakUserException<ED> {
|
export declare class OakImportDataParseException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
line: number;
|
line: number;
|
||||||
header?: string;
|
header?: string;
|
||||||
constructor(message: string, line: number, header?: string);
|
constructor(message: string, line: number, header?: string);
|
||||||
|
|
@ -64,21 +66,21 @@ export declare class OakImportDataParseException<ED extends EntityDict> extends
|
||||||
/**
|
/**
|
||||||
* 网络中断异常
|
* 网络中断异常
|
||||||
*/
|
*/
|
||||||
export declare class OakNetworkException<ED extends EntityDict> extends OakException<ED> {
|
export declare class OakNetworkException<ED extends EntityDict & BaseEntityDict> extends OakException<ED> {
|
||||||
}
|
}
|
||||||
export declare class OakServerProxyException<ED extends EntityDict> extends OakException<ED> {
|
export declare class OakServerProxyException<ED extends EntityDict & BaseEntityDict> extends OakException<ED> {
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 数据不一致异常,系统认为现有的数据不允许相应的动作时抛此异常
|
* 数据不一致异常,系统认为现有的数据不允许相应的动作时抛此异常
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export declare class OakRowInconsistencyException<ED extends EntityDict> extends OakUserException<ED> {
|
export declare class OakRowInconsistencyException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 当输入的数据非法时抛此异常,attributes表示非法的属性
|
* 当输入的数据非法时抛此异常,attributes表示非法的属性
|
||||||
*/
|
*/
|
||||||
export declare class OakInputIllegalException<ED extends EntityDict> extends OakUserException<ED> {
|
export declare class OakInputIllegalException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
private attributes;
|
private attributes;
|
||||||
private entity;
|
private entity;
|
||||||
constructor(entity: keyof ED, attributes: string[], message?: string);
|
constructor(entity: keyof ED, attributes: string[], message?: string);
|
||||||
|
|
@ -90,19 +92,19 @@ export declare class OakInputIllegalException<ED extends EntityDict> extends Oak
|
||||||
/**
|
/**
|
||||||
* 属性为空时抛的异常
|
* 属性为空时抛的异常
|
||||||
*/
|
*/
|
||||||
export declare class OakAttrNotNullException<ED extends EntityDict> extends OakInputIllegalException<ED> {
|
export declare class OakAttrNotNullException<ED extends EntityDict & BaseEntityDict> extends OakInputIllegalException<ED> {
|
||||||
constructor(entity: keyof ED, attributes: string[], message?: string);
|
constructor(entity: keyof ED, attributes: string[], message?: string);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 属性不允许更新抛的异常,前端可以用这个异常来处理update时对应属性的露出
|
* 属性不允许更新抛的异常,前端可以用这个异常来处理update时对应属性的露出
|
||||||
*/
|
*/
|
||||||
export declare class OakAttrCantUpdateException<ED extends EntityDict> extends OakInputIllegalException<ED> {
|
export declare class OakAttrCantUpdateException<ED extends EntityDict & BaseEntityDict> extends OakInputIllegalException<ED> {
|
||||||
constructor(entity: keyof ED, attributes: string[], message?: string);
|
constructor(entity: keyof ED, attributes: string[], message?: string);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 用户权限不够时抛的异常
|
* 用户权限不够时抛的异常
|
||||||
*/
|
*/
|
||||||
export declare class OakUserUnpermittedException<ED extends EntityDict, T extends keyof ED> extends OakUserException<ED> {
|
export declare class OakUserUnpermittedException<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends OakUserException<ED> {
|
||||||
private entity;
|
private entity;
|
||||||
private operation;
|
private operation;
|
||||||
constructor(entity: T, operation: ED[T]['Selection'] | ED[T]['Operation'], message?: string);
|
constructor(entity: T, operation: ED[T]['Selection'] | ED[T]['Operation'], message?: string);
|
||||||
|
|
@ -111,7 +113,7 @@ export declare class OakUserUnpermittedException<ED extends EntityDict, T extend
|
||||||
/**
|
/**
|
||||||
* 用户查询权限不够抛出异常
|
* 用户查询权限不够抛出异常
|
||||||
*/
|
*/
|
||||||
export declare class OakUserInvisibleException<ED extends EntityDict, T extends keyof ED> extends OakUserException<ED> {
|
export declare class OakUserInvisibleException<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends OakUserException<ED> {
|
||||||
private entity;
|
private entity;
|
||||||
private operation;
|
private operation;
|
||||||
constructor(entity: T, operation: ED[T]['Selection'] | ED[T]['Operation'], message?: string);
|
constructor(entity: T, operation: ED[T]['Selection'] | ED[T]['Operation'], message?: string);
|
||||||
|
|
@ -120,19 +122,19 @@ export declare class OakUserInvisibleException<ED extends EntityDict, T extends
|
||||||
/**
|
/**
|
||||||
* 用户未登录抛的异常
|
* 用户未登录抛的异常
|
||||||
*/
|
*/
|
||||||
export declare class OakUnloggedInException<ED extends EntityDict> extends OakUserException<ED> {
|
export declare class OakUnloggedInException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
constructor(message?: string);
|
constructor(message?: string);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 用户未登录抛的异常
|
* 用户未登录抛的异常
|
||||||
*/
|
*/
|
||||||
export declare class OakRowLockedException<ED extends EntityDict> extends OakUserException<ED> {
|
export declare class OakRowLockedException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
constructor(message?: string);
|
constructor(message?: string);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 要插入行时,发现已经有相同的行数据
|
* 要插入行时,发现已经有相同的行数据
|
||||||
*/
|
*/
|
||||||
export declare class OakCongruentRowExists<ED extends EntityDict, T extends keyof ED> extends OakUserException<ED> {
|
export declare class OakCongruentRowExists<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends OakUserException<ED> {
|
||||||
private data;
|
private data;
|
||||||
private entity;
|
private entity;
|
||||||
constructor(entity: T, data: ED[T]['OpSchema'], message?: string);
|
constructor(entity: T, data: ED[T]['OpSchema'], message?: string);
|
||||||
|
|
@ -143,13 +145,13 @@ export declare class OakCongruentRowExists<ED extends EntityDict, T extends keyo
|
||||||
/**
|
/**
|
||||||
* 死锁抛的异常
|
* 死锁抛的异常
|
||||||
*/
|
*/
|
||||||
export declare class OakDeadlock<ED extends EntityDict> extends OakUserException<ED> {
|
export declare class OakDeadlock<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
constructor(message?: string | undefined);
|
constructor(message?: string | undefined);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 前置条件不满足抛的异常
|
* 前置条件不满足抛的异常
|
||||||
*/
|
*/
|
||||||
export declare class OakPreConditionUnsetException<ED extends EntityDict> extends OakUserException<ED> {
|
export declare class OakPreConditionUnsetException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
entity?: keyof ED;
|
entity?: keyof ED;
|
||||||
code?: string;
|
code?: string;
|
||||||
constructor(message?: string | undefined, entity?: keyof ED | undefined, code?: string | undefined);
|
constructor(message?: string | undefined, entity?: keyof ED | undefined, code?: string | undefined);
|
||||||
|
|
@ -158,14 +160,14 @@ export declare class OakPreConditionUnsetException<ED extends EntityDict> extend
|
||||||
/**
|
/**
|
||||||
* 调用外部接口抛出的异常
|
* 调用外部接口抛出的异常
|
||||||
*/
|
*/
|
||||||
export declare class OakExternalException<ED extends EntityDict> extends OakUserException<ED> {
|
export declare class OakExternalException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
code?: string;
|
code?: string;
|
||||||
source: string;
|
source: string;
|
||||||
data?: any;
|
data?: any;
|
||||||
constructor(source: string, code?: string, message?: string, data?: any);
|
constructor(source: string, code?: string, message?: string, data?: any);
|
||||||
toString(): string;
|
toString(): string;
|
||||||
}
|
}
|
||||||
export declare function makeException<ED extends EntityDict>(data: {
|
export declare function makeException<ED extends EntityDict & BaseEntityDict>(data: {
|
||||||
name: string;
|
name: string;
|
||||||
message?: string;
|
message?: string;
|
||||||
opRecords: OpRecord<ED>[];
|
opRecords: OpRecord<ED>[];
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
"use strict";
|
"use strict";
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.makeException = exports.OakExternalException = exports.OakPreConditionUnsetException = exports.OakDeadlock = exports.OakCongruentRowExists = exports.OakRowLockedException = exports.OakUnloggedInException = exports.OakUserInvisibleException = exports.OakUserUnpermittedException = exports.OakAttrCantUpdateException = exports.OakAttrNotNullException = exports.OakInputIllegalException = exports.OakRowInconsistencyException = exports.OakServerProxyException = exports.OakNetworkException = exports.OakImportDataParseException = exports.OakUniqueViolationException = exports.OakUserException = exports.OakRowUnexistedException = exports.OakOperExistedException = exports.OakNoRelationDefException = exports.OakDataException = exports.OakMakeSureByMySelfException = exports.OakException = void 0;
|
exports.makeException = exports.OakExternalException = exports.OakPreConditionUnsetException = exports.OakDeadlock = exports.OakCongruentRowExists = exports.OakRowLockedException = exports.OakUnloggedInException = exports.OakUserInvisibleException = exports.OakUserUnpermittedException = exports.OakAttrCantUpdateException = exports.OakAttrNotNullException = exports.OakInputIllegalException = exports.OakRowInconsistencyException = exports.OakServerProxyException = exports.OakNetworkException = exports.OakImportDataParseException = exports.OakUniqueViolationException = exports.OakUserException = exports.OakRowUnexistedException = exports.OakOperExistedException = exports.OakNoRelationDefException = exports.OakDataException = exports.OakMakeSureByMySelfException = exports.OakException = void 0;
|
||||||
|
const relation_1 = require("../store/relation");
|
||||||
|
const lodash_1 = require("../utils/lodash");
|
||||||
class OakException extends Error {
|
class OakException extends Error {
|
||||||
opRecords;
|
opRecords;
|
||||||
constructor(message) {
|
constructor(message) {
|
||||||
|
|
@ -17,18 +19,55 @@ class OakException extends Error {
|
||||||
}
|
}
|
||||||
this.opRecords = [];
|
this.opRecords = [];
|
||||||
}
|
}
|
||||||
addData(entity, rows) {
|
addData(entity, rows, schema) {
|
||||||
|
const rowDict = {};
|
||||||
|
const addToRowDict = (entity, row) => {
|
||||||
|
if (!rowDict[entity]) {
|
||||||
|
rowDict[entity] = {
|
||||||
|
[row.id]: row,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (rowDict[entity][row.id]) {
|
||||||
|
Object.assign(rowDict[entity][row.id], row);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rowDict[entity][row.id] = row;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const addInner = (entity, row) => {
|
||||||
|
const ownAttrs = [];
|
||||||
|
for (const attr in row) {
|
||||||
|
const rel = (0, relation_1.judgeRelation)(schema, entity, attr);
|
||||||
|
if (rel === 1) {
|
||||||
|
ownAttrs.push(attr);
|
||||||
|
}
|
||||||
|
else if (rel === 2) {
|
||||||
|
addInner(attr, row[attr]);
|
||||||
|
}
|
||||||
|
else if (typeof rel === 'string') {
|
||||||
|
addInner(rel, row[attr]);
|
||||||
|
}
|
||||||
|
else if (rel instanceof Array) {
|
||||||
|
(row[attr]).forEach((ele) => addInner(rel[0], ele));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addToRowDict(entity, (0, lodash_1.pick)(row, ownAttrs));
|
||||||
|
};
|
||||||
|
for (const row of rows) {
|
||||||
|
addInner(entity, row);
|
||||||
|
}
|
||||||
|
for (const entity in rowDict) {
|
||||||
const record = {
|
const record = {
|
||||||
a: 's',
|
a: 's',
|
||||||
d: {
|
d: {
|
||||||
[entity]: {},
|
[entity]: rowDict[entity],
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
for (const row of rows) {
|
|
||||||
record.d[entity][row.id] = row;
|
|
||||||
}
|
|
||||||
this.opRecords.push(record);
|
this.opRecords.push(record);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
setOpRecords(opRecords) {
|
setOpRecords(opRecords) {
|
||||||
this.opRecords = opRecords;
|
this.opRecords = opRecords;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,9 @@
|
||||||
import { IncomingHttpHeaders } from "http";
|
import { IncomingHttpHeaders } from "http";
|
||||||
import { SyncContext } from '../store/SyncRowStore';
|
import { SyncContext } from '../store/SyncRowStore';
|
||||||
import { Connector, EntityDict, OakException, OpRecord } from "../types";
|
import { Connector, EntityDict, OakException, OpRecord } from "../types";
|
||||||
|
import { EntityDict as BaseEntityDict } from '../base-app-domain';
|
||||||
import { AccessConfiguration } from '../types/Configuration';
|
import { AccessConfiguration } from '../types/Configuration';
|
||||||
export default class SimpleConnector<ED extends EntityDict, FrontCxt extends SyncContext<ED>> implements Connector<ED, FrontCxt> {
|
export default class SimpleConnector<ED extends EntityDict & BaseEntityDict, FrontCxt extends SyncContext<ED>> implements Connector<ED, FrontCxt> {
|
||||||
static ASPECT_ROUTER: string;
|
static ASPECT_ROUTER: string;
|
||||||
static BRIDGE_ROUTER: string;
|
static BRIDGE_ROUTER: string;
|
||||||
static SUBSCRIBE_ROUTER: string;
|
static SUBSCRIBE_ROUTER: string;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
/// <reference types="node" />
|
|
||||||
/**
|
/**
|
||||||
* 防止assert打包体积过大,从这里引用
|
* 防止assert打包体积过大,从这里引用
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ function destructRelationPath(schema, entity, path, relationFilter, recursive) {
|
||||||
},
|
},
|
||||||
filter: relationFilter,
|
filter: relationFilter,
|
||||||
} // as ED['userRelation']['Selection']
|
} // as ED['userRelation']['Selection']
|
||||||
}, // as ED[keyof ED]['Selection']['data'],
|
},
|
||||||
getData: (d) => {
|
getData: (d) => {
|
||||||
return d.userRelation$entity;
|
return d.userRelation$entity;
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "oak-domain",
|
"name": "oak-domain",
|
||||||
"version": "5.0.17",
|
"version": "5.0.18",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "XuChang"
|
"name": "XuChang"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ export function translateCheckerInAsyncContext<
|
||||||
});
|
});
|
||||||
|
|
||||||
const e = new OakRowInconsistencyException<ED>(errMsg);
|
const e = new OakRowInconsistencyException<ED>(errMsg);
|
||||||
e.addData(entity2, rows2);
|
e.addData(entity2, rows2, context.getSchema());
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -293,7 +293,7 @@ export function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt
|
||||||
([row]) => {
|
([row]) => {
|
||||||
if (row) {
|
if (row) {
|
||||||
const err = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${e as string}」关联的行`);
|
const err = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${e as string}」关联的行`);
|
||||||
err.addData(e, [row]);
|
err.addData(e, [row], context.getSchema());
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -304,7 +304,7 @@ export function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt
|
||||||
const [row] = result;
|
const [row] = result;
|
||||||
if (row) {
|
if (row) {
|
||||||
const err = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${e as string}」关联的行`);
|
const err = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${e as string}」关联的行`);
|
||||||
err.addData(e, [row]);
|
err.addData(e, [row], context.getSchema());
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -332,7 +332,7 @@ export function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt
|
||||||
([row]) => {
|
([row]) => {
|
||||||
if (row) {
|
if (row) {
|
||||||
const e = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${otm as string}」关联的行`);
|
const e = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${otm as string}」关联的行`);
|
||||||
e.addData(otm, [row]);
|
e.addData(otm, [row], context.getSchema());
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -351,7 +351,7 @@ export function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt
|
||||||
}
|
}
|
||||||
} as SelectOpResult<ED>;
|
} as SelectOpResult<ED>;
|
||||||
const e = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${otm as string}」关联的行`);
|
const e = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${otm as string}」关联的行`);
|
||||||
e.addData(otm, [row]);
|
e.addData(otm, [row], context.getSchema());
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -466,7 +466,7 @@ function unionFilterSegment<ED extends EntityDict & BaseEntityDict, T extends ke
|
||||||
['#sqp']: sqpOp1,
|
['#sqp']: sqpOp1,
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// not in情况子查询变成and
|
// not in情况子查询变成and
|
||||||
|
|
@ -476,6 +476,7 @@ function unionFilterSegment<ED extends EntityDict & BaseEntityDict, T extends ke
|
||||||
['#sqp']: sqpOp1,
|
['#sqp']: sqpOp1,
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
import { IncomingHttpHeaders } from "http";
|
import { IncomingHttpHeaders } from "http";
|
||||||
import { SyncContext } from "../store/SyncRowStore";
|
import { SyncContext } from "../store/SyncRowStore";
|
||||||
import { EntityDict, OpRecord } from "./Entity";
|
import { EntityDict, OpRecord } from "./Entity";
|
||||||
|
import { EntityDict as BaseEntityDict } from '../base-app-domain';
|
||||||
import { OakException } from "./Exception";
|
import { OakException } from "./Exception";
|
||||||
|
|
||||||
export interface Connector<ED extends EntityDict, FrontCxt extends SyncContext<ED>> {
|
export interface Connector<ED extends EntityDict & BaseEntityDict, FrontCxt extends SyncContext<ED>> {
|
||||||
callAspect: (
|
callAspect: (
|
||||||
name: string,
|
name: string,
|
||||||
params: any,
|
params: any,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,11 @@
|
||||||
import assert from "assert";
|
import assert from "assert";
|
||||||
|
import { StorageSchema } from ".";
|
||||||
|
import { judgeRelation } from "../store/relation";
|
||||||
import { EntityDict, OpRecord, SelectOpResult } from "./Entity";
|
import { EntityDict, OpRecord, SelectOpResult } from "./Entity";
|
||||||
|
import { EntityDict as BaseEntityDict } from '../base-app-domain';
|
||||||
|
import { pick } from '../utils/lodash';
|
||||||
|
|
||||||
export class OakException<ED extends EntityDict> extends Error {
|
export class OakException<ED extends EntityDict & BaseEntityDict> extends Error {
|
||||||
opRecords: OpRecord<ED>[];
|
opRecords: OpRecord<ED>[];
|
||||||
constructor(message?: string) {
|
constructor(message?: string) {
|
||||||
super(message);
|
super(message);
|
||||||
|
|
@ -17,19 +21,61 @@ export class OakException<ED extends EntityDict> extends Error {
|
||||||
this.opRecords = [];
|
this.opRecords = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
addData<T extends keyof ED>(entity: T, rows: Partial<ED[T]['OpSchema']>[]) {
|
addData<T extends keyof ED>(entity: T, rows: Partial<ED[T]['Schema']>[], schema: StorageSchema<ED>) {
|
||||||
const record: SelectOpResult<ED> = {
|
const rowDict: {
|
||||||
a: 's',
|
[K in keyof ED]?: Record<string, Partial<ED[K]['OpSchema']>>;
|
||||||
d: {
|
} = {};
|
||||||
[entity]: {},
|
const addToRowDict = <K extends keyof ED>(entity: K, row: Partial<ED[K]['OpSchema']>) => {
|
||||||
|
if (!rowDict[entity]) {
|
||||||
|
rowDict[entity] = {
|
||||||
|
[row.id!]: row,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
} as SelectOpResult<ED>;
|
else {
|
||||||
|
if (rowDict[entity]![row.id!]) {
|
||||||
|
Object.assign(rowDict[entity]![row.id!], row);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rowDict[entity]![row.id!] = row as any;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const addInner = <K extends keyof ED>(entity: K, row: Partial<ED[K]['Schema']>) => {
|
||||||
|
const ownAttrs: string[] = [];
|
||||||
|
for (const attr in row) {
|
||||||
|
const rel = judgeRelation(schema, entity, attr);
|
||||||
|
if (rel === 1) {
|
||||||
|
ownAttrs.push(attr);
|
||||||
|
}
|
||||||
|
else if (rel === 2) {
|
||||||
|
addInner(attr, row[attr]!);
|
||||||
|
}
|
||||||
|
else if (typeof rel === 'string') {
|
||||||
|
addInner(rel, row[attr]!);
|
||||||
|
}
|
||||||
|
else if (rel instanceof Array) {
|
||||||
|
(row[attr]!).forEach(
|
||||||
|
(ele: Partial<ED[keyof ED]['Schema']>) => addInner(rel[0], ele)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
addToRowDict(entity, pick(row, ownAttrs) as Partial<ED[K]['Schema']>);
|
||||||
|
};
|
||||||
for (const row of rows) {
|
for (const row of rows) {
|
||||||
(record as any).d[entity][row.id] = row;
|
addInner(entity, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const entity in rowDict) {
|
||||||
|
const record = {
|
||||||
|
a: 's',
|
||||||
|
d: {
|
||||||
|
[entity]: rowDict[entity],
|
||||||
|
}
|
||||||
|
} as SelectOpResult<ED>;
|
||||||
this.opRecords.push(record);
|
this.opRecords.push(record);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setOpRecords(opRecords: OpRecord<ED>[]) {
|
setOpRecords(opRecords: OpRecord<ED>[]) {
|
||||||
this.opRecords = opRecords;
|
this.opRecords = opRecords;
|
||||||
|
|
@ -57,15 +103,15 @@ export class OakException<ED extends EntityDict> extends Error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 这个异常表示模块自己处理跨事务一致性,框架pass(在分布式数据传递时会用到)
|
// 这个异常表示模块自己处理跨事务一致性,框架pass(在分布式数据传递时会用到)
|
||||||
export class OakMakeSureByMySelfException<ED extends EntityDict> extends OakException<ED> {
|
export class OakMakeSureByMySelfException<ED extends EntityDict & BaseEntityDict> extends OakException<ED> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class OakDataException<ED extends EntityDict> extends OakException<ED> {
|
export class OakDataException<ED extends EntityDict & BaseEntityDict> extends OakException<ED> {
|
||||||
// 表示由数据层发现的异常
|
// 表示由数据层发现的异常
|
||||||
}
|
}
|
||||||
|
|
||||||
export class OakNoRelationDefException<ED extends EntityDict, T extends keyof ED> extends OakDataException<ED> {
|
export class OakNoRelationDefException<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends OakDataException<ED> {
|
||||||
entity: T;
|
entity: T;
|
||||||
actions: ED[T]['Action'][];
|
actions: ED[T]['Action'][];
|
||||||
constructor(entity: T, actions: ED[T]['Action'][], msg?: string) {
|
constructor(entity: T, actions: ED[T]['Action'][], msg?: string) {
|
||||||
|
|
@ -84,11 +130,11 @@ export class OakNoRelationDefException<ED extends EntityDict, T extends keyof ED
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class OakOperExistedException<ED extends EntityDict> extends OakDataException<ED> {
|
export class OakOperExistedException<ED extends EntityDict & BaseEntityDict> extends OakDataException<ED> {
|
||||||
// 进行操作时发现同样id的Oper对象已经存在
|
// 进行操作时发现同样id的Oper对象已经存在
|
||||||
}
|
}
|
||||||
|
|
||||||
export class OakRowUnexistedException<ED extends EntityDict> extends OakDataException<ED> {
|
export class OakRowUnexistedException<ED extends EntityDict & BaseEntityDict> extends OakDataException<ED> {
|
||||||
private rows: Array<{
|
private rows: Array<{
|
||||||
entity: any;
|
entity: any;
|
||||||
selection: any;
|
selection: any;
|
||||||
|
|
@ -115,12 +161,12 @@ export class OakRowUnexistedException<ED extends EntityDict> extends OakDataExce
|
||||||
/**
|
/**
|
||||||
* 可接受的、由用户操作造成的异常
|
* 可接受的、由用户操作造成的异常
|
||||||
*/
|
*/
|
||||||
export class OakUserException<ED extends EntityDict> extends OakException<ED> {
|
export class OakUserException<ED extends EntityDict & BaseEntityDict> extends OakException<ED> {
|
||||||
// 继承了这个类的异常统一视为“可接受的、由用户操作造成的异常”
|
// 继承了这个类的异常统一视为“可接受的、由用户操作造成的异常”
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export class OakUniqueViolationException<ED extends EntityDict> extends OakUserException<ED> {
|
export class OakUniqueViolationException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
rows: Array<{
|
rows: Array<{
|
||||||
id?: string;
|
id?: string;
|
||||||
attrs: string[];
|
attrs: string[];
|
||||||
|
|
@ -134,7 +180,7 @@ export class OakUniqueViolationException<ED extends EntityDict> extends OakUserE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class OakImportDataParseException<ED extends EntityDict> extends OakUserException<ED> {
|
export class OakImportDataParseException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
line: number;
|
line: number;
|
||||||
header?: string;
|
header?: string;
|
||||||
|
|
||||||
|
|
@ -149,12 +195,12 @@ export class OakImportDataParseException<ED extends EntityDict> extends OakUserE
|
||||||
/**
|
/**
|
||||||
* 网络中断异常
|
* 网络中断异常
|
||||||
*/
|
*/
|
||||||
export class OakNetworkException<ED extends EntityDict> extends OakException<ED> {
|
export class OakNetworkException<ED extends EntityDict & BaseEntityDict> extends OakException<ED> {
|
||||||
// 网络访问异常
|
// 网络访问异常
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
export class OakServerProxyException<ED extends EntityDict> extends OakException<ED> {
|
export class OakServerProxyException<ED extends EntityDict & BaseEntityDict> extends OakException<ED> {
|
||||||
// 服务器反射异常(请求未能到达应用服务程序)
|
// 服务器反射异常(请求未能到达应用服务程序)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -164,7 +210,7 @@ export class OakServerProxyException<ED extends EntityDict> extends OakException
|
||||||
* 数据不一致异常,系统认为现有的数据不允许相应的动作时抛此异常
|
* 数据不一致异常,系统认为现有的数据不允许相应的动作时抛此异常
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
export class OakRowInconsistencyException<ED extends EntityDict> extends OakUserException<ED> {
|
export class OakRowInconsistencyException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
toString(): string {
|
toString(): string {
|
||||||
const data = super.getSerialData();
|
const data = super.getSerialData();
|
||||||
return JSON.stringify(data);
|
return JSON.stringify(data);
|
||||||
|
|
@ -174,7 +220,7 @@ export class OakRowInconsistencyException<ED extends EntityDict> extends OakUser
|
||||||
/**
|
/**
|
||||||
* 当输入的数据非法时抛此异常,attributes表示非法的属性
|
* 当输入的数据非法时抛此异常,attributes表示非法的属性
|
||||||
*/
|
*/
|
||||||
export class OakInputIllegalException<ED extends EntityDict> extends OakUserException<ED> {
|
export class OakInputIllegalException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
private attributes: string[];
|
private attributes: string[];
|
||||||
private entity: keyof ED;
|
private entity: keyof ED;
|
||||||
constructor(entity: keyof ED, attributes: string[], message?: string) {
|
constructor(entity: keyof ED, attributes: string[], message?: string) {
|
||||||
|
|
@ -210,7 +256,7 @@ export class OakInputIllegalException<ED extends EntityDict> extends OakUserExce
|
||||||
/**
|
/**
|
||||||
* 属性为空时抛的异常
|
* 属性为空时抛的异常
|
||||||
*/
|
*/
|
||||||
export class OakAttrNotNullException<ED extends EntityDict> extends OakInputIllegalException<ED> {
|
export class OakAttrNotNullException<ED extends EntityDict & BaseEntityDict> extends OakInputIllegalException<ED> {
|
||||||
constructor(entity: keyof ED, attributes: string[], message?: string) {
|
constructor(entity: keyof ED, attributes: string[], message?: string) {
|
||||||
super(entity, attributes, message || `属性[${attributes.join(',')}]不允许为空`);
|
super(entity, attributes, message || `属性[${attributes.join(',')}]不允许为空`);
|
||||||
}
|
}
|
||||||
|
|
@ -219,7 +265,7 @@ export class OakAttrNotNullException<ED extends EntityDict> extends OakInputIlle
|
||||||
/**
|
/**
|
||||||
* 属性不允许更新抛的异常,前端可以用这个异常来处理update时对应属性的露出
|
* 属性不允许更新抛的异常,前端可以用这个异常来处理update时对应属性的露出
|
||||||
*/
|
*/
|
||||||
export class OakAttrCantUpdateException<ED extends EntityDict> extends OakInputIllegalException<ED> {
|
export class OakAttrCantUpdateException<ED extends EntityDict & BaseEntityDict> extends OakInputIllegalException<ED> {
|
||||||
constructor(entity: keyof ED, attributes: string[], message?: string) {
|
constructor(entity: keyof ED, attributes: string[], message?: string) {
|
||||||
super(entity, attributes, message || `属性[${attributes.join(',')}]不允许更新`);
|
super(entity, attributes, message || `属性[${attributes.join(',')}]不允许更新`);
|
||||||
}
|
}
|
||||||
|
|
@ -228,7 +274,7 @@ export class OakAttrCantUpdateException<ED extends EntityDict> extends OakInputI
|
||||||
/**
|
/**
|
||||||
* 用户权限不够时抛的异常
|
* 用户权限不够时抛的异常
|
||||||
*/
|
*/
|
||||||
export class OakUserUnpermittedException<ED extends EntityDict, T extends keyof ED> extends OakUserException<ED> {
|
export class OakUserUnpermittedException<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends OakUserException<ED> {
|
||||||
private entity: T;
|
private entity: T;
|
||||||
private operation: ED[T]['Selection'] | ED[T]['Operation'];
|
private operation: ED[T]['Selection'] | ED[T]['Operation'];
|
||||||
|
|
||||||
|
|
@ -252,7 +298,7 @@ export class OakUserUnpermittedException<ED extends EntityDict, T extends keyof
|
||||||
/**
|
/**
|
||||||
* 用户查询权限不够抛出异常
|
* 用户查询权限不够抛出异常
|
||||||
*/
|
*/
|
||||||
export class OakUserInvisibleException<ED extends EntityDict, T extends keyof ED> extends OakUserException<ED> {
|
export class OakUserInvisibleException<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends OakUserException<ED> {
|
||||||
private entity: T;
|
private entity: T;
|
||||||
private operation: ED[T]['Selection'] | ED[T]['Operation'];
|
private operation: ED[T]['Selection'] | ED[T]['Operation'];
|
||||||
|
|
||||||
|
|
@ -277,7 +323,7 @@ export class OakUserInvisibleException<ED extends EntityDict, T extends keyof ED
|
||||||
/**
|
/**
|
||||||
* 用户未登录抛的异常
|
* 用户未登录抛的异常
|
||||||
*/
|
*/
|
||||||
export class OakUnloggedInException<ED extends EntityDict> extends OakUserException<ED> {
|
export class OakUnloggedInException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
constructor(message?: string) {
|
constructor(message?: string) {
|
||||||
super(message || '您尚未登录');
|
super(message || '您尚未登录');
|
||||||
}
|
}
|
||||||
|
|
@ -287,7 +333,7 @@ export class OakUnloggedInException<ED extends EntityDict> extends OakUserExcept
|
||||||
/**
|
/**
|
||||||
* 用户未登录抛的异常
|
* 用户未登录抛的异常
|
||||||
*/
|
*/
|
||||||
export class OakRowLockedException<ED extends EntityDict> extends OakUserException<ED> {
|
export class OakRowLockedException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
constructor(message?: string) {
|
constructor(message?: string) {
|
||||||
super(message || '该行数据正在被更新中,请稍后再试');
|
super(message || '该行数据正在被更新中,请稍后再试');
|
||||||
}
|
}
|
||||||
|
|
@ -295,7 +341,7 @@ export class OakUnloggedInException<ED extends EntityDict> extends OakUserExcept
|
||||||
/**
|
/**
|
||||||
* 要插入行时,发现已经有相同的行数据
|
* 要插入行时,发现已经有相同的行数据
|
||||||
*/
|
*/
|
||||||
export class OakCongruentRowExists<ED extends EntityDict, T extends keyof ED> extends OakUserException<ED> {
|
export class OakCongruentRowExists<ED extends EntityDict & BaseEntityDict, T extends keyof ED> extends OakUserException<ED> {
|
||||||
private data: ED[T]['OpSchema'];
|
private data: ED[T]['OpSchema'];
|
||||||
private entity: T;
|
private entity: T;
|
||||||
constructor(entity: T, data: ED[T]['OpSchema'], message?: string) {
|
constructor(entity: T, data: ED[T]['OpSchema'], message?: string) {
|
||||||
|
|
@ -325,7 +371,7 @@ export class OakCongruentRowExists<ED extends EntityDict, T extends keyof ED> ex
|
||||||
/**
|
/**
|
||||||
* 死锁抛的异常
|
* 死锁抛的异常
|
||||||
*/
|
*/
|
||||||
export class OakDeadlock<ED extends EntityDict> extends OakUserException<ED> {
|
export class OakDeadlock<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
constructor(message?: string | undefined) {
|
constructor(message?: string | undefined) {
|
||||||
super(message || '发现死锁');
|
super(message || '发现死锁');
|
||||||
}
|
}
|
||||||
|
|
@ -334,7 +380,7 @@ export class OakDeadlock<ED extends EntityDict> extends OakUserException<ED> {
|
||||||
/**
|
/**
|
||||||
* 前置条件不满足抛的异常
|
* 前置条件不满足抛的异常
|
||||||
*/
|
*/
|
||||||
export class OakPreConditionUnsetException<ED extends EntityDict> extends OakUserException<ED> {
|
export class OakPreConditionUnsetException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
entity?: keyof ED;
|
entity?: keyof ED;
|
||||||
code?: string;
|
code?: string;
|
||||||
|
|
||||||
|
|
@ -358,7 +404,7 @@ export class OakPreConditionUnsetException<ED extends EntityDict> extends OakUse
|
||||||
/**
|
/**
|
||||||
* 调用外部接口抛出的异常
|
* 调用外部接口抛出的异常
|
||||||
*/
|
*/
|
||||||
export class OakExternalException<ED extends EntityDict> extends OakUserException<ED> {
|
export class OakExternalException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
|
||||||
code?: string;
|
code?: string;
|
||||||
source: string;
|
source: string;
|
||||||
data?: any;
|
data?: any;
|
||||||
|
|
@ -381,7 +427,7 @@ export class OakExternalException<ED extends EntityDict> extends OakUserExceptio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function makeException<ED extends EntityDict>(data: {
|
export function makeException<ED extends EntityDict & BaseEntityDict>(data: {
|
||||||
name: string;
|
name: string;
|
||||||
message?: string;
|
message?: string;
|
||||||
opRecords: OpRecord<ED>[];
|
opRecords: OpRecord<ED>[];
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,10 @@ import { Stream } from 'stream';
|
||||||
import URL from 'url';
|
import URL from 'url';
|
||||||
import { SyncContext } from '../store/SyncRowStore';
|
import { SyncContext } from '../store/SyncRowStore';
|
||||||
import { Connector, EntityDict, OakException, OakNetworkException, OakServerProxyException, OpRecord } from "../types";
|
import { Connector, EntityDict, OakException, OakNetworkException, OakServerProxyException, OpRecord } from "../types";
|
||||||
|
import { EntityDict as BaseEntityDict } from '../base-app-domain';
|
||||||
import { AccessConfiguration } from '../types/Configuration';
|
import { AccessConfiguration } from '../types/Configuration';
|
||||||
|
|
||||||
export default class SimpleConnector<ED extends EntityDict, FrontCxt extends SyncContext<ED>>
|
export default class SimpleConnector<ED extends EntityDict & BaseEntityDict, FrontCxt extends SyncContext<ED>>
|
||||||
implements Connector<ED, FrontCxt>
|
implements Connector<ED, FrontCxt>
|
||||||
{
|
{
|
||||||
static ASPECT_ROUTER = '/aspect';
|
static ASPECT_ROUTER = '/aspect';
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue