Merge branch 'dev' of gitea.51mars.com:Oak-Team/oak-domain into dev

This commit is contained in:
Xu Chang 2024-07-29 15:07:35 +08:00
commit 14154e5f82
15 changed files with 179 additions and 86 deletions

View File

@ -79,7 +79,7 @@ function createUniqueCheckers(schema) {
entity,
action: 'create',
type: 'logicalData',
priority: types_1.CHECKER_MAX_PRIORITY, // 优先级要放在最低所有前置的checker/trigger将数据完整之后再在这里检测
priority: types_1.CHECKER_MAX_PRIORITY,
checker: (operation, context) => {
const { data } = operation;
if (data instanceof Array) {
@ -95,9 +95,9 @@ function createUniqueCheckers(schema) {
}
}, {
entity,
action: 'update', // 只检查update其它状态转换的action应该不会涉及unique约束的属性
action: 'update',
type: 'logicalData',
priority: types_1.CHECKER_MAX_PRIORITY, // 优先级要放在最低所有前置的checker/trigger将数据完整之后再在这里检测
priority: types_1.CHECKER_MAX_PRIORITY,
checker: (operation, context) => {
const { data, filter: operationFilter } = operation;
if (data) {
@ -227,7 +227,7 @@ function createActionTransformerCheckers(actionDefDict) {
action: 'create',
type: 'logical',
entity,
priority: 10, // 优先级要高先于真正的data检查进行
priority: 10,
checker: (operation) => {
const { data } = operation;
if (data instanceof Array) {

View File

@ -67,7 +67,7 @@ function translateCheckerInAsyncContext(checker, schema) {
blockTrigger: true,
});
const e = new Exception_1.OakRowInconsistencyException(errMsg);
e.addData(entity2, rows2);
e.addData(entity2, rows2, context.getSchema());
throw e;
}
else {
@ -265,7 +265,7 @@ function createRemoveCheckers(schema) {
promises.push(result.then(([row]) => {
if (row) {
const err = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${e}」关联的行`);
err.addData(e, [row]);
err.addData(e, [row], context.getSchema());
throw err;
}
}));
@ -274,7 +274,7 @@ function createRemoveCheckers(schema) {
const [row] = result;
if (row) {
const err = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${e}」关联的行`);
err.addData(e, [row]);
err.addData(e, [row], context.getSchema());
throw err;
}
}
@ -300,7 +300,7 @@ function createRemoveCheckers(schema) {
promises.push(result.then(([row]) => {
if (row) {
const e = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${otm}」关联的行`);
e.addData(otm, [row]);
e.addData(otm, [row], context.getSchema());
throw e;
}
}));
@ -317,7 +317,7 @@ function createRemoveCheckers(schema) {
}
};
const e = new Exception_1.OakRowInconsistencyException(`您无法删除存在有效数据「${otm}」关联的行`);
e.addData(otm, [row]);
e.addData(otm, [row], context.getSchema());
throw e;
}
}

View File

@ -425,6 +425,7 @@ function unionFilterSegment(entity, schema, ...filters) {
['#sqp']: sqpOp1,
})
});
return true;
}
else {
// not in情况子查询变成and
@ -434,6 +435,7 @@ function unionFilterSegment(entity, schema, ...filters) {
['#sqp']: sqpOp1,
})
});
return true;
}
}
}

View File

@ -2,8 +2,9 @@
import { IncomingHttpHeaders } from "http";
import { SyncContext } from "../store/SyncRowStore";
import { EntityDict, OpRecord } from "./Entity";
import { EntityDict as BaseEntityDict } from '../base-app-domain';
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<{
result: any;
opRecords?: OpRecord<ED>[];

View File

@ -1,8 +1,10 @@
import { StorageSchema } from ".";
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>[];
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;
getSerialData(): {
name: string;
@ -17,19 +19,19 @@ export declare class OakException<ED extends EntityDict> extends Error {
tag2?: boolean;
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;
actions: ED[T]['Action'][];
constructor(entity: T, actions: ED[T]['Action'][], msg?: 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;
constructor(rows: Array<{
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<{
id?: string;
attrs: string[];
@ -56,7 +58,7 @@ export declare class OakUniqueViolationException<ED extends EntityDict> extends
attrs: 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;
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;
}
/**
* 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 entity;
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);
}
/**
* 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);
}
/**
*
*/
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 operation;
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 operation;
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);
}
/**
*
*/
export declare class OakRowLockedException<ED extends EntityDict> extends OakUserException<ED> {
export declare class OakRowLockedException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
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 entity;
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);
}
/**
*
*/
export declare class OakPreConditionUnsetException<ED extends EntityDict> extends OakUserException<ED> {
export declare class OakPreConditionUnsetException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
entity?: keyof ED;
code?: string;
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;
source: string;
data?: any;
constructor(source: string, code?: string, message?: string, data?: any);
toString(): string;
}
export declare function makeException<ED extends EntityDict>(data: {
export declare function makeException<ED extends EntityDict & BaseEntityDict>(data: {
name: string;
message?: string;
opRecords: OpRecord<ED>[];

View File

@ -1,6 +1,8 @@
"use strict";
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;
const relation_1 = require("../store/relation");
const lodash_1 = require("../utils/lodash");
class OakException extends Error {
opRecords;
constructor(message) {
@ -17,18 +19,55 @@ class OakException extends Error {
}
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 = {
a: 's',
d: {
[entity]: {},
[entity]: rowDict[entity],
}
};
for (const row of rows) {
record.d[entity][row.id] = row;
}
this.opRecords.push(record);
}
}
setOpRecords(opRecords) {
this.opRecords = opRecords;
}

View File

@ -2,8 +2,9 @@
import { IncomingHttpHeaders } from "http";
import { SyncContext } from '../store/SyncRowStore';
import { Connector, EntityDict, OakException, OpRecord } from "../types";
import { EntityDict as BaseEntityDict } from '../base-app-domain';
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 BRIDGE_ROUTER: string;
static SUBSCRIBE_ROUTER: string;

View File

@ -1,4 +1,3 @@
/// <reference types="node" />
/**
* assert打包体积过大
*/

View File

@ -60,7 +60,7 @@ function destructRelationPath(schema, entity, path, relationFilter, recursive) {
},
filter: relationFilter,
} // as ED['userRelation']['Selection']
}, // as ED[keyof ED]['Selection']['data'],
},
getData: (d) => {
return d.userRelation$entity;
},

View File

@ -1,6 +1,6 @@
{
"name": "oak-domain",
"version": "5.0.17",
"version": "5.0.18",
"author": {
"name": "XuChang"
},

View File

@ -80,7 +80,7 @@ export function translateCheckerInAsyncContext<
});
const e = new OakRowInconsistencyException<ED>(errMsg);
e.addData(entity2, rows2);
e.addData(entity2, rows2, context.getSchema());
throw e;
}
else {
@ -293,7 +293,7 @@ export function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt
([row]) => {
if (row) {
const err = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${e as string}」关联的行`);
err.addData(e, [row]);
err.addData(e, [row], context.getSchema());
throw err;
}
}
@ -304,7 +304,7 @@ export function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt
const [row] = result;
if (row) {
const err = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${e as string}」关联的行`);
err.addData(e, [row]);
err.addData(e, [row], context.getSchema());
throw err;
}
}
@ -332,7 +332,7 @@ export function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt
([row]) => {
if (row) {
const e = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${otm as string}」关联的行`);
e.addData(otm, [row]);
e.addData(otm, [row], context.getSchema());
throw e;
}
}
@ -351,7 +351,7 @@ export function createRemoveCheckers<ED extends EntityDict & BaseEntityDict, Cxt
}
} as SelectOpResult<ED>;
const e = new OakRowInconsistencyException<ED>(`您无法删除存在有效数据「${otm as string}」关联的行`);
e.addData(otm, [row]);
e.addData(otm, [row], context.getSchema());
throw e;
}
}

View File

@ -466,7 +466,7 @@ function unionFilterSegment<ED extends EntityDict & BaseEntityDict, T extends ke
['#sqp']: sqpOp1,
})
});
return true;
}
else {
// not in情况子查询变成and
@ -476,6 +476,7 @@ function unionFilterSegment<ED extends EntityDict & BaseEntityDict, T extends ke
['#sqp']: sqpOp1,
})
});
return true;
}
}
}

View File

@ -1,9 +1,10 @@
import { IncomingHttpHeaders } from "http";
import { SyncContext } from "../store/SyncRowStore";
import { EntityDict, OpRecord } from "./Entity";
import { EntityDict as BaseEntityDict } from '../base-app-domain';
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,

View File

@ -1,7 +1,11 @@
import assert from "assert";
import { StorageSchema } from ".";
import { judgeRelation } from "../store/relation";
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>[];
constructor(message?: string) {
super(message);
@ -17,19 +21,61 @@ export class OakException<ED extends EntityDict> extends Error {
this.opRecords = [];
}
addData<T extends keyof ED>(entity: T, rows: Partial<ED[T]['OpSchema']>[]) {
const record: SelectOpResult<ED> = {
a: 's',
d: {
[entity]: {},
addData<T extends keyof ED>(entity: T, rows: Partial<ED[T]['Schema']>[], schema: StorageSchema<ED>) {
const rowDict: {
[K in keyof ED]?: Record<string, Partial<ED[K]['OpSchema']>>;
} = {};
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) {
(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);
}
}
setOpRecords(opRecords: OpRecord<ED>[]) {
this.opRecords = opRecords;
@ -57,15 +103,15 @@ export class OakException<ED extends EntityDict> extends Error {
}
// 这个异常表示模块自己处理跨事务一致性框架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;
actions: ED[T]['Action'][];
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对象已经存在
}
export class OakRowUnexistedException<ED extends EntityDict> extends OakDataException<ED> {
export class OakRowUnexistedException<ED extends EntityDict & BaseEntityDict> extends OakDataException<ED> {
private rows: Array<{
entity: 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<{
id?: 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;
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 {
const data = super.getSerialData();
return JSON.stringify(data);
@ -174,7 +220,7 @@ export class OakRowInconsistencyException<ED extends EntityDict> extends OakUser
/**
* attributes表示非法的属性
*/
export class OakInputIllegalException<ED extends EntityDict> extends OakUserException<ED> {
export class OakInputIllegalException<ED extends EntityDict & BaseEntityDict> extends OakUserException<ED> {
private attributes: string[];
private entity: keyof ED;
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) {
super(entity, attributes, message || `属性[${attributes.join(',')}]不允许为空`);
}
@ -219,7 +265,7 @@ export class OakAttrNotNullException<ED extends EntityDict> extends OakInputIlle
/**
* 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) {
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 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 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) {
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) {
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 entity: T;
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) {
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;
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;
source: string;
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;
message?: string;
opRecords: OpRecord<ED>[];

View File

@ -4,9 +4,10 @@ import { Stream } from 'stream';
import URL from 'url';
import { SyncContext } from '../store/SyncRowStore';
import { Connector, EntityDict, OakException, OakNetworkException, OakServerProxyException, OpRecord } from "../types";
import { EntityDict as BaseEntityDict } from '../base-app-domain';
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>
{
static ASPECT_ROUTER = '/aspect';