From fb8ff62d01a1de4b43f4019d8c61eb6394c602f6 Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Mon, 8 Jul 2024 09:21:29 +0800 Subject: [PATCH] chore(data-source-main): i18n of field depended error (#4843) --- .../src/locale/en-US.json | 3 ++- .../src/locale/zh-CN.json | 3 ++- .../errors/field-is-depended-on-by-other.ts | 16 ++++++++++++++ .../src/server/hooks/beforeDestoryField.ts | 13 ++++++----- .../src/server/server.ts | 22 +++++++++++++++++++ 5 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 packages/plugins/@nocobase/plugin-data-source-main/src/server/errors/field-is-depended-on-by-other.ts diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/locale/en-US.json b/packages/plugins/@nocobase/plugin-data-source-main/src/locale/en-US.json index d3de755cd0..9dd17478d2 100644 --- a/packages/plugins/@nocobase/plugin-data-source-main/src/locale/en-US.json +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/locale/en-US.json @@ -1,3 +1,4 @@ { - "field-name-exists": "Field name \"{{name}}\" already exists in collection \"{{collectionName}}\"" + "field-name-exists": "Field name \"{{name}}\" already exists in collection \"{{collectionName}}\"", + "field-is-depended-on-by-other": "Can not delete field \"{{fieldName}}\" in \"{{fieldCollectionName}}\", it is used by field \"{{dependedFieldName}}\" in \"{{dependedFieldCollectionName}}\" as \"{{dependedFieldAs}}\"" } diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/locale/zh-CN.json b/packages/plugins/@nocobase/plugin-data-source-main/src/locale/zh-CN.json index a702503642..4ed3bed35f 100644 --- a/packages/plugins/@nocobase/plugin-data-source-main/src/locale/zh-CN.json +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/locale/zh-CN.json @@ -1,3 +1,4 @@ { - "field-name-exists": "字段标识 \"{{name}}\" 已存在" + "field-name-exists": "字段标识 \"{{name}}\" 已存在", + "field-is-depended-on-by-other": "无法删除 \"{{fieldCollectionName}}\" 中的 \"{{fieldName}}\" 字段,它被 \"{{dependedFieldCollectionName}}\" 中的 \"{{dependedFieldName}}\" 字段用作 \"{{dependedFieldAs}}\"" } diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/server/errors/field-is-depended-on-by-other.ts b/packages/plugins/@nocobase/plugin-data-source-main/src/server/errors/field-is-depended-on-by-other.ts new file mode 100644 index 0000000000..890116b565 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/server/errors/field-is-depended-on-by-other.ts @@ -0,0 +1,16 @@ +type FieldIsDependedOnByOtherErrorOptions = { + fieldName: string; + fieldCollectionName: string; + dependedFieldName: string; + dependedFieldCollectionName: string; + dependedFieldAs: string; +}; + +export class FieldIsDependedOnByOtherError extends Error { + constructor(public options: FieldIsDependedOnByOtherErrorOptions) { + super( + `Can't delete field ${options.fieldName} of ${options.fieldCollectionName}, it is used by field ${options.dependedFieldName} in collection ${options.dependedFieldCollectionName} as ${options.dependedFieldAs}`, + ); + this.name = 'FieldIsDependedOnByOtherError'; + } +} diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts b/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts index a9879a5ef5..6621e93590 100644 --- a/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts @@ -1,4 +1,5 @@ import { Database } from '@nocobase/database'; +import { FieldIsDependedOnByOtherError } from '../errors/field-is-depended-on-by-other'; export function beforeDestoryField(db: Database) { return async (model, opts) => { @@ -41,11 +42,13 @@ export function beforeDestoryField(db: Database) { const usedAs = keys.find((key) => key.condition(field))['name']; - throw new Error( - `Can't delete field ${name} of ${collectionName}, it is used by field ${field.get( - 'name', - )} in collection ${field.get('collectionName')} as ${usedAs}`, - ); + throw new FieldIsDependedOnByOtherError({ + fieldName: name, + fieldCollectionName: collectionName, + dependedFieldName: field.get('name'), + dependedFieldCollectionName: field.get('collectionName'), + dependedFieldAs: usedAs, + }); } }; } diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/server/server.ts b/packages/plugins/@nocobase/plugin-data-source-main/src/server/server.ts index f1d3140e42..35806d135f 100644 --- a/packages/plugins/@nocobase/plugin-data-source-main/src/server/server.ts +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/server/server.ts @@ -29,6 +29,7 @@ import collectionActions from './resourcers/collections'; import viewResourcer from './resourcers/views'; import { FieldNameExistsError } from './errors/field-name-exists-error'; import { beforeDestoryField } from './hooks/beforeDestoryField'; +import { FieldIsDependedOnByOtherError } from './errors/field-is-depended-on-by-other'; export class PluginDataSourceMainServer extends Plugin { public schema: string; @@ -335,6 +336,27 @@ export class PluginDataSourceMainServer extends Plugin { }, ); + errorHandlerPlugin.errorHandler.register( + (err) => err instanceof FieldIsDependedOnByOtherError, + (err, ctx) => { + ctx.status = 400; + ctx.body = { + errors: [ + { + message: ctx.i18n.t('field-is-depended-on-by-other', { + fieldName: err.options.fieldName, + fieldCollectionName: err.options.fieldCollectionName, + dependedFieldName: err.options.dependedFieldName, + dependedFieldCollectionName: err.options.dependedFieldCollectionName, + dependedFieldAs: err.options.dependedFieldAs, + ns: 'data-source-main', + }), + }, + ], + }; + }, + ); + errorHandlerPlugin.errorHandler.register( (err) => err instanceof FieldNameExistsError, (err, ctx) => {