@tachybase/module-error-handler 1.6.1 → 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  module.exports = {
2
- "@tachybase/client": "1.6.1",
3
- "@tachybase/schema": "1.6.0-alpha.9",
4
- "@tego/server": "1.6.0-alpha.9",
2
+ "@tachybase/client": "1.6.3",
3
+ "@tachybase/schema": "1.6.1",
4
+ "@tego/server": "1.6.1",
5
5
  "lodash": "4.17.21"
6
6
  };
@@ -4,6 +4,11 @@
4
4
  "ERR_MISSING_FILTER_UPDATE": "Cannot update: please try again later or contact the administrator",
5
5
  "ERR_RELATION_NOT_EXIST": "The database table does not exist, please contact the administrator",
6
6
  "ERR_VALUE_TOO_LONG": "Content length or quantity exceeds the limit, please adjust accordingly",
7
+ "JWT_EXPIRED": "Your session has expired, please sign in again",
8
+ "JWT_INVALID_SIGNATURE": "Invalid token signature, please sign in again",
9
+ "JWT_INVALID_TOKEN": "Invalid token, please sign in again",
10
+ "JWT_MALFORMED": "Invalid token format, please sign in again",
11
+ "PERMISSION_DENIED": "You do not have permission to perform this operation",
7
12
  "Validation error": "{{field}} validation error",
8
13
  "notNull Violation": "{{field}} cannot be null",
9
14
  "notNull violation": "notNull violation",
@@ -1,4 +1,14 @@
1
1
  {
2
+ "ERR_DUPLICATE_KEY": "Datos duplicados detectados, por favor verifique y reenvíe",
3
+ "ERR_INVALID_TIMESTAMP": "Formato de fecha inválido, por favor corrija según las instrucciones",
4
+ "ERR_MISSING_FILTER_UPDATE": "No se puede actualizar: intente más tarde o contacte al administrador",
5
+ "ERR_RELATION_NOT_EXIST": "La tabla de base de datos no existe, por favor contacte al administrador",
6
+ "ERR_VALUE_TOO_LONG": "La longitud o cantidad de contenido excede el límite, por favor ajuste en consecuencia",
7
+ "JWT_EXPIRED": "Su sesión ha caducado, por favor inicie sesión nuevamente",
8
+ "JWT_INVALID_SIGNATURE": "Firma de token inválida, por favor inicie sesión nuevamente",
9
+ "JWT_INVALID_TOKEN": "Token inválido, por favor inicie sesión nuevamente",
10
+ "JWT_MALFORMED": "Formato de token inválido, por favor inicie sesión nuevamente",
11
+ "PERMISSION_DENIED": "No tiene permiso para realizar esta operación",
2
12
  "Validation error": "{{field}} error de validación",
3
13
  "notNull Violation": "{{field}} no puede ser null",
4
14
  "notNull violation": "notNull violación",
@@ -1,4 +1,14 @@
1
1
  {
2
+ "ERR_DUPLICATE_KEY": "Données en doublon détectées, veuillez vérifier et renvoyer",
3
+ "ERR_INVALID_TIMESTAMP": "Format de date invalide, veuillez corriger selon les instructions",
4
+ "ERR_MISSING_FILTER_UPDATE": "Impossible de mettre à jour : réessayez plus tard ou contactez l'administrateur",
5
+ "ERR_RELATION_NOT_EXIST": "La table de base de données n'existe pas, veuillez contacter l'administrateur",
6
+ "ERR_VALUE_TOO_LONG": "La longueur ou la quantité du contenu dépasse la limite, veuillez ajuster en conséquence",
7
+ "JWT_EXPIRED": "Votre session a expiré, veuillez vous reconnecter",
8
+ "JWT_INVALID_SIGNATURE": "Signature de token invalide, veuillez vous reconnecter",
9
+ "JWT_INVALID_TOKEN": "Token invalide, veuillez vous reconnecter",
10
+ "JWT_MALFORMED": "Format de token invalide, veuillez vous reconnecter",
11
+ "PERMISSION_DENIED": "Vous n'avez pas la permission d'effectuer cette opération",
2
12
  "Validation error": "Erreur de validation de {{field}}",
3
13
  "notNull Violation": "{{field}} ne peut pas être null",
4
14
  "notNull violation": "Violation de contrainte notNull",
@@ -1,4 +1,16 @@
1
1
  {
2
+ "ERR_DUPLICATE_KEY": "重複したデータが検出されました。確認して再度送信してください",
3
+ "ERR_INVALID_TIMESTAMP": "無効な日付形式です。指示に従って修正してください",
4
+ "ERR_MISSING_FILTER_UPDATE": "更新できません:後で再度お試しするか、管理者にお問い合わせください",
5
+ "ERR_RELATION_NOT_EXIST": "データベーステーブルが存在しません。管理者にお問い合わせください",
6
+ "ERR_VALUE_TOO_LONG": "コンテンツの長さまたは数量が制限を超えています。適切に調整してください",
7
+ "JWT_EXPIRED": "セッションの有効期限が切れています。もう一度ログインしてください",
8
+ "JWT_INVALID_SIGNATURE": "無効なトークン署名です。もう一度ログインしてください",
9
+ "JWT_INVALID_TOKEN": "無効なトークンです。もう一度ログインしてください",
10
+ "JWT_MALFORMED": "無効なトークン形式です。もう一度ログインしてください",
11
+ "PERMISSION_DENIED": "この操作を実行する権限がありません",
12
+ "Validation error": "{{field}} バリデーションエラー",
2
13
  "notNull Violation": "{{field}} はNullにできません",
14
+ "notNull violation": "notNull 違反",
3
15
  "unique violation": "{{field}} は一意でなくてはなりません"
4
16
  }
@@ -1,5 +1,16 @@
1
1
  {
2
+ "ERR_DUPLICATE_KEY": "중복된 데이터가 감지되었습니다. 확인 후 다시 제출하세요",
3
+ "ERR_INVALID_TIMESTAMP": "유효하지 않은 날짜 형식입니다. 지시에 따라 수정하세요",
4
+ "ERR_MISSING_FILTER_UPDATE": "업데이트할 수 없습니다. 나중에 다시 시도하거나 관리자에게 문의하세요",
5
+ "ERR_RELATION_NOT_EXIST": "데이터베이스 테이블이 존재하지 않습니다. 관리자에게 문의하세요",
6
+ "ERR_VALUE_TOO_LONG": "콘텐츠 길이 또는 수량이 제한을 초과합니다. 적절히 조정하세요",
7
+ "JWT_EXPIRED": "세션이 만료되었습니다. 다시 로그인하세요",
8
+ "JWT_INVALID_SIGNATURE": "유효하지 않은 토큰 서명입니다. 다시 로그인하세요",
9
+ "JWT_INVALID_TOKEN": "유효하지 않은 토큰입니다. 다시 로그인하세요",
10
+ "JWT_MALFORMED": "유효하지 않은 토큰 형식입니다. 다시 로그인하세요",
11
+ "PERMISSION_DENIED": "이 작업을 수행할 권한이 없습니다",
2
12
  "Validation error": "{{field}} 필드 규칙 유효성 검사에 실패했습니다.",
13
+ "notNull Violation": "{{field}} 필드는 비어 있을 수 없습니다.",
3
14
  "notNull violation": "{{field}} 필드는 비어 있을 수 없습니다.",
4
15
  "unique violation": "{{field}} 필드 값은 고유해야 합니다."
5
16
  }
@@ -1,4 +1,14 @@
1
1
  {
2
+ "ERR_DUPLICATE_KEY": "Dados duplicados detectados, verifique e reenvie",
3
+ "ERR_INVALID_TIMESTAMP": "Formato de data inválido, corrija conforme as instruções",
4
+ "ERR_MISSING_FILTER_UPDATE": "Não é possível atualizar: tente novamente mais tarde ou entre em contato com o administrador",
5
+ "ERR_RELATION_NOT_EXIST": "A tabela do banco de dados não existe, entre em contato com o administrador",
6
+ "ERR_VALUE_TOO_LONG": "O comprimento ou a quantidade do conteúdo excede o limite, ajuste conforme necessário",
7
+ "JWT_EXPIRED": "Sua sessão expirou, faça login novamente",
8
+ "JWT_INVALID_SIGNATURE": "Assinatura de token inválida, faça login novamente",
9
+ "JWT_INVALID_TOKEN": "Token inválido, faça login novamente",
10
+ "JWT_MALFORMED": "Formato de token inválido, faça login novamente",
11
+ "PERMISSION_DENIED": "Você não tem permissão para realizar esta operação",
2
12
  "Validation error": "erro de validação de {{field}}",
3
13
  "notNull Violation": "{{field}} não pode ser nulo",
4
14
  "notNull violation": "violação de não nulo",
@@ -4,7 +4,13 @@
4
4
  "ERR_MISSING_FILTER_UPDATE": "无法更新:请稍后再试或联系管理员",
5
5
  "ERR_RELATION_NOT_EXIST": "系统数据表不存在,请联系管理员",
6
6
  "ERR_VALUE_TOO_LONG": "内容长度或数量超出限制,请适当调整",
7
+ "JWT_EXPIRED": "登录已过期,请重新登录",
8
+ "JWT_INVALID_SIGNATURE": "令牌签名无效,请重新登录",
9
+ "JWT_INVALID_TOKEN": "无效的令牌,请重新登录",
10
+ "JWT_MALFORMED": "令牌格式错误,请重新登录",
11
+ "PERMISSION_DENIED": "没有权限执行此操作",
7
12
  "Validation error": "{{field}} 字段规则验证失败",
8
- "notNull violation": "{{field}} 字段不能为空",
13
+ "notNull Violation": "{{field}} 字段不能为空",
14
+ "notNull violation": "notNull 违规",
9
15
  "unique violation": "{{field}} 字段值是唯一的"
10
16
  }
@@ -5,5 +5,7 @@ export declare class PluginErrorHandler extends Plugin {
5
5
  i18nNs: string;
6
6
  beforeLoad(): void;
7
7
  registerSequelizeValidationErrorHandler(): void;
8
+ registerJWTErrorHandler(): void;
9
+ registerPermissionDeniedErrorHandler(): void;
8
10
  load(): Promise<void>;
9
11
  }
@@ -44,6 +44,8 @@ class PluginErrorHandler extends import_server.Plugin {
44
44
  }
45
45
  beforeLoad() {
46
46
  this.registerSequelizeValidationErrorHandler();
47
+ this.registerJWTErrorHandler();
48
+ this.registerPermissionDeniedErrorHandler();
47
49
  }
48
50
  registerSequelizeValidationErrorHandler() {
49
51
  const findFieldTitle = (instance, path, tFunc, ctx) => {
@@ -80,6 +82,75 @@ class PluginErrorHandler extends import_server.Plugin {
80
82
  }
81
83
  );
82
84
  }
85
+ registerJWTErrorHandler() {
86
+ this.errorHandler.register(
87
+ (err) => {
88
+ const jwtErrorMessages = ["jwt expired", "jwt malformed", "invalid token", "invalid signature"];
89
+ return err.message && jwtErrorMessages.some((msg) => err.message.toLowerCase().includes(msg.toLowerCase()));
90
+ },
91
+ (err, ctx) => {
92
+ let code = "JWT_EXPIRED";
93
+ let messageKey = "JWT_EXPIRED";
94
+ const errMsg = err.message.toLowerCase();
95
+ if (errMsg.includes("expired")) {
96
+ code = "JWT_EXPIRED";
97
+ messageKey = "JWT_EXPIRED";
98
+ } else if (errMsg.includes("malformed")) {
99
+ code = "JWT_MALFORMED";
100
+ messageKey = "JWT_MALFORMED";
101
+ } else if (errMsg.includes("invalid signature")) {
102
+ code = "JWT_INVALID_SIGNATURE";
103
+ messageKey = "JWT_INVALID_SIGNATURE";
104
+ } else if (errMsg.includes("invalid token")) {
105
+ code = "JWT_INVALID_TOKEN";
106
+ messageKey = "JWT_INVALID_TOKEN";
107
+ }
108
+ ctx.status = err.statusCode || err.status || 401;
109
+ ctx.body = {
110
+ errors: [
111
+ {
112
+ message: ctx.i18n.t(messageKey, {
113
+ ns: this.i18nNs,
114
+ defaultValue: err.message
115
+ }),
116
+ code
117
+ }
118
+ ]
119
+ };
120
+ }
121
+ );
122
+ }
123
+ registerPermissionDeniedErrorHandler() {
124
+ this.errorHandler.register(
125
+ (err) => {
126
+ const is403 = err.statusCode === 403 || err.status === 403;
127
+ const permissionDeniedMessagesEn = ["permission denied", "no permissions"];
128
+ const permissionDeniedMessagesZh = ["\u6CA1\u6709\u6743\u9650", "\u65E0\u6743\u9650"];
129
+ const hasPermissionMessage = err.message && (permissionDeniedMessagesEn.some((msg) => err.message.toLowerCase().includes(msg.toLowerCase())) || permissionDeniedMessagesZh.some((msg) => err.message.includes(msg)));
130
+ return is403 || hasPermissionMessage;
131
+ },
132
+ (err, ctx) => {
133
+ let code = "PERMISSION_DENIED";
134
+ let messageKey = "PERMISSION_DENIED";
135
+ if (err.code) {
136
+ code = err.code;
137
+ messageKey = err.code;
138
+ }
139
+ ctx.status = err.statusCode || err.status || 403;
140
+ ctx.body = {
141
+ errors: [
142
+ {
143
+ message: ctx.i18n.t(messageKey, {
144
+ ns: this.i18nNs,
145
+ defaultValue: err.message || "Permission denied"
146
+ }),
147
+ code
148
+ }
149
+ ]
150
+ };
151
+ }
152
+ );
153
+ }
83
154
  async load() {
84
155
  this.app.i18n.addResources("zh-CN", this.i18nNs, import_zh_CN.default);
85
156
  this.app.i18n.addResources("en-US", this.i18nNs, import_en_US.default);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tachybase/module-error-handler",
3
3
  "displayName": "Error handler",
4
- "version": "1.6.1",
4
+ "version": "1.6.3",
5
5
  "description": "Handling application errors and exceptions.",
6
6
  "keywords": [
7
7
  "System management"
@@ -10,13 +10,13 @@
10
10
  "main": "./dist/server/index.js",
11
11
  "dependencies": {},
12
12
  "devDependencies": {
13
- "@tachybase/schema": "1.6.0-alpha.9",
14
- "@tachybase/test": "1.6.0-alpha.9",
15
- "@tego/client": "1.6.0-alpha.9",
16
- "@tego/server": "1.6.0-alpha.9",
13
+ "@tachybase/schema": "1.6.1",
14
+ "@tachybase/test": "1.6.1",
15
+ "@tego/client": "1.6.1",
16
+ "@tego/server": "1.6.1",
17
17
  "lodash": "4.17.21",
18
18
  "supertest": "^7.1.3",
19
- "@tachybase/client": "1.6.1"
19
+ "@tachybase/client": "1.6.3"
20
20
  },
21
21
  "description.zh-CN": "处理应用程序中的错误和异常。",
22
22
  "displayName.zh-CN": "错误处理器",