oak-domain/lib/types/Exception.js

499 lines
15 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.makeException = exports.OakSocketConnectException = 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.OakPartialSuccess = 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) {
super(message);
this.name = new.target.name;
if (typeof Error.captureStackTrace === 'function') {
Error.captureStackTrace(this, new.target);
}
if (typeof Object.setPrototypeOf === 'function') {
Object.setPrototypeOf(this, new.target.prototype);
}
else {
this.__proto__ = new.target.prototype;
}
this.opRecords = [];
}
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]: rowDict[entity],
}
};
this.opRecords.push(record);
}
}
setOpRecords(opRecords) {
this.opRecords = opRecords;
}
getSerialData() {
return {
name: this.constructor.name,
message: this.message,
opRecords: this.opRecords,
tag1: this.tag1,
tag2: this.tag2,
tag3: this.tag3,
};
}
toString() {
return JSON.stringify(this.getSerialData());
}
// 留三个tag1供其它类使用
tag1;
tag2;
tag3;
}
exports.OakException = OakException;
// 这个异常表示模块自己处理跨事务一致性框架pass在分布式数据传递时会用到backend-base老版本有使用先保留
class OakMakeSureByMySelfException extends OakException {
}
exports.OakMakeSureByMySelfException = OakMakeSureByMySelfException;
// 这个异常表示事务虽然没有完全成功,但是仍然应该提交并抛出异常(在分布式数据传递时会用到)
class OakPartialSuccess extends OakException {
}
exports.OakPartialSuccess = OakPartialSuccess;
class OakDataException extends OakException {
}
exports.OakDataException = OakDataException;
class OakNoRelationDefException extends OakDataException {
entity;
actions;
constructor(entity, actions, msg) {
super(msg || `对象${entity}的操作${actions.join(',')}找不到有效的relation定义`);
this.entity = entity;
this.actions = actions;
}
toString() {
const data = super.getSerialData();
return JSON.stringify({
...data,
entity: this.entity,
action: this.actions,
});
}
}
exports.OakNoRelationDefException = OakNoRelationDefException;
class OakOperExistedException extends OakDataException {
}
exports.OakOperExistedException = OakOperExistedException;
class OakRowUnexistedException extends OakDataException {
rows;
// 指定主键查询时却发现行不存在,一般发生在缓存中
constructor(rows) {
super(`查询${rows.map(ele => ele.entity).join(',')}对象时发现了空指针,请检查数据一致性`);
this.rows = rows;
}
toString() {
const data = super.getSerialData();
return JSON.stringify({
...data,
rows: this.rows
});
}
getRows() {
return this.rows;
}
}
exports.OakRowUnexistedException = OakRowUnexistedException;
/**
* 可接受的、由用户操作造成的异常
*/
class OakUserException extends OakException {
}
exports.OakUserException = OakUserException;
;
class OakUniqueViolationException extends OakUserException {
rows;
constructor(rows, message) {
super(message || '您更新的数据违反了唯一性约束');
this.rows = rows;
}
}
exports.OakUniqueViolationException = OakUniqueViolationException;
class OakImportDataParseException extends OakUserException {
line;
header;
// message必传描述具体错误的数据内容
constructor(message, line, header) {
super(message);
this.line = line;
this.header = header;
}
}
exports.OakImportDataParseException = OakImportDataParseException;
/**
* 网络中断异常
*/
class OakNetworkException extends OakException {
}
exports.OakNetworkException = OakNetworkException;
//
class OakServerProxyException extends OakException {
}
exports.OakServerProxyException = OakServerProxyException;
// 在系统更新数据时,以下三个异常应按规范依次抛出。
/**
* 数据不一致异常,系统认为现有的数据不允许相应的动作时抛此异常
*
*/
class OakRowInconsistencyException extends OakUserException {
toString() {
const data = super.getSerialData();
return JSON.stringify(data);
}
}
exports.OakRowInconsistencyException = OakRowInconsistencyException;
;
/**
* 当输入的数据非法时抛此异常attributes表示非法的属性
*/
class OakInputIllegalException extends OakUserException {
attributes;
entity;
constructor(entity, attributes, message) {
super(message);
this.entity = entity;
this.attributes = attributes;
}
getEntity() {
return this.entity;
}
getAttributes() {
return this.attributes;
}
addAttributesPrefix(prefix) {
this.attributes = this.attributes.map(ele => `${prefix}.${ele}`);
}
toString() {
const data = super.getSerialData();
return JSON.stringify({
...data,
entity: this.entity,
attributes: this.attributes,
});
}
}
exports.OakInputIllegalException = OakInputIllegalException;
;
/**
* 属性为空时抛的异常
*/
class OakAttrNotNullException extends OakInputIllegalException {
constructor(entity, attributes, message) {
super(entity, attributes, message || `属性[${attributes.join(',')}]不允许为空`);
}
}
exports.OakAttrNotNullException = OakAttrNotNullException;
/**
* 属性不允许更新抛的异常前端可以用这个异常来处理update时对应属性的露出
*/
class OakAttrCantUpdateException extends OakInputIllegalException {
constructor(entity, attributes, message) {
super(entity, attributes, message || `属性[${attributes.join(',')}]不允许更新`);
}
}
exports.OakAttrCantUpdateException = OakAttrCantUpdateException;
/**
* 用户权限不够时抛的异常
*/
class OakUserUnpermittedException extends OakUserException {
entity;
operation;
constructor(entity, operation, message) {
super(message || '用户操作权限不足');
this.entity = entity;
this.operation = operation;
}
toString() {
const data = super.getSerialData();
return JSON.stringify({
...data,
entity: this.entity,
operation: this.operation,
});
}
}
exports.OakUserUnpermittedException = OakUserUnpermittedException;
;
/**
* 用户查询权限不够抛出异常
*/
class OakUserInvisibleException extends OakUserException {
entity;
operation;
constructor(entity, operation, message) {
super(message || '用户查询权限不足');
this.entity = entity;
this.operation = operation;
}
toString() {
const data = super.getSerialData();
return JSON.stringify({
...data,
entity: this.entity,
operation: this.operation,
});
}
}
exports.OakUserInvisibleException = OakUserInvisibleException;
;
/**
* 用户未登录抛的异常
*/
class OakUnloggedInException extends OakUserException {
constructor(message) {
super(message || '您尚未登录');
}
}
exports.OakUnloggedInException = OakUnloggedInException;
;
/**
* 用户未登录抛的异常
*/
class OakRowLockedException extends OakUserException {
constructor(message) {
super(message || '该行数据正在被更新中,请稍后再试');
}
}
exports.OakRowLockedException = OakRowLockedException;
;
/**
* 要插入行时,发现已经有相同的行数据
*/
class OakCongruentRowExists extends OakUserException {
data;
entity;
constructor(entity, data, message) {
super(message);
this.data = data;
this.entity = entity;
}
getData() {
return this.data;
}
getEntity() {
return this.entity;
}
toString() {
const data = super.getSerialData();
return JSON.stringify({
...data,
data: this.data,
entity: this.entity,
});
}
}
exports.OakCongruentRowExists = OakCongruentRowExists;
/**
* 死锁抛的异常
*/
class OakDeadlock extends OakUserException {
constructor(message) {
super(message || '发现死锁');
}
}
exports.OakDeadlock = OakDeadlock;
;
/**
* 前置条件不满足抛的异常
*/
class OakPreConditionUnsetException extends OakUserException {
entity;
code;
constructor(message, entity, code) {
super(message || '前置条件不满足');
this.entity = entity,
this.code = code;
}
toString() {
const data = super.getSerialData();
return JSON.stringify({
...data,
code: this.code,
entity: this.entity,
});
}
}
exports.OakPreConditionUnsetException = OakPreConditionUnsetException;
/**
* 调用外部接口抛出的异常
*/
class OakExternalException extends OakUserException {
code;
source;
data;
constructor(source, code, message, data) {
super(message);
this.code = code;
this.source = source;
this.data = data;
}
toString() {
const data = super.getSerialData();
return JSON.stringify({
...data,
code: this.code,
source: this.source,
data: this.data,
});
}
}
exports.OakExternalException = OakExternalException;
/**
* socket连接异常
*/
class OakSocketConnectException extends OakUserException {
constructor(message) {
super(message || '连接出现问题,请尝试刷新页面');
}
}
exports.OakSocketConnectException = OakSocketConnectException;
;
function makeException(data) {
const { name } = data;
let e = undefined;
switch (name) {
case 'OakException': {
e = new OakException(data.message);
break;
}
case 'OakUserException': {
e = new OakUserException(data.message);
break;
}
case 'OakRowInconsistencyException': {
e = new OakRowInconsistencyException(data.message);
break;
}
case 'OakInputIllegalException': {
e = new OakInputIllegalException(data.entity, data.attributes, data.message);
break;
}
case 'OakAttrCantUpdateException': {
e = new OakAttrCantUpdateException(data.entity, data.attributes, data.message);
break;
}
case 'OakUserUnpermittedException': {
e = new OakUserUnpermittedException(data.entity, data.operation, data.message);
break;
}
case 'OakUserInvisibleException': {
e = new OakUserInvisibleException(data.entity, data.operation, data.message);
break;
}
case 'OakUnloggedInException': {
e = new OakUnloggedInException(data.message);
break;
}
case 'OakCongruentRowExists': {
e = new OakCongruentRowExists(data.entity, data.data, data.message);
break;
}
case 'OakRowLockedException': {
e = new OakRowLockedException(data.message);
break;
}
case 'OakRowUnexistedException': {
e = new OakRowUnexistedException(data.rows);
break;
}
case 'OakDeadlock': {
e = new OakDeadlock(data.message);
break;
}
case 'OakDataException': {
e = new OakDataException(data.message);
break;
}
case 'OakNoRelationDefException': {
e = new OakNoRelationDefException(data.entity, data.action, data.message);
break;
}
case 'OakUniqueViolationException': {
e = new OakUniqueViolationException(data.rows, data.message);
break;
}
case 'OakImportDataParseException': {
e = new OakImportDataParseException(data.message, data.line, data.header);
break;
}
case 'OakPreConditionUnsetException': {
e = new OakPreConditionUnsetException(data.message, data.entity, data.code);
break;
}
case 'OakAttrNotNullException': {
e = new OakAttrNotNullException(data.entity, data.attributes, data.message);
break;
}
case 'OakExternalException': {
e = new OakExternalException(data.source, data.code, data.message, data.data);
break;
}
case 'OakNetworkException': {
e = new OakNetworkException(data.message);
break;
}
case 'OakServerProxyException': {
e = new OakServerProxyException(data.message);
break;
}
case 'OakSocketConnectException': {
e = new OakSocketConnectException(data.message);
break;
}
default:
return;
}
if (e) {
e.setOpRecords(data.opRecords);
return e;
}
}
exports.makeException = makeException;