From e0563377b55d3c2430f0cc713db3683cbb3dbfa8 Mon Sep 17 00:00:00 2001 From: Abdul Rahman <81605929+abdulrahmancodes@users.noreply.github.com> Date: Tue, 5 May 2026 23:48:05 +0530 Subject: [PATCH] Fix unclear metadata validation errors (#20234) https://github.com/user-attachments/assets/8f8f1122-3de1-4a9b-8bb4-a3c8d31e47ae --------- Co-authored-by: Cursor Co-authored-by: Charles Bochet --- .../hooks/use-graphql-error-handler.hook.ts | 15 +- ...-friendly-message-descriptors.util.spec.ts | 148 +++++++++++++ ...-user-friendly-message-descriptors.util.ts | 40 ++++ .../field-metadata/field-metadata.resolver.ts | 32 +-- ...adata-graphql-api-exception.interceptor.ts | 16 +- ...data-graphql-api-exception-handler.util.ts | 10 +- .../index-metadata/index-metadata.resolver.ts | 13 +- ...adata-graphql-api-exception.interceptor.ts | 18 +- .../object-metadata.resolver.ts | 30 +-- ...data-graphql-api-exception-handler.util.ts | 10 +- .../field-permissions.service.spec.ts | 3 +- ...yout-graphql-api-exception-handler.util.ts | 10 +- ...age-layout-graphql-api-exception.filter.ts | 15 +- .../view-field-rest-api-exception.filter.ts | 19 +- ...-filter-group-rest-api-exception.filter.ts | 19 +- .../view-filter-rest-api-exception.filter.ts | 19 +- .../view-group-rest-api-exception.filter.ts | 19 +- ...roup-graphql-api-exception-handler.util.ts | 9 +- ...view-group-graphql-api-exception.filter.ts | 15 +- .../view-sort-rest-api-exception.filter.ts | 19 +- .../filters/view-rest-api-exception.filter.ts | 19 +- ...view-graphql-api-exception-handler.util.ts | 7 +- .../view-graphql-api-exception.filter.ts | 15 +- ...lidation-error-response-descriptor.type.ts | 16 ++ ...data-validation-error-payload.util.spec.ts | 143 ++++++++++++ ...-metadata-validation-error-payload.util.ts | 79 +++++++ ...metadata-validation-response-error.util.ts | 47 ---- ...orchestrator-failure-report-errors.util.ts | 57 ----- ...lder-graphql-api-exception-handler.util.ts | 39 ++++ ...builder-rest-api-exception-handler.util.ts | 28 +++ ...e-migration-builder-exception-formatter.ts | 46 ---- ...ation-graphql-api-exception.interceptor.ts | 14 +- ...create-view-field.integration-spec.ts.snap | 2 +- ...ect-on-view-field.integration-spec.ts.snap | 10 +- ...ng-agent-creation.integration-spec.ts.snap | 14 +- ...ng-agent-deletion.integration-spec.ts.snap | 2 +- ...ling-agent-update.integration-spec.ts.snap | 18 +- ...-on-standard-role.integration-spec.ts.snap | 6 +- ...etarget-on-update.integration-spec.ts.snap | 6 +- ...ect-system-fields.integration-spec.ts.snap | 18 +- ...enu-item-creation.integration-spec.ts.snap | 8 +- ...-menu-item-update.integration-spec.ts.snap | 4 +- ...ne-field-metadata.integration-spec.ts.snap | 2 +- ...ne-field-metadata.integration-spec.ts.snap | 4 +- ...rd-field-metadata.integration-spec.ts.snap | 2 +- ...ne-field-metadata.integration-spec.ts.snap | 4 +- ...es-field-metadata.integration-spec.ts.snap | 8 +- ...es-field-metadata.integration-spec.ts.snap | 6 +- ...-metadata-enum-v2.integration-spec.ts.snap | 200 ++++++++--------- ...field-metadata-v2.integration-spec.ts.snap | 204 +++++++++--------- ...morph-relation-v2.integration-spec.ts.snap | 4 +- ...morph-relation-v2.integration-spec.ts.snap | 34 +-- ...relation-creation.integration-spec.ts.snap | 64 +++--- ...a-relation-update.integration-spec.ts.snap | 4 +- ...ue-field-metadata.integration-spec.ts.snap | 4 +- ...permission-upsert.integration-spec.ts.snap | 2 +- ...omponent-creation.integration-spec.ts.snap | 4 +- ...enu-item-creation.integration-spec.ts.snap | 2 +- ...rcular-dependency.integration-spec.ts.snap | 4 +- ...bject-metadata-v2.integration-spec.ts.snap | 30 +-- ...e-object-metadata.integration-spec.ts.snap | 2 +- ...permission-upsert.integration-spec.ts.snap | 2 +- ...ssion-flag-upsert.integration-spec.ts.snap | 2 +- ...ing-role-creation.integration-spec.ts.snap | 10 +- ...iling-role-update.integration-spec.ts.snap | 14 +- ...ng-skill-creation.integration-spec.ts.snap | 6 +- ...ling-skill-update.integration-spec.ts.snap | 4 +- ...rcular-dependency.integration-spec.ts.snap | 2 +- ...rcular-dependency.integration-spec.ts.snap | 4 +- .../view-group.integration-spec.ts.snap | 1 + 70 files changed, 935 insertions(+), 771 deletions(-) create mode 100644 packages/twenty-server/src/engine/core-modules/i18n/utils/__tests__/translate-user-friendly-message-descriptors.util.spec.ts create mode 100644 packages/twenty-server/src/engine/core-modules/i18n/utils/translate-user-friendly-message-descriptors.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/types/metadata-validation-error-response-descriptor.type.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/__tests__/build-metadata-validation-error-payload.util.spec.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/build-metadata-validation-error-payload.util.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/translate-orchestrator-failure-report-errors.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-graphql-api-exception-handler.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-rest-api-exception-handler.util.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-builder-exception-formatter.ts diff --git a/packages/twenty-server/src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook.ts b/packages/twenty-server/src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook.ts index 7cfc7b2331..957b34e4ba 100644 --- a/packages/twenty-server/src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook.ts +++ b/packages/twenty-server/src/engine/core-modules/graphql/hooks/use-graphql-error-handler.hook.ts @@ -32,6 +32,7 @@ import { graphQLErrorCodesToFilter, shouldCaptureException, } from 'src/engine/utils/global-exception-handler.util'; +import { translateUserFriendlyMessageDescriptors } from 'src/engine/core-modules/i18n/utils/translate-user-friendly-message-descriptors.util'; const DEFAULT_EVENT_ID_KEY = 'exceptionEventId'; const SCHEMA_VERSION_HEADER = 'x-schema-version'; @@ -223,13 +224,15 @@ export const useGraphQLErrorHandlerHook = < error instanceof BaseGraphQLError ? { ...error, - extensions: { - ...error.extensions, - userFriendlyMessage: i18n._( - error.extensions.userFriendlyMessage ?? + extensions: translateUserFriendlyMessageDescriptors( + { + ...error.extensions, + userFriendlyMessage: + error.extensions.userFriendlyMessage ?? defaultErrorMessage, - ), - }, + }, + i18n, + ), } : generateGraphQLErrorFromError(error, i18n); diff --git a/packages/twenty-server/src/engine/core-modules/i18n/utils/__tests__/translate-user-friendly-message-descriptors.util.spec.ts b/packages/twenty-server/src/engine/core-modules/i18n/utils/__tests__/translate-user-friendly-message-descriptors.util.spec.ts new file mode 100644 index 0000000000..fe4bc9c11b --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/i18n/utils/__tests__/translate-user-friendly-message-descriptors.util.spec.ts @@ -0,0 +1,148 @@ +import { type I18n, type MessageDescriptor } from '@lingui/core'; + +import { translateUserFriendlyMessageDescriptors } from 'src/engine/core-modules/i18n/utils/translate-user-friendly-message-descriptors.util'; + +const buildDescriptor = (id: string): MessageDescriptor => ({ + id, + message: id, +}); + +const i18nMock = { + _: (descriptor: MessageDescriptor) => `tr:${descriptor.id}`, +} as unknown as I18n; + +describe('translateUserFriendlyMessageDescriptors', () => { + it('translates a top-level userFriendlyMessage descriptor to a string', () => { + const result = translateUserFriendlyMessageDescriptors( + { userFriendlyMessage: buildDescriptor('top-level') }, + i18nMock, + ); + + expect(result).toEqual({ userFriendlyMessage: 'tr:top-level' }); + }); + + it('leaves a userFriendlyMessage value untouched when it is already a string', () => { + const result = translateUserFriendlyMessageDescriptors( + { userFriendlyMessage: 'already a string' }, + i18nMock, + ); + + expect(result).toEqual({ userFriendlyMessage: 'already a string' }); + }); + + it('does not translate descriptors stored under other keys', () => { + const descriptor = buildDescriptor('not-user-friendly'); + + const result = translateUserFriendlyMessageDescriptors( + { someOtherKey: descriptor }, + i18nMock, + ); + + expect(result).toEqual({ + someOtherKey: { id: 'not-user-friendly', message: 'not-user-friendly' }, + }); + }); + + it('translates userFriendlyMessage descriptors nested inside arrays of objects', () => { + const result = translateUserFriendlyMessageDescriptors( + { + errors: [ + { code: 'A', userFriendlyMessage: buildDescriptor('first') }, + { code: 'B', userFriendlyMessage: buildDescriptor('second') }, + ], + }, + i18nMock, + ); + + expect(result).toEqual({ + errors: [ + { code: 'A', userFriendlyMessage: 'tr:first' }, + { code: 'B', userFriendlyMessage: 'tr:second' }, + ], + }); + }); + + it('preserves primitives, null and undefined values found along the way', () => { + const result = translateUserFriendlyMessageDescriptors( + { + statusCode: 400, + message: 'Validation failed', + eventId: null, + traceId: undefined, + nested: { count: 0, flag: false }, + }, + i18nMock, + ); + + expect(result).toEqual({ + statusCode: 400, + message: 'Validation failed', + eventId: null, + traceId: undefined, + nested: { count: 0, flag: false }, + }); + }); + + it('handles a realistic metadata-validation payload with both top-level and per-error descriptors', () => { + const result = translateUserFriendlyMessageDescriptors( + { + userFriendlyMessage: buildDescriptor('Field value is required'), + summary: { totalErrors: 1, viewGroup: 1 }, + errors: { + viewGroup: [ + { + status: 'fail', + type: 'create', + metadataName: 'viewGroup', + errors: [ + { + code: 'INVALID_VIEW_DATA', + message: 'Field value is required', + userFriendlyMessage: buildDescriptor( + 'Field value is required', + ), + }, + ], + }, + ], + }, + }, + i18nMock, + ); + + expect(result).toEqual({ + userFriendlyMessage: 'tr:Field value is required', + summary: { totalErrors: 1, viewGroup: 1 }, + errors: { + viewGroup: [ + { + status: 'fail', + type: 'create', + metadataName: 'viewGroup', + errors: [ + { + code: 'INVALID_VIEW_DATA', + message: 'Field value is required', + userFriendlyMessage: 'tr:Field value is required', + }, + ], + }, + ], + }, + }); + }); + + it('does not mutate the input payload', () => { + const descriptor = buildDescriptor('mutation-check'); + const input = { userFriendlyMessage: descriptor, nested: { value: 1 } }; + + const result = translateUserFriendlyMessageDescriptors(input, i18nMock); + + expect(input.userFriendlyMessage).toBe(descriptor); + expect(result).not.toBe(input); + expect(result).toEqual({ + userFriendlyMessage: 'tr:mutation-check', + nested: { value: 1 }, + }); + }); +}); diff --git a/packages/twenty-server/src/engine/core-modules/i18n/utils/translate-user-friendly-message-descriptors.util.ts b/packages/twenty-server/src/engine/core-modules/i18n/utils/translate-user-friendly-message-descriptors.util.ts new file mode 100644 index 0000000000..40debb71a2 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/i18n/utils/translate-user-friendly-message-descriptors.util.ts @@ -0,0 +1,40 @@ +import { type I18n, type MessageDescriptor } from '@lingui/core'; +import { isArray, isObject, isString } from '@sniptt/guards'; + +const USER_FRIENDLY_MESSAGE_KEY = 'userFriendlyMessage'; + +const isMessageDescriptor = (value: unknown): value is MessageDescriptor => + isObject(value) && 'id' in value && isString(value.id); + +const translateValueRecursively = ( + value: unknown, + i18n: I18n, + parentKey?: string, +): unknown => { + if (parentKey === USER_FRIENDLY_MESSAGE_KEY && isMessageDescriptor(value)) { + return i18n._(value); + } + + if (isArray(value)) { + return value.map((item) => + translateValueRecursively(item, i18n, parentKey), + ); + } + + if (isObject(value)) { + return Object.fromEntries( + Object.entries(value).map(([key, nestedValue]) => [ + key, + translateValueRecursively(nestedValue, i18n, key), + ]), + ); + } + + return value; +}; + +export const translateUserFriendlyMessageDescriptors = ( + payload: object, + i18n: I18n, +): Record => + translateValueRecursively(payload, i18n) as Record; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts index 93615c4de2..373eadfec0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts @@ -95,7 +95,6 @@ export class FieldMetadataResolver { async createOneField( @Args('input') input: CreateOneFieldMetadataInput, @AuthWorkspace() { id: workspaceId }: WorkspaceEntity, - @Context() context: I18nContext, ) { try { const flatFieldMetadata = await this.fieldMetadataService.createOneField({ @@ -105,10 +104,7 @@ export class FieldMetadataResolver { return fromFlatFieldMetadataToFieldMetadataDto(flatFieldMetadata); } catch (error) { - return fieldMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + return fieldMetadataGraphqlApiExceptionHandler(error); } } @@ -117,7 +113,6 @@ export class FieldMetadataResolver { async updateOneField( @Args('input') input: UpdateOneFieldMetadataInput, @AuthWorkspace() { id: workspaceId }: WorkspaceEntity, - @Context() context: I18nContext, ) { try { const flatFieldMetadata = await this.fieldMetadataService.updateOneField({ @@ -127,10 +122,7 @@ export class FieldMetadataResolver { return fromFlatFieldMetadataToFieldMetadataDto(flatFieldMetadata); } catch (error) { - fieldMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + fieldMetadataGraphqlApiExceptionHandler(error); } } @@ -139,7 +131,6 @@ export class FieldMetadataResolver { async deleteOneField( @Args('input') deleteOneFieldInput: DeleteOneFieldInput, @AuthWorkspace() { id: workspaceId }: WorkspaceEntity, - @Context() context: I18nContext, ) { if (!isDefined(workspaceId)) { throw new ForbiddenError('Could not retrieve workspace ID'); @@ -153,10 +144,7 @@ export class FieldMetadataResolver { return fromFlatFieldMetadataToFieldMetadataDto(flatFieldMetadata); } catch (error) { - fieldMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + fieldMetadataGraphqlApiExceptionHandler(error); } } @@ -168,7 +156,7 @@ export class FieldMetadataResolver { id: fieldMetadataId, objectMetadataId, }: Pick, - @Context() context: { loaders: IDataloaders } & I18nContext, + @Context() context: { loaders: IDataloaders }, ): Promise { try { return await context.loaders.relationLoader.load({ @@ -177,10 +165,7 @@ export class FieldMetadataResolver { workspaceId: workspace.id, }); } catch (error) { - return fieldMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + return fieldMetadataGraphqlApiExceptionHandler(error); } } @@ -192,7 +177,7 @@ export class FieldMetadataResolver { id: fieldMetadataId, objectMetadataId, }: Pick, - @Context() context: { loaders: IDataloaders } & I18nContext, + @Context() context: { loaders: IDataloaders }, ): Promise { try { return await context.loaders.morphRelationLoader.load({ @@ -201,10 +186,7 @@ export class FieldMetadataResolver { workspaceId: workspace.id, }); } catch (error) { - return fieldMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + return fieldMetadataGraphqlApiExceptionHandler(error); } } } diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interceptors/field-metadata-graphql-api-exception.interceptor.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/interceptors/field-metadata-graphql-api-exception.interceptor.ts index 8aa42e863b..43236d69f8 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/interceptors/field-metadata-graphql-api-exception.interceptor.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/interceptors/field-metadata-graphql-api-exception.interceptor.ts @@ -4,31 +4,19 @@ import { Injectable, type NestInterceptor, } from '@nestjs/common'; -import { GqlExecutionContext } from '@nestjs/graphql'; import { type Observable, catchError } from 'rxjs'; -import { SOURCE_LOCALE } from 'twenty-shared/translations'; -import { I18nService } from 'src/engine/core-modules/i18n/i18n.service'; import { fieldMetadataGraphqlApiExceptionHandler } from 'src/engine/metadata-modules/field-metadata/utils/field-metadata-graphql-api-exception-handler.util'; @Injectable() export class FieldMetadataGraphqlApiExceptionInterceptor implements NestInterceptor { - constructor(private readonly i18nService: I18nService) {} - // oxlint-disable-next-line @typescripttypescript/no-explicit-any - intercept(context: ExecutionContext, next: CallHandler): Observable { - const gqlContext = GqlExecutionContext.create(context); - const ctx = gqlContext.getContext(); - const locale = ctx.req?.locale ?? SOURCE_LOCALE; - const i18n = this.i18nService.getI18nInstance(locale); - + intercept(_context: ExecutionContext, next: CallHandler): Observable { return next .handle() - .pipe( - catchError((err) => fieldMetadataGraphqlApiExceptionHandler(err, i18n)), - ); + .pipe(catchError((err) => fieldMetadataGraphqlApiExceptionHandler(err))); } } diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/field-metadata-graphql-api-exception-handler.util.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/field-metadata-graphql-api-exception-handler.util.ts index 9772a7e2f7..b059bc367a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/field-metadata-graphql-api-exception-handler.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/field-metadata-graphql-api-exception-handler.util.ts @@ -1,4 +1,3 @@ -import { type I18n } from '@lingui/core'; import { assertUnreachable } from 'twenty-shared/utils'; import { @@ -13,14 +12,11 @@ import { } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { InvalidMetadataException } from 'src/engine/metadata-modules/utils/exceptions/invalid-metadata.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { workspaceMigrationBuilderExceptionFormatter } from 'src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-builder-exception-formatter'; +import { workspaceMigrationBuilderGraphqlApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-graphql-api-exception-handler.util'; -export const fieldMetadataGraphqlApiExceptionHandler = ( - error: Error, - i18n: I18n, -) => { +export const fieldMetadataGraphqlApiExceptionHandler = (error: Error) => { if (error instanceof WorkspaceMigrationBuilderException) { - workspaceMigrationBuilderExceptionFormatter(error, i18n); + workspaceMigrationBuilderGraphqlApiExceptionHandler(error); } if (error instanceof InvalidMetadataException) { diff --git a/packages/twenty-server/src/engine/metadata-modules/index-metadata/index-metadata.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/index-metadata/index-metadata.resolver.ts index fc1f5de2bf..f141b42d51 100644 --- a/packages/twenty-server/src/engine/metadata-modules/index-metadata/index-metadata.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/index-metadata/index-metadata.resolver.ts @@ -1,14 +1,12 @@ import { UseFilters, UseGuards, UsePipes } from '@nestjs/common'; import { Context, Parent, ResolveField } from '@nestjs/graphql'; +import { MetadataResolver } from 'src/engine/api/graphql/graphql-config/decorators/metadata-resolver.decorator'; import { PreventNestToAutoLogGraphqlErrorsFilter } from 'src/engine/core-modules/graphql/filters/prevent-nest-to-auto-log-graphql-errors.filter'; import { ResolverValidationPipe } from 'src/engine/core-modules/graphql/pipes/resolver-validation.pipe'; -import { I18nService } from 'src/engine/core-modules/i18n/i18n.service'; -import { type I18nContext } from 'src/engine/core-modules/i18n/types/i18n-context.type'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { type IDataloaders } from 'src/engine/dataloaders/dataloader.interface'; import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; -import { MetadataResolver } from 'src/engine/api/graphql/graphql-config/decorators/metadata-resolver.decorator'; import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard'; import { IndexFieldMetadataDTO } from 'src/engine/metadata-modules/index-metadata/dtos/index-field-metadata.dto'; import { IndexMetadataDTO } from 'src/engine/metadata-modules/index-metadata/dtos/index-metadata.dto'; @@ -23,13 +21,11 @@ import { PermissionsGraphqlApiExceptionFilter } from 'src/engine/metadata-module PermissionsGraphqlApiExceptionFilter, ) export class IndexMetadataResolver { - constructor(private readonly i18nService: I18nService) {} - @ResolveField(() => [IndexFieldMetadataDTO], { nullable: false }) async indexFieldMetadataList( @AuthWorkspace() workspace: WorkspaceEntity, @Parent() indexMetadata: IndexMetadataDTO, - @Context() context: { loaders: IDataloaders } & I18nContext, + @Context() context: { loaders: IDataloaders }, ): Promise { try { const indexFieldMetadataItems = @@ -41,10 +37,7 @@ export class IndexMetadataResolver { return indexFieldMetadataItems; } catch (error) { - objectMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + objectMetadataGraphqlApiExceptionHandler(error); return []; } diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/interceptors/object-metadata-graphql-api-exception.interceptor.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/interceptors/object-metadata-graphql-api-exception.interceptor.ts index d0affab0c3..dd38395c43 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/interceptors/object-metadata-graphql-api-exception.interceptor.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/interceptors/object-metadata-graphql-api-exception.interceptor.ts @@ -4,33 +4,19 @@ import { Injectable, type NestInterceptor, } from '@nestjs/common'; -import { GqlExecutionContext } from '@nestjs/graphql'; import { type Observable, catchError } from 'rxjs'; -import { SOURCE_LOCALE } from 'twenty-shared/translations'; -import { I18nService } from 'src/engine/core-modules/i18n/i18n.service'; import { objectMetadataGraphqlApiExceptionHandler } from 'src/engine/metadata-modules/object-metadata/utils/object-metadata-graphql-api-exception-handler.util'; @Injectable() export class ObjectMetadataGraphqlApiExceptionInterceptor implements NestInterceptor { - constructor(private readonly i18nService: I18nService) {} - // oxlint-disable-next-line @typescripttypescript/no-explicit-any - intercept(context: ExecutionContext, next: CallHandler): Observable { - const gqlContext = GqlExecutionContext.create(context); - const ctx = gqlContext.getContext(); - const locale = ctx.req?.locale ?? SOURCE_LOCALE; - const i18n = this.i18nService.getI18nInstance(locale); - + intercept(_context: ExecutionContext, next: CallHandler): Observable { return next .handle() - .pipe( - catchError((err) => - objectMetadataGraphqlApiExceptionHandler(err, i18n), - ), - ); + .pipe(catchError((err) => objectMetadataGraphqlApiExceptionHandler(err))); } } diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts index 5e8e382264..cc2a1d115a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts @@ -137,7 +137,6 @@ export class ObjectMetadataResolver { async createOneObject( @Args('input') input: CreateOneObjectInput, @AuthWorkspace() { id: workspaceId }: WorkspaceEntity, - @Context() context: I18nContext, ) { try { const flatobjectMetadata = @@ -148,10 +147,7 @@ export class ObjectMetadataResolver { return fromFlatObjectMetadataToObjectMetadataDto(flatobjectMetadata); } catch (error) { - objectMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + objectMetadataGraphqlApiExceptionHandler(error); } } @@ -160,7 +156,6 @@ export class ObjectMetadataResolver { async deleteOneObject( @Args('input') deleteObjectInput: DeleteOneObjectInput, @AuthWorkspace() { id: workspaceId }: WorkspaceEntity, - @Context() context: I18nContext, ) { try { const flatobjectMetadata = @@ -171,10 +166,7 @@ export class ObjectMetadataResolver { return fromFlatObjectMetadataToObjectMetadataDto(flatobjectMetadata); } catch (error) { - objectMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + objectMetadataGraphqlApiExceptionHandler(error); } } @@ -183,7 +175,6 @@ export class ObjectMetadataResolver { async updateOneObject( @Args('input') updateObjectInput: UpdateOneObjectInput, @AuthWorkspace() { id: workspaceId }: WorkspaceEntity, - @Context() context: I18nContext, ) { try { const flatobjectMetadata = @@ -194,10 +185,7 @@ export class ObjectMetadataResolver { return fromFlatObjectMetadataToObjectMetadataDto(flatobjectMetadata); } catch (error) { - objectMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + objectMetadataGraphqlApiExceptionHandler(error); } } @@ -218,10 +206,7 @@ export class ObjectMetadataResolver { return fieldMetadataItems; } catch (error) { - objectMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + objectMetadataGraphqlApiExceptionHandler(error); return []; } @@ -231,7 +216,7 @@ export class ObjectMetadataResolver { async indexMetadataList( @AuthWorkspace() workspace: WorkspaceEntity, @Parent() objectMetadata: ObjectMetadataDTO, - @Context() context: { loaders: IDataloaders } & I18nContext, + @Context() context: { loaders: IDataloaders }, ): Promise { try { const indexMetadataItems = await context.loaders.indexMetadataLoader.load( @@ -243,10 +228,7 @@ export class ObjectMetadataResolver { return indexMetadataItems; } catch (error) { - objectMetadataGraphqlApiExceptionHandler( - error, - this.i18nService.getI18nInstance(context.req.locale), - ); + objectMetadataGraphqlApiExceptionHandler(error); return []; } diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/object-metadata-graphql-api-exception-handler.util.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/object-metadata-graphql-api-exception-handler.util.ts index 94ae1236dc..0e7ee7869c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/object-metadata-graphql-api-exception-handler.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/object-metadata-graphql-api-exception-handler.util.ts @@ -1,4 +1,3 @@ -import { type I18n } from '@lingui/core'; import { assertUnreachable } from 'twenty-shared/utils'; import { @@ -14,14 +13,11 @@ import { } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { InvalidMetadataException } from 'src/engine/metadata-modules/utils/exceptions/invalid-metadata.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { workspaceMigrationBuilderExceptionFormatter } from 'src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-builder-exception-formatter'; +import { workspaceMigrationBuilderGraphqlApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-graphql-api-exception-handler.util'; -export const objectMetadataGraphqlApiExceptionHandler = ( - error: Error, - i18n: I18n, -) => { +export const objectMetadataGraphqlApiExceptionHandler = (error: Error) => { if (error instanceof WorkspaceMigrationBuilderException) { - workspaceMigrationBuilderExceptionFormatter(error, i18n); + workspaceMigrationBuilderGraphqlApiExceptionHandler(error); } if (error instanceof InvalidMetadataException) { diff --git a/packages/twenty-server/src/engine/metadata-modules/object-permission/field-permission/__tests__/field-permissions.service.spec.ts b/packages/twenty-server/src/engine/metadata-modules/object-permission/field-permission/__tests__/field-permissions.service.spec.ts index 61cc043e8c..0d236c563d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-permission/field-permission/__tests__/field-permissions.service.spec.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-permission/field-permission/__tests__/field-permissions.service.spec.ts @@ -1,6 +1,7 @@ import { Test, type TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; +import { msg } from '@lingui/core/macro'; import { type ObjectsPermissionsByRoleId } from 'twenty-shared/types'; import { type Repository } from 'typeorm'; @@ -755,7 +756,7 @@ describe('FieldPermissionService', () => { { code: PermissionsExceptionCode.ROLE_NOT_EDITABLE, message: 'Role is not editable', - userFriendlyMessage: 'This role cannot be modified.', + userFriendlyMessage: msg`This role cannot be modified.`, }, ], }, diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout/utils/page-layout-graphql-api-exception-handler.util.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout/utils/page-layout-graphql-api-exception-handler.util.ts index 34896c1bfa..78571a4305 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout/utils/page-layout-graphql-api-exception-handler.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout/utils/page-layout-graphql-api-exception-handler.util.ts @@ -1,4 +1,3 @@ -import { type I18n } from '@lingui/core'; import { assertUnreachable } from 'twenty-shared/utils'; import { @@ -18,14 +17,11 @@ import { PageLayoutExceptionCode, } from 'src/engine/metadata-modules/page-layout/exceptions/page-layout.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { workspaceMigrationBuilderExceptionFormatter } from 'src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-builder-exception-formatter'; +import { workspaceMigrationBuilderGraphqlApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-graphql-api-exception-handler.util'; -export const pageLayoutGraphqlApiExceptionHandler = ( - error: Error, - i18n: I18n, -) => { +export const pageLayoutGraphqlApiExceptionHandler = (error: Error) => { if (error instanceof WorkspaceMigrationBuilderException) { - return workspaceMigrationBuilderExceptionFormatter(error, i18n); + return workspaceMigrationBuilderGraphqlApiExceptionHandler(error); } if (error instanceof PageLayoutException) { diff --git a/packages/twenty-server/src/engine/metadata-modules/page-layout/utils/page-layout-graphql-api-exception.filter.ts b/packages/twenty-server/src/engine/metadata-modules/page-layout/utils/page-layout-graphql-api-exception.filter.ts index f302c75843..804b1e68d6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/page-layout/utils/page-layout-graphql-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/metadata-modules/page-layout/utils/page-layout-graphql-api-exception.filter.ts @@ -4,11 +4,7 @@ import { type ExecutionContext, Injectable, } from '@nestjs/common'; -import { GqlExecutionContext } from '@nestjs/graphql'; -import { SOURCE_LOCALE } from 'twenty-shared/translations'; - -import { I18nService } from 'src/engine/core-modules/i18n/i18n.service'; import { PageLayoutTabException } from 'src/engine/metadata-modules/page-layout-tab/exceptions/page-layout-tab.exception'; import { PageLayoutWidgetException } from 'src/engine/metadata-modules/page-layout-widget/exceptions/page-layout-widget.exception'; import { PageLayoutException } from 'src/engine/metadata-modules/page-layout/exceptions/page-layout.exception'; @@ -23,21 +19,14 @@ import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager ) @Injectable() export class PageLayoutGraphqlApiExceptionFilter implements ExceptionFilter { - constructor(private readonly i18nService: I18nService) {} - catch( exception: | PageLayoutException | PageLayoutTabException | PageLayoutWidgetException | WorkspaceMigrationBuilderException, - host: ExecutionContext, + _host: ExecutionContext, ) { - const gqlContext = GqlExecutionContext.create(host); - const ctx = gqlContext.getContext(); - const userLocale = ctx.req?.locale ?? SOURCE_LOCALE; - const i18n = this.i18nService.getI18nInstance(userLocale); - - return pageLayoutGraphqlApiExceptionHandler(exception, i18n); + return pageLayoutGraphqlApiExceptionHandler(exception); } } diff --git a/packages/twenty-server/src/engine/metadata-modules/view-field/filters/view-field-rest-api-exception.filter.ts b/packages/twenty-server/src/engine/metadata-modules/view-field/filters/view-field-rest-api-exception.filter.ts index f527f32b43..3e0c38e34c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-field/filters/view-field-rest-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-field/filters/view-field-rest-api-exception.filter.ts @@ -16,7 +16,7 @@ import { ViewFieldExceptionCode, } from 'src/engine/metadata-modules/view-field/exceptions/view-field.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util'; +import { workspaceMigrationBuilderRestApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-rest-api-exception-handler.util'; import { type CustomException, UnknownException, @@ -38,19 +38,10 @@ export class ViewFieldRestApiExceptionFilter implements ExceptionFilter { const response = ctx.getResponse(); if (exception instanceof WorkspaceMigrationBuilderException) { - const i18n = this.i18nService.getI18nInstance(SOURCE_LOCALE); - const { errors, summary } = - fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError( - exception, - i18n, - ); - - return response.status(400).json({ - statusCode: 400, - error: 'METADATA_VALIDATION_ERROR', - message: exception.message || 'Validation failed', - errors, - summary, + return workspaceMigrationBuilderRestApiExceptionHandler({ + exception, + response, + i18n: this.i18nService.getI18nInstance(SOURCE_LOCALE), }); } diff --git a/packages/twenty-server/src/engine/metadata-modules/view-filter-group/filters/view-filter-group-rest-api-exception.filter.ts b/packages/twenty-server/src/engine/metadata-modules/view-filter-group/filters/view-filter-group-rest-api-exception.filter.ts index b4959c3867..6784629c2b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-filter-group/filters/view-filter-group-rest-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-filter-group/filters/view-filter-group-rest-api-exception.filter.ts @@ -16,7 +16,7 @@ import { ViewFilterGroupExceptionCode, } from 'src/engine/metadata-modules/view-filter-group/exceptions/view-filter-group.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util'; +import { workspaceMigrationBuilderRestApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-rest-api-exception-handler.util'; import { type CustomException, UnknownException, @@ -38,19 +38,10 @@ export class ViewFilterGroupRestApiExceptionFilter implements ExceptionFilter { const response = ctx.getResponse(); if (exception instanceof WorkspaceMigrationBuilderException) { - const i18n = this.i18nService.getI18nInstance(SOURCE_LOCALE); - const { errors, summary } = - fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError( - exception, - i18n, - ); - - return response.status(400).json({ - statusCode: 400, - error: 'METADATA_VALIDATION_ERROR', - message: exception.message || 'Validation failed', - errors, - summary, + return workspaceMigrationBuilderRestApiExceptionHandler({ + exception, + response, + i18n: this.i18nService.getI18nInstance(SOURCE_LOCALE), }); } diff --git a/packages/twenty-server/src/engine/metadata-modules/view-filter/filters/view-filter-rest-api-exception.filter.ts b/packages/twenty-server/src/engine/metadata-modules/view-filter/filters/view-filter-rest-api-exception.filter.ts index 1effcb80fc..b5a3106743 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-filter/filters/view-filter-rest-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-filter/filters/view-filter-rest-api-exception.filter.ts @@ -16,7 +16,7 @@ import { ViewFilterExceptionCode, } from 'src/engine/metadata-modules/view-filter/exceptions/view-filter.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util'; +import { workspaceMigrationBuilderRestApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-rest-api-exception-handler.util'; import { type CustomException, UnknownException, @@ -38,19 +38,10 @@ export class ViewFilterRestApiExceptionFilter implements ExceptionFilter { const response = ctx.getResponse(); if (exception instanceof WorkspaceMigrationBuilderException) { - const i18n = this.i18nService.getI18nInstance(SOURCE_LOCALE); - const { errors, summary } = - fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError( - exception, - i18n, - ); - - return response.status(400).json({ - statusCode: 400, - error: 'METADATA_VALIDATION_ERROR', - message: exception.message || 'Validation failed', - errors, - summary, + return workspaceMigrationBuilderRestApiExceptionHandler({ + exception, + response, + i18n: this.i18nService.getI18nInstance(SOURCE_LOCALE), }); } diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/filters/view-group-rest-api-exception.filter.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/filters/view-group-rest-api-exception.filter.ts index a1b46b22fa..e9cf116093 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/filters/view-group-rest-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/filters/view-group-rest-api-exception.filter.ts @@ -16,7 +16,7 @@ import { ViewGroupExceptionCode, } from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util'; +import { workspaceMigrationBuilderRestApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-rest-api-exception-handler.util'; import { type CustomException, UnknownException, @@ -38,19 +38,10 @@ export class ViewGroupRestApiExceptionFilter implements ExceptionFilter { const response = ctx.getResponse(); if (exception instanceof WorkspaceMigrationBuilderException) { - const i18n = this.i18nService.getI18nInstance(SOURCE_LOCALE); - const { errors, summary } = - fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError( - exception, - i18n, - ); - - return response.status(400).json({ - statusCode: 400, - error: 'METADATA_VALIDATION_ERROR', - message: exception.message || 'Validation failed', - errors, - summary, + return workspaceMigrationBuilderRestApiExceptionHandler({ + exception, + response, + i18n: this.i18nService.getI18nInstance(SOURCE_LOCALE), }); } diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/utils/view-group-graphql-api-exception-handler.util.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/utils/view-group-graphql-api-exception-handler.util.ts index 73b4cd1cec..65be0b8e84 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/utils/view-group-graphql-api-exception-handler.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/utils/view-group-graphql-api-exception-handler.util.ts @@ -1,5 +1,3 @@ -import { type I18n } from '@lingui/core'; - import { UserInputError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; import { ViewGroupException, @@ -7,10 +5,7 @@ import { } from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; import { viewGraphqlApiExceptionHandler } from 'src/engine/metadata-modules/view/utils/view-graphql-api-exception-handler.util'; -export const viewGroupGraphqlApiExceptionHandler = ( - error: Error, - i18n: I18n, -) => { +export const viewGroupGraphqlApiExceptionHandler = (error: Error) => { if (error instanceof ViewGroupException) { if ( error.code === @@ -22,5 +17,5 @@ export const viewGroupGraphqlApiExceptionHandler = ( } } - return viewGraphqlApiExceptionHandler(error, i18n); + return viewGraphqlApiExceptionHandler(error); }; diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/utils/view-group-graphql-api-exception.filter.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/utils/view-group-graphql-api-exception.filter.ts index 4a004e050f..b01ef1af26 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/utils/view-group-graphql-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/utils/view-group-graphql-api-exception.filter.ts @@ -4,11 +4,7 @@ import { type ExecutionContext, Injectable, } from '@nestjs/common'; -import { GqlExecutionContext } from '@nestjs/graphql'; -import { SOURCE_LOCALE } from 'twenty-shared/translations'; - -import { I18nService } from 'src/engine/core-modules/i18n/i18n.service'; import { ViewGroupException } from 'src/engine/metadata-modules/view-group/exceptions/view-group.exception'; import { viewGroupGraphqlApiExceptionHandler } from 'src/engine/metadata-modules/view-group/utils/view-group-graphql-api-exception-handler.util'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; @@ -16,17 +12,10 @@ import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager @Catch(ViewGroupException, WorkspaceMigrationBuilderException) @Injectable() export class ViewGroupGraphqlApiExceptionFilter implements ExceptionFilter { - constructor(private readonly i18nService: I18nService) {} - catch( exception: ViewGroupException | WorkspaceMigrationBuilderException, - host: ExecutionContext, + _host: ExecutionContext, ) { - const gqlContext = GqlExecutionContext.create(host); - const ctx = gqlContext.getContext(); - const userLocale = ctx.req?.locale ?? SOURCE_LOCALE; - const i18n = this.i18nService.getI18nInstance(userLocale); - - return viewGroupGraphqlApiExceptionHandler(exception, i18n); + return viewGroupGraphqlApiExceptionHandler(exception); } } diff --git a/packages/twenty-server/src/engine/metadata-modules/view-sort/filters/view-sort-rest-api-exception.filter.ts b/packages/twenty-server/src/engine/metadata-modules/view-sort/filters/view-sort-rest-api-exception.filter.ts index f89e0f30cf..caac2915c1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-sort/filters/view-sort-rest-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-sort/filters/view-sort-rest-api-exception.filter.ts @@ -16,7 +16,7 @@ import { ViewSortExceptionCode, } from 'src/engine/metadata-modules/view-sort/exceptions/view-sort.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util'; +import { workspaceMigrationBuilderRestApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-rest-api-exception-handler.util'; import { type CustomException, UnknownException, @@ -38,19 +38,10 @@ export class ViewSortRestApiExceptionFilter implements ExceptionFilter { const response = ctx.getResponse(); if (exception instanceof WorkspaceMigrationBuilderException) { - const i18n = this.i18nService.getI18nInstance(SOURCE_LOCALE); - const { errors, summary } = - fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError( - exception, - i18n, - ); - - return response.status(400).json({ - statusCode: 400, - error: 'METADATA_VALIDATION_ERROR', - message: exception.message || 'Validation failed', - errors, - summary, + return workspaceMigrationBuilderRestApiExceptionHandler({ + exception, + response, + i18n: this.i18nService.getI18nInstance(SOURCE_LOCALE), }); } diff --git a/packages/twenty-server/src/engine/metadata-modules/view/filters/view-rest-api-exception.filter.ts b/packages/twenty-server/src/engine/metadata-modules/view/filters/view-rest-api-exception.filter.ts index d388ad4f37..e969aec36a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view/filters/view-rest-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view/filters/view-rest-api-exception.filter.ts @@ -16,7 +16,7 @@ import { ViewExceptionCode, } from 'src/engine/metadata-modules/view/exceptions/view.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util'; +import { workspaceMigrationBuilderRestApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-rest-api-exception-handler.util'; import { type CustomException, UnknownException, @@ -38,19 +38,10 @@ export class ViewRestApiExceptionFilter implements ExceptionFilter { const response = ctx.getResponse(); if (exception instanceof WorkspaceMigrationBuilderException) { - const i18n = this.i18nService.getI18nInstance(SOURCE_LOCALE); - const { errors, summary } = - fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError( - exception, - i18n, - ); - - return response.status(400).json({ - statusCode: 400, - error: 'METADATA_VALIDATION_ERROR', - message: exception.message || 'Validation failed', - errors, - summary, + return workspaceMigrationBuilderRestApiExceptionHandler({ + exception, + response, + i18n: this.i18nService.getI18nInstance(SOURCE_LOCALE), }); } diff --git a/packages/twenty-server/src/engine/metadata-modules/view/utils/view-graphql-api-exception-handler.util.ts b/packages/twenty-server/src/engine/metadata-modules/view/utils/view-graphql-api-exception-handler.util.ts index b20d9b58b6..a7af9225aa 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view/utils/view-graphql-api-exception-handler.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view/utils/view-graphql-api-exception-handler.util.ts @@ -1,4 +1,3 @@ -import { type I18n } from '@lingui/core'; import { assertUnreachable } from 'twenty-shared/utils'; import { @@ -36,11 +35,11 @@ import { ViewExceptionCode, } from 'src/engine/metadata-modules/view/exceptions/view.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { workspaceMigrationBuilderExceptionFormatter } from 'src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-builder-exception-formatter'; +import { workspaceMigrationBuilderGraphqlApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-graphql-api-exception-handler.util'; -export const viewGraphqlApiExceptionHandler = (error: Error, i18n: I18n) => { +export const viewGraphqlApiExceptionHandler = (error: Error) => { if (error instanceof WorkspaceMigrationBuilderException) { - return workspaceMigrationBuilderExceptionFormatter(error, i18n); + return workspaceMigrationBuilderGraphqlApiExceptionHandler(error); } if (error instanceof ViewException) { diff --git a/packages/twenty-server/src/engine/metadata-modules/view/utils/view-graphql-api-exception.filter.ts b/packages/twenty-server/src/engine/metadata-modules/view/utils/view-graphql-api-exception.filter.ts index 1a2c9c98db..cef93547ec 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view/utils/view-graphql-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view/utils/view-graphql-api-exception.filter.ts @@ -4,11 +4,7 @@ import { type ExecutionContext, Injectable, } from '@nestjs/common'; -import { GqlExecutionContext } from '@nestjs/graphql'; -import { SOURCE_LOCALE } from 'twenty-shared/translations'; - -import { I18nService } from 'src/engine/core-modules/i18n/i18n.service'; import { ViewFieldGroupException } from 'src/engine/metadata-modules/view-field-group/exceptions/view-field-group.exception'; import { ViewFieldException } from 'src/engine/metadata-modules/view-field/exceptions/view-field.exception'; import { ViewFilterGroupException } from 'src/engine/metadata-modules/view-filter-group/exceptions/view-filter-group.exception'; @@ -30,8 +26,6 @@ import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager ) @Injectable() export class ViewGraphqlApiExceptionFilter implements ExceptionFilter { - constructor(private readonly i18nService: I18nService) {} - catch( exception: | ViewException @@ -42,13 +36,8 @@ export class ViewGraphqlApiExceptionFilter implements ExceptionFilter { | ViewGroupException | ViewSortException | WorkspaceMigrationBuilderException, - host: ExecutionContext, + _host: ExecutionContext, ) { - const gqlContext = GqlExecutionContext.create(host); - const ctx = gqlContext.getContext(); - const userLocale = ctx.req?.locale ?? SOURCE_LOCALE; - const i18n = this.i18nService.getI18nInstance(userLocale); - - return viewGraphqlApiExceptionHandler(exception, i18n); + return viewGraphqlApiExceptionHandler(exception); } } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/types/metadata-validation-error-response-descriptor.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/types/metadata-validation-error-response-descriptor.type.ts new file mode 100644 index 0000000000..484002761c --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/types/metadata-validation-error-response-descriptor.type.ts @@ -0,0 +1,16 @@ +import { type AllMetadataName } from 'twenty-shared/metadata'; + +import { type WorkspaceMigrationActionType } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type'; +import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; + +export type MetadataValidationErrorResponseDescriptor = { + summary: { + totalErrors: number; + } & Partial>; + errors: Partial<{ + [P in AllMetadataName]: FailedFlatEntityValidation< + P, + WorkspaceMigrationActionType + >[]; + }>; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/__tests__/build-metadata-validation-error-payload.util.spec.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/__tests__/build-metadata-validation-error-payload.util.spec.ts new file mode 100644 index 0000000000..60d85db619 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/__tests__/build-metadata-validation-error-payload.util.spec.ts @@ -0,0 +1,143 @@ +import { type MessageDescriptor } from '@lingui/core'; +import { msg } from '@lingui/core/macro'; + +import { EMPTY_ORCHESTRATOR_FAILURE_REPORT } from 'src/engine/workspace-manager/workspace-migration/constant/empty-orchestrator-failure-report.constant'; +import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; +import { buildMetadataValidationErrorPayload } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/build-metadata-validation-error-payload.util'; +import { type OrchestratorFailureReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; + +const buildFailedValidation = ( + errors: Array<{ + code: string; + message: string; + userFriendlyMessage?: MessageDescriptor; + }>, + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): any => ({ + type: 'create', + errors, + flatEntityMinimalInformation: {}, +}); + +const buildException = ( + partialReport: Partial, +): WorkspaceMigrationBuilderException => + new WorkspaceMigrationBuilderException({ + status: 'fail', + report: { ...EMPTY_ORCHESTRATOR_FAILURE_REPORT(), ...partialReport }, + }); + +describe('buildMetadataValidationErrorPayload', () => { + it('returns an empty errors record and a totalErrors-of-0 summary when no metadata has failures', () => { + const payload = buildMetadataValidationErrorPayload(buildException({})); + + expect(payload.errors).toEqual({}); + expect(payload.summary).toEqual({ totalErrors: 0 }); + expect(payload.userFriendlyMessage).toEqual( + msg`Metadata validation failed`, + ); + }); + + it('aggregates per-metadata failure counts into the summary and only exposes metadata buckets that have failures', () => { + const payload = buildMetadataValidationErrorPayload( + buildException({ + view: [ + buildFailedValidation([{ code: 'A', message: 'a' }]), + buildFailedValidation([{ code: 'B', message: 'b' }]), + ], + viewGroup: [buildFailedValidation([{ code: 'C', message: 'c' }])], + }), + ); + + expect(payload.summary).toEqual({ + totalErrors: 3, + view: 2, + viewGroup: 1, + }); + expect(Object.keys(payload.errors).sort()).toEqual(['view', 'viewGroup']); + }); + + it('returns the generic "Many validation errors" descriptor when more than one failed validation is reported', () => { + const payload = buildMetadataValidationErrorPayload( + buildException({ + role: [ + buildFailedValidation([ + { + code: 'ERR', + message: 'x', + userFriendlyMessage: msg`Only error`, + }, + ]), + buildFailedValidation([ + { + code: 'ERR2', + message: 'y', + userFriendlyMessage: msg`Other error`, + }, + ]), + ], + }), + ); + + expect(payload.userFriendlyMessage).toEqual(msg`Many validation errors`); + }); + + it("returns the only failure's userFriendlyMessage when exactly one failed validation is reported", () => { + const userFriendlyMessage = msg`Role name is invalid`; + + const payload = buildMetadataValidationErrorPayload( + buildException({ + role: [ + buildFailedValidation([ + { + code: 'ROLE_ERROR', + message: 'invalid', + userFriendlyMessage, + }, + ]), + ], + }), + ); + + expect(payload.userFriendlyMessage).toBe(userFriendlyMessage); + }); + + it('returns the fallback descriptor when the only reported failure has no userFriendlyMessage on any of its errors', () => { + const payload = buildMetadataValidationErrorPayload( + buildException({ + view: [ + buildFailedValidation([ + { code: 'X', message: 'y' }, + { code: 'Z', message: 'z' }, + ]), + ], + }), + ); + + expect(payload.userFriendlyMessage).toEqual( + msg`Metadata validation failed`, + ); + }); + + it("returns the first error's userFriendlyMessage and skips earlier errors that do not provide one", () => { + const userFriendlyMessage = msg`First friendly message`; + + const payload = buildMetadataValidationErrorPayload( + buildException({ + fieldMetadata: [ + buildFailedValidation([ + { code: 'A', message: 'first' }, + { code: 'B', message: 'second', userFriendlyMessage }, + { + code: 'C', + message: 'third', + userFriendlyMessage: msg`Would not reach this`, + }, + ]), + ], + }), + ); + + expect(payload.userFriendlyMessage).toBe(userFriendlyMessage); + }); +}); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/build-metadata-validation-error-payload.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/build-metadata-validation-error-payload.util.ts new file mode 100644 index 0000000000..14b20d7766 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/build-metadata-validation-error-payload.util.ts @@ -0,0 +1,79 @@ +import { type MessageDescriptor } from '@lingui/core'; +import { msg } from '@lingui/core/macro'; +import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; +import { isDefined } from 'twenty-shared/utils'; + +import { type WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; +import { type MetadataValidationErrorResponseDescriptor } from 'src/engine/workspace-manager/workspace-migration/interceptors/types/metadata-validation-error-response-descriptor.type'; + +export type MetadataValidationErrorPayloadDescriptor = + MetadataValidationErrorResponseDescriptor & { + userFriendlyMessage: MessageDescriptor; + }; + +const MANY_VALIDATION_ERRORS_MESSAGE = msg`Many validation errors`; +const METADATA_VALIDATION_FAILED_MESSAGE = msg`Metadata validation failed`; + +const getMetadataValidationUserFriendlyMessage = ( + metadataValidation: MetadataValidationErrorResponseDescriptor, +): MessageDescriptor => { + if (metadataValidation.summary.totalErrors > 1) { + return MANY_VALIDATION_ERRORS_MESSAGE; + } + + for (const metadataName of Object.values(ALL_METADATA_NAME)) { + const failedValidations = metadataValidation.errors[metadataName]; + + if (!isDefined(failedValidations) || failedValidations.length === 0) { + continue; + } + + for (const failedValidation of failedValidations) { + for (const validationError of failedValidation.errors) { + if (isDefined(validationError.userFriendlyMessage)) { + return validationError.userFriendlyMessage; + } + } + } + } + + return METADATA_VALIDATION_FAILED_MESSAGE; +}; + +export const buildMetadataValidationErrorPayload = ( + exception: WorkspaceMigrationBuilderException, +): MetadataValidationErrorPayloadDescriptor => { + const { report } = exception.failedWorkspaceMigrationBuildResult; + + const { errors, summary } = ( + Object.keys(report) as (keyof typeof report)[] + ).reduce( + (acc, metadataName) => { + const failedMetadataValidation = report[metadataName]; + + if (failedMetadataValidation.length === 0) { + return acc; + } + + return { + errors: { ...acc.errors, [metadataName]: failedMetadataValidation }, + summary: { + ...acc.summary, + totalErrors: + acc.summary.totalErrors + failedMetadataValidation.length, + [metadataName]: failedMetadataValidation.length, + }, + }; + }, + { errors: {}, summary: { totalErrors: 0 } }, + ); + + return { + errors, + summary, + userFriendlyMessage: getMetadataValidationUserFriendlyMessage({ + errors, + summary, + }), + }; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util.ts deleted file mode 100644 index 17b608abe3..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { type I18n } from '@lingui/core'; -import { type MetadataValidationErrorResponse } from 'twenty-shared/metadata'; - -import { type WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { translateOrchestratorFailureReportErrors } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/translate-orchestrator-failure-report-errors.util'; - -export const fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError = - ( - workspaceMigrationBuilderException: WorkspaceMigrationBuilderException, - i18n: I18n, - ): MetadataValidationErrorResponse => { - const translatedReport = translateOrchestratorFailureReportErrors( - workspaceMigrationBuilderException.failedWorkspaceMigrationBuildResult - .report, - i18n, - ); - - const initialAccumulator: MetadataValidationErrorResponse = { - errors: {}, - summary: { - totalErrors: 0, - }, - }; - - return ( - Object.keys(translatedReport) as (keyof typeof translatedReport)[] - ).reduce((acc, metadataName) => { - const failedMetadataValidation = translatedReport[metadataName]; - - if (failedMetadataValidation.length === 0) { - return acc; - } - - return { - errors: { - ...acc.errors, - [metadataName]: failedMetadataValidation, - }, - summary: { - ...acc.summary, - totalErrors: - acc.summary.totalErrors + failedMetadataValidation.length, - [metadataName]: failedMetadataValidation.length, - }, - } satisfies MetadataValidationErrorResponse; - }, initialAccumulator); - }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/translate-orchestrator-failure-report-errors.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/translate-orchestrator-failure-report-errors.util.ts deleted file mode 100644 index 7d82c57518..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/translate-orchestrator-failure-report-errors.util.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { type I18n, type MessageDescriptor } from '@lingui/core'; -import { isDefined } from 'twenty-shared/utils'; - -import { type OrchestratorFailureReport } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type'; -import { type FlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type'; - -const isMessageDescriptor = (obj: unknown): obj is MessageDescriptor => - isDefined(obj) && - typeof obj === 'object' && - Object.prototype.hasOwnProperty.call(obj, 'id') && - Object.prototype.hasOwnProperty.call(obj, 'message') && - typeof (obj as MessageDescriptor).id === 'string'; - -const translateUserFriendlyMessageInFlatEntityValidationError = ( - obj: T, - i18n: I18n, - parentKey?: string, -): T => { - if (!obj || typeof obj !== 'object') { - return obj; - } - - if ( - isMessageDescriptor(obj) && - isDefined(parentKey) && - parentKey === - ('userFriendlyMessage' as const satisfies keyof FlatEntityValidationError) - ) { - return i18n._(obj) as T; - } - - if (Array.isArray(obj)) { - return obj.map((item) => - translateUserFriendlyMessageInFlatEntityValidationError( - item, - i18n, - parentKey, - ), - ) as T; - } - - const result = {} as T; - - for (const [key, value] of Object.entries(obj)) { - (result as Record)[key] = - translateUserFriendlyMessageInFlatEntityValidationError(value, i18n, key); - } - - return result; -}; - -export const translateOrchestratorFailureReportErrors = ( - report: OrchestratorFailureReport, - i18n: I18n, -) => { - return translateUserFriendlyMessageInFlatEntityValidationError(report, i18n); -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-graphql-api-exception-handler.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-graphql-api-exception-handler.util.ts new file mode 100644 index 0000000000..82519ec278 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-graphql-api-exception-handler.util.ts @@ -0,0 +1,39 @@ +import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; +import { isDefined } from 'twenty-shared/utils'; + +import { + BaseGraphQLError, + ErrorCode, +} from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; +import { type WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; +import { buildMetadataValidationErrorPayload } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/build-metadata-validation-error-payload.util'; + +export const workspaceMigrationBuilderGraphqlApiExceptionHandler = ( + exception: WorkspaceMigrationBuilderException, +) => { + const payload = buildMetadataValidationErrorPayload(exception); + + const validationSummaryMessage = `Validation failed for ${Object.values( + ALL_METADATA_NAME, + ) + .flatMap((metadataName) => { + const count = payload.summary[metadataName]; + + if (!isDefined(count) || count === 0) { + return []; + } + + return [`${count} ${metadataName}${count > 1 ? 's' : ''}`]; + }) + .join(', ')}`; + + throw new BaseGraphQLError( + exception.message, + ErrorCode.METADATA_VALIDATION_FAILED, + { + code: 'METADATA_VALIDATION_ERROR', + ...payload, + message: validationSummaryMessage, + }, + ); +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-rest-api-exception-handler.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-rest-api-exception-handler.util.ts new file mode 100644 index 0000000000..abbd325f50 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-rest-api-exception-handler.util.ts @@ -0,0 +1,28 @@ +import { type I18n } from '@lingui/core'; +import { type Response } from 'express'; + +import { type WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; +import { buildMetadataValidationErrorPayload } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/build-metadata-validation-error-payload.util'; +import { translateUserFriendlyMessageDescriptors } from 'src/engine/core-modules/i18n/utils/translate-user-friendly-message-descriptors.util'; + +export const workspaceMigrationBuilderRestApiExceptionHandler = ({ + exception, + response, + i18n, +}: { + exception: WorkspaceMigrationBuilderException; + response: Response; + i18n: I18n; +}): Response => { + const payload = translateUserFriendlyMessageDescriptors( + buildMetadataValidationErrorPayload(exception), + i18n, + ); + + return response.status(400).json({ + statusCode: 400, + error: 'METADATA_VALIDATION_ERROR', + message: exception.message || 'Validation failed', + ...payload, + }); +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-builder-exception-formatter.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-builder-exception-formatter.ts deleted file mode 100644 index fdd16fb594..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-builder-exception-formatter.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { type I18n } from '@lingui/core'; -import { msg } from '@lingui/core/macro'; -import { ALL_METADATA_NAME } from 'twenty-shared/metadata'; -import { isDefined } from 'twenty-shared/utils'; - -import { - BaseGraphQLError, - ErrorCode, -} from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; -import { type WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/from-workspace-migration-builder-exception-to-metadata-validation-response-error.util'; - -export const workspaceMigrationBuilderExceptionFormatter = ( - error: WorkspaceMigrationBuilderException, - i18n: I18n, -) => { - const { errors, summary } = - fromWorkspaceMigrationBuilderExceptionToMetadataValidationResponseError( - error, - i18n, - ); - - const message = `Validation failed for ${Object.values(ALL_METADATA_NAME) - .flatMap((metadataName) => { - const count = summary[metadataName]; - - if (!isDefined(count) || count === 0) { - return []; - } - - return [`${count} ${metadataName}${count > 1 ? 's' : ''}`]; - }) - .join(', ')}`; - - throw new BaseGraphQLError( - error.message, - ErrorCode.METADATA_VALIDATION_FAILED, - { - code: 'METADATA_VALIDATION_ERROR', - errors, - summary, - message, - userFriendlyMessage: msg`Metadata validation failed`, - }, - ); -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-graphql-api-exception.interceptor.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-graphql-api-exception.interceptor.ts index db2910d4c5..6cff95903c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-graphql-api-exception.interceptor.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-graphql-api-exception.interceptor.ts @@ -4,19 +4,16 @@ import { Injectable, type NestInterceptor, } from '@nestjs/common'; -import { GqlExecutionContext } from '@nestjs/graphql'; import { type Observable, catchError } from 'rxjs'; -import { SOURCE_LOCALE } from 'twenty-shared/translations'; -import { I18nService } from 'src/engine/core-modules/i18n/i18n.service'; import { NotFoundError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; import { FlatEntityMapsException, FlatEntityMapsExceptionCode, } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; -import { workspaceMigrationBuilderExceptionFormatter } from 'src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-builder-exception-formatter'; +import { workspaceMigrationBuilderGraphqlApiExceptionHandler } from 'src/engine/workspace-manager/workspace-migration/interceptors/utils/workspace-migration-builder-graphql-api-exception-handler.util'; import { workspaceMigrationRunnerExceptionFormatter } from 'src/engine/workspace-manager/workspace-migration/interceptors/workspace-migration-runner-exception-formatter'; import { WorkspaceMigrationRunnerException } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/exceptions/workspace-migration-runner.exception'; @@ -24,14 +21,7 @@ import { WorkspaceMigrationRunnerException } from 'src/engine/workspace-manager/ export class WorkspaceMigrationGraphqlApiExceptionInterceptor implements NestInterceptor { - constructor(private readonly i18nService: I18nService) {} - intercept(context: ExecutionContext, next: CallHandler): Observable { - const gqlContext = GqlExecutionContext.create(context); - const ctx = gqlContext.getContext(); - const locale = ctx.req?.locale ?? SOURCE_LOCALE; - const i18n = this.i18nService.getI18nInstance(locale); - return next.handle().pipe( catchError((error) => { if (error instanceof FlatEntityMapsException) { @@ -46,7 +36,7 @@ export class WorkspaceMigrationGraphqlApiExceptionInterceptor } if (error instanceof WorkspaceMigrationBuilderException) { - workspaceMigrationBuilderExceptionFormatter(error, i18n); + workspaceMigrationBuilderGraphqlApiExceptionHandler(error); } if (error instanceof WorkspaceMigrationRunnerException) { diff --git a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field.integration-spec.ts.snap index 999b7e4e6b..9f3646a187 100644 --- a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/failing-create-view-field.integration-spec.ts.snap @@ -30,7 +30,7 @@ exports[`View Field Resolver - Failing Create Operation Should fail to create a "totalErrors": 1, "viewField": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "View field already exists", }, "message": "Multiple validation errors occurred while creating view fields", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap index 8c13edaf4a..91074906d7 100644 --- a/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/graphql/suites/view/view-field/__snapshots__/object-identifier-update-side-effect-on-view-field.integration-spec.ts.snap @@ -30,7 +30,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side "totalErrors": 1, "viewField": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "View field position cannot be lower than label identifier view field position", }, "message": "Multiple validation errors occurred while creating view fields", "name": "GraphQLError", @@ -67,7 +67,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side "totalErrors": 1, "viewField": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label identifier view field cannot be deleted", }, "message": "Multiple validation errors occurred while deleting view field", "name": "GraphQLError", @@ -103,7 +103,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side "totalErrors": 1, "viewField": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label identifier view field cannot be deleted", }, "message": "Multiple validation errors occurred while deleting view field", "name": "GraphQLError", @@ -140,7 +140,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side "totalErrors": 1, "viewField": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label identifier view field has to be visible", }, "message": "Multiple validation errors occurred while updating view field", "name": "GraphQLError", @@ -177,7 +177,7 @@ exports[`View Field Resolver - Successful object metadata identifier update side "totalErrors": 1, "viewField": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label identifier view field has to be in the lowest position", }, "message": "Multiple validation errors occurred while updating view field", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-creation.integration-spec.ts.snap index 5cc15e272e..520814c16c 100644 --- a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-creation.integration-spec.ts.snap @@ -29,7 +29,7 @@ exports[`Agent creation should fail when computed name already exists 1`] = ` "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "An agent with this name already exists", }, "message": "Multiple validation errors occurred while creating agent", "name": "GraphQLError", @@ -65,7 +65,7 @@ exports[`Agent creation should fail when label is empty string 1`] = ` "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label cannot be empty", }, "message": "Multiple validation errors occurred while creating agent", "name": "GraphQLError", @@ -115,7 +115,7 @@ exports[`Agent creation should fail when modelId is empty string 1`] = ` "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Model ID cannot be empty", }, "message": "Multiple validation errors occurred while creating agent", "name": "GraphQLError", @@ -165,7 +165,7 @@ exports[`Agent creation should fail when prompt is empty string 1`] = ` "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Prompt cannot be empty", }, "message": "Multiple validation errors occurred while creating agent", "name": "GraphQLError", @@ -215,7 +215,7 @@ exports[`Agent creation should fail when responseFormat has invalid type 1`] = ` "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid response format type", }, "message": "Multiple validation errors occurred while creating agent", "name": "GraphQLError", @@ -251,7 +251,7 @@ exports[`Agent creation should fail when responseFormat type is json but schema "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "JSON response format requires a schema", }, "message": "Multiple validation errors occurred while creating agent", "name": "GraphQLError", @@ -287,7 +287,7 @@ exports[`Agent creation should fail when responseFormat type is text but schema "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Text response format should not have a schema", }, "message": "Multiple validation errors occurred while creating agent", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap index 0495455bc8..15e55ab0f0 100644 --- a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-deletion.integration-spec.ts.snap @@ -29,7 +29,7 @@ exports[`Agent deletion should fail should fail when attempting to delete a stan "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Cannot delete standard agent", }, "message": "Multiple validation errors occurred while deleting agent", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-update.integration-spec.ts.snap index aa81ef09dc..2cdc9c6a59 100644 --- a/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/agent/__snapshots__/failing-agent-update.integration-spec.ts.snap @@ -28,7 +28,7 @@ exports[`Agent update should fail should fail when attempting to update a standa "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Cannot update standard agent", }, "message": "Multiple validation errors occurred while updating agent", "name": "GraphQLError", @@ -85,7 +85,7 @@ exports[`Agent update should fail when settings null required properties 1`] = ` "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label cannot be empty", }, "message": "Multiple validation errors occurred while updating agent", "name": "GraphQLError", @@ -120,7 +120,7 @@ exports[`Agent update should fail when updating label to one that already exists "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "An agent with this name already exists", }, "message": "Multiple validation errors occurred while updating agent", "name": "GraphQLError", @@ -155,7 +155,7 @@ exports[`Agent update should fail when updating responseFormat type to json with "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "JSON response format requires a schema", }, "message": "Multiple validation errors occurred while updating agent", "name": "GraphQLError", @@ -190,7 +190,7 @@ exports[`Agent update should fail when updating responseFormat type to text with "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Text response format should not have a schema", }, "message": "Multiple validation errors occurred while updating agent", "name": "GraphQLError", @@ -225,7 +225,7 @@ exports[`Agent update should fail when updating responseFormat with invalid type "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid response format type", }, "message": "Multiple validation errors occurred while updating agent", "name": "GraphQLError", @@ -260,7 +260,7 @@ exports[`Agent update should fail when updating with empty label 1`] = ` "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label cannot be empty", }, "message": "Multiple validation errors occurred while updating agent", "name": "GraphQLError", @@ -295,7 +295,7 @@ exports[`Agent update should fail when updating with empty modelId 1`] = ` "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Model ID cannot be empty", }, "message": "Multiple validation errors occurred while updating agent", "name": "GraphQLError", @@ -330,7 +330,7 @@ exports[`Agent update should fail when updating with empty prompt 1`] = ` "agent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Prompt cannot be empty", }, "message": "Multiple validation errors occurred while updating agent", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-cross-app-permission-create-on-standard-role.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-cross-app-permission-create-on-standard-role.integration-spec.ts.snap index 341a8522d4..cc17ce95f8 100644 --- a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-cross-app-permission-create-on-standard-role.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-cross-app-permission-create-on-standard-role.integration-spec.ts.snap @@ -63,7 +63,7 @@ exports[`Sync application should fail when creating permissions on a standard ro "role": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -121,7 +121,7 @@ exports[`Sync application should fail when creating permissions on a standard ro "role": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -185,7 +185,7 @@ exports[`Sync application should fail when creating permissions on a standard ro "role": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-cross-app-permission-retarget-on-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-cross-app-permission-retarget-on-update.integration-spec.ts.snap index 41b69d2866..e59cdb3bfb 100644 --- a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-cross-app-permission-retarget-on-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-cross-app-permission-retarget-on-update.integration-spec.ts.snap @@ -56,7 +56,7 @@ exports[`Sync application should fail when retargeting existing permissions to a "role": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -119,7 +119,7 @@ exports[`Sync application should fail when retargeting existing permissions to a "role": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -182,7 +182,7 @@ exports[`Sync application should fail when retargeting existing permissions to a "role": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-object-system-fields.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-object-system-fields.integration-spec.ts.snap index 07b8044fa0..76ba10724c 100644 --- a/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-object-system-fields.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/application/__snapshots__/failing-sync-application-object-system-fields.integration-spec.ts.snap @@ -30,7 +30,7 @@ exports[`Sync application should fail due to object system fields integrity shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "System fields cannot be deleted", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -67,7 +67,7 @@ exports[`Sync application should fail due to object system fields integrity shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "System fields cannot be updated", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -129,7 +129,7 @@ exports[`Sync application should fail due to object system fields integrity when "objectMetadata": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -193,7 +193,7 @@ exports[`Sync application should fail due to object system fields integrity when "objectMetadata": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -272,7 +272,7 @@ exports[`Sync application should fail due to object system fields integrity when "objectMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "System field id has invalid type", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -351,7 +351,7 @@ exports[`Sync application should fail due to object system fields integrity when "objectMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "System field id is missing", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -388,7 +388,7 @@ exports[`Sync application should fail due to object system fields integrity when "objectMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "System field searchVector has invalid type", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -467,7 +467,7 @@ exports[`Sync application should fail due to object system fields integrity when "objectMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "System field id is missing", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", @@ -546,7 +546,7 @@ exports[`Sync application should fail due to object system fields integrity when "objectMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "System field id is missing", }, "message": "Validation errors occurred while syncing application manifest metadata", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-creation.integration-spec.ts.snap index fba1b7e1e0..60e2a5e2ea 100644 --- a/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-creation.integration-spec.ts.snap @@ -28,7 +28,7 @@ exports[`CommandMenuItem creation should fail when creating with empty label 1`] "commandMenuItem": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label is required", }, "message": "Multiple validation errors occurred while creating command menu item", "name": "GraphQLError", @@ -121,7 +121,7 @@ exports[`CommandMenuItem creation should fail when creating TRIGGER_WORKFLOW_VER "commandMenuItem": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Workflow version is required for workflow trigger items", }, "message": "Multiple validation errors occurred while creating command menu item", "name": "GraphQLError", @@ -168,7 +168,7 @@ exports[`CommandMenuItem creation should fail when creating FRONT_COMPONENT_REND "commandMenuItem": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Front component is required for front component renderer items", }, "message": "Multiple validation errors occurred while creating command menu item", "name": "GraphQLError", @@ -215,7 +215,7 @@ exports[`CommandMenuItem creation should fail when creating standard key with wo "commandMenuItem": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Workflow version must not be set for this item type", }, "message": "Multiple validation errors occurred while creating command menu item", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-update.integration-spec.ts.snap index 7443952c4f..160623c983 100644 --- a/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/command-menu-item/__snapshots__/failing-command-menu-item-update.integration-spec.ts.snap @@ -55,7 +55,7 @@ exports[`CommandMenuItem update should fail when updating with empty label 1`] = "commandMenuItem": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label is required", }, "message": "Multiple validation errors occurred while updating command menu item", "name": "GraphQLError", @@ -119,7 +119,7 @@ exports[`CommandMenuItem update should fail when changing engineComponentKey to "commandMenuItem": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Workflow version must not be set for this item type", }, "message": "Multiple validation errors occurred while updating command menu item", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap index f90da09133..77c50f7813 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/create-one-field-metadata.integration-spec.ts.snap @@ -31,7 +31,7 @@ exports[`createOne FieldMetadataService name/label sync should return an error w "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Field name is not synced with field label", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-create-one-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-create-one-field-metadata.integration-spec.ts.snap index 98ef9f0ebd..cbdb0c4fe1 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-create-one-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-create-one-field-metadata.integration-spec.ts.snap @@ -32,7 +32,7 @@ exports[`Failing create field metadata tests suite should fail to create NUMERIC "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Field type NUMERIC is not supported. Use Number instead.", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -78,7 +78,7 @@ exports[`Failing create field metadata tests suite should fail to create POSITIO "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Field type POSITION must be named "position"", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-update-one-standard-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-update-one-standard-field-metadata.integration-spec.ts.snap index fbe0e7c083..eaec75230d 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-update-one-standard-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/failing-update-one-standard-field-metadata.integration-spec.ts.snap @@ -94,7 +94,7 @@ exports[`Standard field with standard unique index update should fail on isUniqu }, "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, - "message": "Validation errors occurred while updating field", + "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", } `; diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap index 4d6b00b4da..433b8b3b29 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/__snapshots__/update-one-field-metadata.integration-spec.ts.snap @@ -31,7 +31,7 @@ exports[`updateOne failing update should not update a field name if it is not sy "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Updated field name is not synced with label", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -76,7 +76,7 @@ exports[`updateOne failing update should throw if the field name is not availabl "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Name "otherTestName" is not available as it is already used by another field", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/create-one-files-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/create-one-files-field-metadata.integration-spec.ts.snap index e6372f87c9..1ea50279f4 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/create-one-files-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/create-one-files-field-metadata.integration-spec.ts.snap @@ -49,7 +49,7 @@ exports[`createOne FILES field metadata - failing should fail to create files fi "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -86,7 +86,7 @@ exports[`createOne FILES field metadata - failing should fail to create files fi "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "maxNumberOfValues must be defined in settings and be a number greater than 0 and less than or equal to 10", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -123,7 +123,7 @@ exports[`createOne FILES field metadata - failing should fail to create files fi "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "maxNumberOfValues must be defined in settings and be a number greater than 0 and less than or equal to 10", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -160,7 +160,7 @@ exports[`createOne FILES field metadata - failing should fail to create files fi "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "maxNumberOfValues must be defined in settings and be a number greater than 0 and less than or equal to 10", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/update-one-files-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/update-one-files-field-metadata.integration-spec.ts.snap index 96cf087b64..fa00aba4d0 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/update-one-files-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/atomic/__snapshots__/update-one-files-field-metadata.integration-spec.ts.snap @@ -30,7 +30,7 @@ exports[`updateOne FILES field metadata - failing should fail to update files fi "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "maxNumberOfValues must be defined in settings and be a number greater than 0 and less than or equal to 10", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -67,7 +67,7 @@ exports[`updateOne FILES field metadata - failing should fail to update files fi "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "maxNumberOfValues must be defined in settings and be a number greater than 0 and less than or equal to 10", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -104,7 +104,7 @@ exports[`updateOne FILES field metadata - failing should fail to update files fi "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Files field is not supported for unique fields", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap index 403b634292..9d7de25987 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-create-one-field-metadata-enum-v2.integration-spec.ts.snap @@ -32,7 +32,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Multi-select field default value must be an array", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -72,7 +72,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Multi-select field default value must be an array", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -112,7 +112,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label must not contain a comma", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -167,7 +167,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option id", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -222,7 +222,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option position", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -277,7 +277,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option value", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -332,7 +332,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option value", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -372,7 +372,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "If defined default value must contain at least one value", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -412,7 +412,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Options are required for enum fields", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -437,8 +437,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "" must be one of the option values", - "userFriendlyMessage": "Default value "" must be one of the option values", + "message": "Default value \"\" must be one of the option values", + "userFriendlyMessage": "Default value \"\" must be one of the option values", "value": "", }, ], @@ -458,7 +458,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -498,7 +498,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -538,7 +538,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -578,7 +578,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -603,8 +603,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "invalid" must be one of the option values", - "userFriendlyMessage": "Default value "invalid" must be one of the option values", + "message": "Default value \"invalid\" must be one of the option values", + "userFriendlyMessage": "Default value \"invalid\" must be one of the option values", "value": "invalid", }, { @@ -615,8 +615,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "format" must be one of the option values", - "userFriendlyMessage": "Default value "format" must be one of the option values", + "message": "Default value \"format\" must be one of the option values", + "userFriendlyMessage": "Default value \"format\" must be one of the option values", "value": "format", }, ], @@ -636,7 +636,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -676,7 +676,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -695,8 +695,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "errors": [ { "code": "INVALID_FIELD_INPUT", - "message": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"", - "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"", + "message": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", "value": "Option 1 and some other things, /", }, ], @@ -716,7 +716,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -756,7 +756,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Multi-select field default value must be an array", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -796,7 +796,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value must be a string", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -836,7 +836,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -876,7 +876,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -916,7 +916,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -961,7 +961,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is required", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1000,7 +1000,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label is required", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1040,7 +1040,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Options are required for enum fields", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1079,7 +1079,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value is required", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1104,8 +1104,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "" must be one of the option values", - "userFriendlyMessage": "Default value "" must be one of the option values", + "message": "Default value \"\" must be one of the option values", + "userFriendlyMessage": "Default value \"\" must be one of the option values", "value": "", }, ], @@ -1125,7 +1125,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1165,7 +1165,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1205,7 +1205,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1245,7 +1245,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1270,8 +1270,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" must be one of the option values", - "userFriendlyMessage": "Default value "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" must be one of the option values", + "message": "Default value \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" must be one of the option values", + "userFriendlyMessage": "Default value \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" must be one of the option values", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], @@ -1291,7 +1291,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1331,7 +1331,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1371,7 +1371,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label exceeds 63 characters", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1396,8 +1396,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should }, { "code": "INVALID_FIELD_INPUT", - "message": "Value must be in UPPER_CASE and follow snake_case "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"", - "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"", + "message": "Value must be in UPPER_CASE and follow snake_case \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], @@ -1417,7 +1417,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value exceeds 63 characters", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1456,7 +1456,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label is required", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1495,7 +1495,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value is required", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1535,7 +1535,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Options are required for enum fields", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1554,8 +1554,8 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "errors": [ { "code": "INVALID_FIELD_INPUT", - "message": "Default value "'UNKNOWN_OPTION'" must be one of the option values", - "userFriendlyMessage": "Default value "'UNKNOWN_OPTION'" must be one of the option values", + "message": "Default value \"'UNKNOWN_OPTION'\" must be one of the option values", + "userFriendlyMessage": "Default value \"'UNKNOWN_OPTION'\" must be one of the option values", "value": "'UNKNOWN_OPTION'", }, ], @@ -1575,7 +1575,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value \"'UNKNOWN_OPTION'\" must be one of the option values", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1600,8 +1600,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "invalid" must be one of the option values", - "userFriendlyMessage": "Default value "invalid" must be one of the option values", + "message": "Default value \"invalid\" must be one of the option values", + "userFriendlyMessage": "Default value \"invalid\" must be one of the option values", "value": "invalid", }, ], @@ -1621,7 +1621,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1640,8 +1640,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "errors": [ { "code": "INVALID_FIELD_INPUT", - "message": "Default value "'OPTION_424242'" must be one of the option values", - "userFriendlyMessage": "Default value "'OPTION_424242'" must be one of the option values", + "message": "Default value \"'OPTION_424242'\" must be one of the option values", + "userFriendlyMessage": "Default value \"'OPTION_424242'\" must be one of the option values", "value": "'OPTION_424242'", }, ], @@ -1661,7 +1661,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value \"'OPTION_424242'\" must be one of the option values", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1701,7 +1701,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label must not contain a comma", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1756,7 +1756,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option id", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1811,7 +1811,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option position", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1866,7 +1866,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option value", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1921,7 +1921,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option value", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1961,7 +1961,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Options are required for enum fields", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1986,8 +1986,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "" must be one of the option values", - "userFriendlyMessage": "Default value "" must be one of the option values", + "message": "Default value \"\" must be one of the option values", + "userFriendlyMessage": "Default value \"\" must be one of the option values", "value": "", }, ], @@ -2007,7 +2007,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2047,7 +2047,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2087,7 +2087,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2127,7 +2127,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2167,7 +2167,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2186,8 +2186,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "errors": [ { "code": "INVALID_FIELD_INPUT", - "message": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"", - "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"", + "message": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", "value": "Option 1 and some other things, /", }, ], @@ -2207,7 +2207,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2247,7 +2247,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value must be a string", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2287,7 +2287,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2327,7 +2327,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2367,7 +2367,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2412,7 +2412,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is required", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2451,7 +2451,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label is required", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2491,7 +2491,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Options are required for enum fields", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2530,7 +2530,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value is required", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2555,8 +2555,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "" must be one of the option values", - "userFriendlyMessage": "Default value "" must be one of the option values", + "message": "Default value \"\" must be one of the option values", + "userFriendlyMessage": "Default value \"\" must be one of the option values", "value": "", }, ], @@ -2576,7 +2576,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2616,7 +2616,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2656,7 +2656,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2696,7 +2696,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2721,8 +2721,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" must be one of the option values", - "userFriendlyMessage": "Default value "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" must be one of the option values", + "message": "Default value \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" must be one of the option values", + "userFriendlyMessage": "Default value \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" must be one of the option values", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], @@ -2742,7 +2742,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2782,7 +2782,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2822,7 +2822,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label exceeds 63 characters", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2847,8 +2847,8 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail }, { "code": "INVALID_FIELD_INPUT", - "message": "Value must be in UPPER_CASE and follow snake_case "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"", - "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"", + "message": "Value must be in UPPER_CASE and follow snake_case \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], @@ -2868,7 +2868,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value exceeds 63 characters", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2907,7 +2907,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label is required", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2946,7 +2946,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value is required", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2986,7 +2986,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Options are required for enum fields", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap index 9b26697697..f8e6770d49 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/enum/__snapshots__/failing-update-one-enum-field-metadata-v2.integration-spec.ts.snap @@ -32,7 +32,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Multi-select field default value must be an array", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -72,7 +72,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Multi-select field default value must be an array", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -112,7 +112,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label must not contain a comma", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -167,7 +167,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option id", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -222,7 +222,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option position", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -277,7 +277,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option value", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -332,7 +332,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option value", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -372,7 +372,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "If defined default value must contain at least one value", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -412,7 +412,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Options are required for enum fields", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -437,8 +437,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "" must be one of the option values", - "userFriendlyMessage": "Default value "" must be one of the option values", + "message": "Default value \"\" must be one of the option values", + "userFriendlyMessage": "Default value \"\" must be one of the option values", "value": "", }, ], @@ -458,7 +458,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -498,7 +498,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -538,7 +538,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -578,7 +578,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -603,8 +603,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "invalid" must be one of the option values", - "userFriendlyMessage": "Default value "invalid" must be one of the option values", + "message": "Default value \"invalid\" must be one of the option values", + "userFriendlyMessage": "Default value \"invalid\" must be one of the option values", "value": "invalid", }, { @@ -615,8 +615,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "format" must be one of the option values", - "userFriendlyMessage": "Default value "format" must be one of the option values", + "message": "Default value \"format\" must be one of the option values", + "userFriendlyMessage": "Default value \"format\" must be one of the option values", "value": "format", }, ], @@ -636,7 +636,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -676,7 +676,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -695,8 +695,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "errors": [ { "code": "INVALID_FIELD_INPUT", - "message": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"", - "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"", + "message": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", "value": "Option 1 and some other things, /", }, ], @@ -716,7 +716,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -756,7 +756,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Multi-select field default value must be an array", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -796,7 +796,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value must be a string", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -836,7 +836,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -876,7 +876,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -916,7 +916,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -961,7 +961,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is required", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1000,7 +1000,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label is required", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1039,7 +1039,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value is required", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1064,8 +1064,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "" must be one of the option values", - "userFriendlyMessage": "Default value "" must be one of the option values", + "message": "Default value \"\" must be one of the option values", + "userFriendlyMessage": "Default value \"\" must be one of the option values", "value": "", }, ], @@ -1085,7 +1085,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1125,7 +1125,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1165,7 +1165,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1205,7 +1205,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1230,8 +1230,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" must be one of the option values", - "userFriendlyMessage": "Default value "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" must be one of the option values", + "message": "Default value \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" must be one of the option values", + "userFriendlyMessage": "Default value \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" must be one of the option values", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], @@ -1251,7 +1251,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1291,7 +1291,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1331,7 +1331,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label exceeds 63 characters", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1356,8 +1356,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should }, { "code": "INVALID_FIELD_INPUT", - "message": "Value must be in UPPER_CASE and follow snake_case "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"", - "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"", + "message": "Value must be in UPPER_CASE and follow snake_case \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], @@ -1377,7 +1377,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value exceeds 63 characters", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1416,7 +1416,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label is required", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1455,7 +1455,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value is required", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1474,8 +1474,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "errors": [ { "code": "INVALID_FIELD_INPUT", - "message": "Default value "'OPTION_42'" must be one of the option values", - "userFriendlyMessage": "Default value "'OPTION_42'" must be one of the option values", + "message": "Default value \"'OPTION_42'\" must be one of the option values", + "userFriendlyMessage": "Default value \"'OPTION_42'\" must be one of the option values", "value": "'OPTION_42'", }, ], @@ -1495,7 +1495,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value \"'OPTION_42'\" must be one of the option values", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1514,8 +1514,8 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "errors": [ { "code": "INVALID_FIELD_INPUT", - "message": "Default value "'UNKNOWN_OPTION'" must be one of the option values", - "userFriendlyMessage": "Default value "'UNKNOWN_OPTION'" must be one of the option values", + "message": "Default value \"'UNKNOWN_OPTION'\" must be one of the option values", + "userFriendlyMessage": "Default value \"'UNKNOWN_OPTION'\" must be one of the option values", "value": "'UNKNOWN_OPTION'", }, ], @@ -1535,7 +1535,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value \"'UNKNOWN_OPTION'\" must be one of the option values", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1560,8 +1560,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "invalid" must be one of the option values", - "userFriendlyMessage": "Default value "invalid" must be one of the option values", + "message": "Default value \"invalid\" must be one of the option values", + "userFriendlyMessage": "Default value \"invalid\" must be one of the option values", "value": "invalid", }, ], @@ -1581,7 +1581,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1600,8 +1600,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "errors": [ { "code": "INVALID_FIELD_INPUT", - "message": "Default value "'OPTION_424242'" must be one of the option values", - "userFriendlyMessage": "Default value "'OPTION_424242'" must be one of the option values", + "message": "Default value \"'OPTION_424242'\" must be one of the option values", + "userFriendlyMessage": "Default value \"'OPTION_424242'\" must be one of the option values", "value": "'OPTION_424242'", }, ], @@ -1621,7 +1621,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value \"'OPTION_424242'\" must be one of the option values", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1661,7 +1661,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label must not contain a comma", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1716,7 +1716,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option id", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1771,7 +1771,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option position", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1826,7 +1826,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option value", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1881,7 +1881,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Duplicated option value", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1921,7 +1921,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Options are required for enum fields", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1946,8 +1946,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "" must be one of the option values", - "userFriendlyMessage": "Default value "" must be one of the option values", + "message": "Default value \"\" must be one of the option values", + "userFriendlyMessage": "Default value \"\" must be one of the option values", "value": "", }, ], @@ -1967,7 +1967,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2007,7 +2007,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2047,7 +2047,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2087,7 +2087,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2127,7 +2127,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2146,8 +2146,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "errors": [ { "code": "INVALID_FIELD_INPUT", - "message": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"", - "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "Option 1 and some other things, /"", + "message": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", "value": "Option 1 and some other things, /", }, ], @@ -2167,7 +2167,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"Option 1 and some other things, /\"", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2207,7 +2207,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value must be a string", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2247,7 +2247,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2287,7 +2287,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2327,7 +2327,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2372,7 +2372,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is required", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2411,7 +2411,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label is required", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2450,7 +2450,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value is required", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2475,8 +2475,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "" must be one of the option values", - "userFriendlyMessage": "Default value "" must be one of the option values", + "message": "Default value \"\" must be one of the option values", + "userFriendlyMessage": "Default value \"\" must be one of the option values", "value": "", }, ], @@ -2496,7 +2496,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2536,7 +2536,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2576,7 +2576,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2616,7 +2616,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value format not supported", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2641,8 +2641,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, { "code": "INVALID_FIELD_INPUT", - "message": "Default value "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" must be one of the option values", - "userFriendlyMessage": "Default value "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" must be one of the option values", + "message": "Default value \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" must be one of the option values", + "userFriendlyMessage": "Default value \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\" must be one of the option values", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], @@ -2662,7 +2662,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value should be as quoted string", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2702,7 +2702,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option id is invalid", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2742,7 +2742,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label exceeds 63 characters", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2767,8 +2767,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail }, { "code": "INVALID_FIELD_INPUT", - "message": "Value must be in UPPER_CASE and follow snake_case "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"", - "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"", + "message": "Value must be in UPPER_CASE and follow snake_case \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"", + "userFriendlyMessage": "Value must be in UPPER_CASE and follow snake_case \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"", "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], @@ -2788,7 +2788,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value exceeds 63 characters", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2827,7 +2827,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option label is required", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2866,7 +2866,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Option value is required", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2885,8 +2885,8 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "errors": [ { "code": "INVALID_FIELD_INPUT", - "message": "Default value "'OPTION_42'" must be one of the option values", - "userFriendlyMessage": "Default value "'OPTION_42'" must be one of the option values", + "message": "Default value \"'OPTION_42'\" must be one of the option values", + "userFriendlyMessage": "Default value \"'OPTION_42'\" must be one of the option values", "value": "'OPTION_42'", }, ], @@ -2906,7 +2906,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Default value \"'OPTION_42'\" must be one of the option values", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-add-one-target-to-metadata-morph-relation-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-add-one-target-to-metadata-morph-relation-v2.integration-spec.ts.snap index d0a4c5c85e..803b86e1a4 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-add-one-target-to-metadata-morph-relation-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-add-one-target-to-metadata-morph-relation-v2.integration-spec.ts.snap @@ -78,7 +78,7 @@ exports[`updateOne FieldMetadataService morph relation fields v2 - Add one targe "index": 1, "totalErrors": 3, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -151,7 +151,7 @@ exports[`updateOne FieldMetadataService morph relation fields v2 - Add one targe "index": 1, "totalErrors": 3, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap index b2c95cb7d0..597da41c2e 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/morph-relation/__snapshots__/failing-create-one-field-metadata-morph-relation-v2.integration-spec.ts.snap @@ -84,7 +84,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "index": 2, "totalErrors": 4, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -122,7 +122,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Name "fieldNamePersonForMorphRelationSecondId" is not available as it is already used by join column name", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -195,7 +195,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "index": 1, "totalErrors": 3, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -229,7 +229,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "An error occurred.", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -292,7 +292,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -349,7 +349,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -406,7 +406,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -469,7 +469,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -511,7 +511,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid morph relation input", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -553,7 +553,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid morph relation input", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -594,7 +594,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid morph relation input", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -628,7 +628,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "At least one relation is require", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -662,7 +662,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "An error occurred.", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -696,7 +696,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "An error occurred.", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -733,7 +733,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid morph relation input", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -768,7 +768,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Relation creation payload is required", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -802,7 +802,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Relation creation payload is required", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap index 622356eb02..1d8fc45a05 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-creation.integration-spec.ts.snap @@ -31,7 +31,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Name "fieldNameBisId" is not available as it is already used by another field", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -69,7 +69,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Name "fieldName" is not available as it is already used by another field", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -113,7 +113,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Name is too short", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -151,7 +151,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Name is too long", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -195,7 +195,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Name is too short", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -235,7 +235,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -275,7 +275,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Object targeted by field to create not found", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -315,7 +315,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -354,7 +354,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -428,7 +428,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when "index": 1, "totalErrors": 3, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -468,7 +468,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -508,7 +508,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -582,7 +582,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when "index": 1, "totalErrors": 3, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -622,7 +622,7 @@ exports[`Field metadata relation creation should fail relation MANY_TO_ONE when "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -680,7 +680,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -739,7 +739,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -804,7 +804,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -863,7 +863,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -928,7 +928,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -970,7 +970,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -1012,7 +1012,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Object targeted by field to create not found", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -1054,7 +1054,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -1095,7 +1095,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY (rela "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -1171,7 +1171,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when "index": 1, "totalErrors": 3, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1213,7 +1213,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -1255,7 +1255,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -1331,7 +1331,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when "index": 1, "totalErrors": 3, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1373,7 +1373,7 @@ exports[`Field metadata relation creation should fail relation ONE_TO_MANY when "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Invalid relation creation payload", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -1412,7 +1412,7 @@ exports[`Field metadata relation creation should fail should fail when creating "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Name "manager" is not available as it is already used by another field", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1469,7 +1469,7 @@ exports[`Field metadata relation creation should fail should fail when creating "index": 1, "totalErrors": 2, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1543,7 +1543,7 @@ exports[`Field metadata relation creation should fail should fail when creating "index": 1, "totalErrors": 3, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1617,7 +1617,7 @@ exports[`Field metadata relation creation should fail should fail when creating "index": 1, "totalErrors": 3, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap index b161096be2..e95983dfac 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/relation/__snapshots__/failing-field-metadata-relation-update.integration-spec.ts.snap @@ -32,7 +32,7 @@ exports[`Field metadata relation update should fail relation when name is not in "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -71,7 +71,7 @@ exports[`Field metadata relation update should fail relation when updating ONE_T "fieldMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "On delete action is only supported for many to one relations", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-metadata/unique-field/__snapshots__/create-one-unique-field-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-metadata/unique-field/__snapshots__/create-one-unique-field-metadata.integration-spec.ts.snap index 1d7594fe03..8f9988b16f 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-metadata/unique-field/__snapshots__/create-one-unique-field-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-metadata/unique-field/__snapshots__/create-one-unique-field-metadata.integration-spec.ts.snap @@ -29,7 +29,7 @@ exports[`failing createOne unique field metadata should fail for composite type "index": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "FULL_NAME fields cannot be unique.", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -65,7 +65,7 @@ exports[`failing createOne unique field metadata should fail when field has cust "index": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "TEXT fields cannot have a default value.", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/field-permission/__snapshots__/failing-field-permission-upsert.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/field-permission/__snapshots__/failing-field-permission-upsert.integration-spec.ts.snap index 23ce97b1ed..1f32f007b1 100644 --- a/packages/twenty-server/test/integration/metadata/suites/field-permission/__snapshots__/failing-field-permission-upsert.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/field-permission/__snapshots__/failing-field-permission-upsert.integration-spec.ts.snap @@ -96,7 +96,7 @@ exports[`Field permission upsert should fail when role is not editable (system r "fieldPermission": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Cannot target a role owned by another application.", }, "message": "Validation errors occurred while upserting field permissions", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/front-component/__snapshots__/failing-front-component-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/front-component/__snapshots__/failing-front-component-creation.integration-spec.ts.snap index 12ff6cd302..4e8ac3f094 100644 --- a/packages/twenty-server/test/integration/metadata/suites/front-component/__snapshots__/failing-front-component-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/front-component/__snapshots__/failing-front-component-creation.integration-spec.ts.snap @@ -29,7 +29,7 @@ exports[`Front component creation should fail when name is empty 1`] = ` "frontComponent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Front component name is required", }, "message": "Multiple validation errors occurred while creating front component", "name": "GraphQLError", @@ -65,7 +65,7 @@ exports[`Front component creation should fail when name is whitespace-only 1`] = "frontComponent": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Front component name is required", }, "message": "Multiple validation errors occurred while creating front component", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-creation.integration-spec.ts.snap index d56e8de8d9..7cac66f006 100644 --- a/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-creation.integration-spec.ts.snap @@ -118,7 +118,7 @@ exports[`NavigationMenuItem creation should fail when creating with missing targ "navigationMenuItem": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "targetRecordId and targetObjectMetadataId are required for RECORD type", }, "message": "Multiple validation errors occurred while creating navigation menu items", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update-circular-dependency.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update-circular-dependency.integration-spec.ts.snap index becb4f1187..3c58e5d86a 100644 --- a/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update-circular-dependency.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/navigation-menu-item/__snapshots__/failing-navigation-menu-item-update-circular-dependency.integration-spec.ts.snap @@ -28,7 +28,7 @@ exports[`Navigation Menu Item update should fail with circular dependency when f "navigationMenuItem": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Navigation menu item cannot be its own parent", }, "message": "Multiple validation errors occurred while updating navigation menu items", "name": "GraphQLError", @@ -63,7 +63,7 @@ exports[`Navigation Menu Item update should fail with circular dependency when u "navigationMenuItem": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Circular dependency detected in navigation menu item hierarchy", }, "message": "Multiple validation errors occurred while updating navigation menu items", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap index d42843ebfa..9f07aef552 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-create-one-object-metadata-v2.integration-spec.ts.snap @@ -478,7 +478,7 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -963,7 +963,7 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -1459,7 +1459,7 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -1944,7 +1944,7 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -2464,7 +2464,7 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -2949,7 +2949,7 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -3434,7 +3434,7 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -3930,7 +3930,7 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -4439,7 +4439,7 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -4930,7 +4930,7 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -5439,7 +5439,7 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -5924,7 +5924,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -6444,7 +6444,7 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -6929,7 +6929,7 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -7414,7 +7414,7 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res "view": 1, "viewField": 5, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Many validation errors", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap index 4bbac4eef7..5f5c64ea96 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/__snapshots__/failing-update-one-object-metadata.integration-spec.ts.snap @@ -47,7 +47,7 @@ exports[`Object metadata update should fail when labelIdentifier is not a TEXT o "objectMetadata": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Field cannot be used as label identifier due to its type: should be of type UUID, text or full name", }, "message": "Multiple validation errors occurred while updating object", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/object-permission/__snapshots__/failing-object-permission-upsert.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/object-permission/__snapshots__/failing-object-permission-upsert.integration-spec.ts.snap index 7ddd408a4f..f922e54671 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-permission/__snapshots__/failing-object-permission-upsert.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/object-permission/__snapshots__/failing-object-permission-upsert.integration-spec.ts.snap @@ -71,7 +71,7 @@ exports[`Object permission upsert should fail when role is not editable (system "objectPermission": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Cannot target a role owned by another application.", }, "message": "Validation errors occurred while upserting object permissions", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/permission-flag/__snapshots__/failing-permission-flag-upsert.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/permission-flag/__snapshots__/failing-permission-flag-upsert.integration-spec.ts.snap index 550ea9e5c1..043f2e4015 100644 --- a/packages/twenty-server/test/integration/metadata/suites/permission-flag/__snapshots__/failing-permission-flag-upsert.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/permission-flag/__snapshots__/failing-permission-flag-upsert.integration-spec.ts.snap @@ -48,7 +48,7 @@ exports[`Permission flag upsert should fail when role is not editable (system ro "permissionFlag": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Cannot target a role owned by another application.", }, "message": "Validation errors occurred while upserting permission flags", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-creation.integration-spec.ts.snap index 9c8a0584cf..d0a37b804c 100644 --- a/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-creation.integration-spec.ts.snap @@ -29,7 +29,7 @@ exports[`Role creation should fail when canReadAllObjectRecords is false but can "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "You cannot grant edit permissions without also granting read permissions. Please enable read access first.", }, "message": "Multiple validation errors occurred while creating role", "name": "GraphQLError", @@ -65,7 +65,7 @@ exports[`Role creation should fail when canReadAllObjectRecords is false but can "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "You cannot grant edit permissions without also granting read permissions. Please enable read access first.", }, "message": "Multiple validation errors occurred while creating role", "name": "GraphQLError", @@ -101,7 +101,7 @@ exports[`Role creation should fail when canReadAllObjectRecords is false but can "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "You cannot grant edit permissions without also granting read permissions. Please enable read access first.", }, "message": "Multiple validation errors occurred while creating role", "name": "GraphQLError", @@ -137,7 +137,7 @@ exports[`Role creation should fail when canReadAllObjectRecords is false but mul "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "You cannot grant edit permissions without also granting read permissions. Please enable read access first.", }, "message": "Multiple validation errors occurred while creating role", "name": "GraphQLError", @@ -173,7 +173,7 @@ exports[`Role creation should fail when label already exists 1`] = ` "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "A role with this label already exists.", }, "message": "Multiple validation errors occurred while creating role", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-update.integration-spec.ts.snap index 1e8d90e95f..3389866ae3 100644 --- a/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/role/__snapshots__/failing-role-update.integration-spec.ts.snap @@ -40,7 +40,7 @@ exports[`Role update should fail updating role with existing write permissions s "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "You cannot grant edit permissions without also granting read permissions. Please enable read access first.", }, "message": "Multiple validation errors occurred while updating role", "name": "GraphQLError", @@ -75,7 +75,7 @@ exports[`Role update should fail when updating a non-editable system role 1`] = "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "This role cannot be modified because it is a system role. Only custom roles can be edited.", }, "message": "Multiple validation errors occurred while updating role", "name": "GraphQLError", @@ -110,7 +110,7 @@ exports[`Role update should fail when updating canReadAllObjectRecords to false "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "You cannot grant edit permissions without also granting read permissions. Please enable read access first.", }, "message": "Multiple validation errors occurred while updating role", "name": "GraphQLError", @@ -145,7 +145,7 @@ exports[`Role update should fail when updating canReadAllObjectRecords to false "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "You cannot grant edit permissions without also granting read permissions. Please enable read access first.", }, "message": "Multiple validation errors occurred while updating role", "name": "GraphQLError", @@ -180,7 +180,7 @@ exports[`Role update should fail when updating canReadAllObjectRecords to false "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "You cannot grant edit permissions without also granting read permissions. Please enable read access first.", }, "message": "Multiple validation errors occurred while updating role", "name": "GraphQLError", @@ -215,7 +215,7 @@ exports[`Role update should fail when updating label to one that already exists "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "A role with this label already exists.", }, "message": "Multiple validation errors occurred while updating role", "name": "GraphQLError", @@ -250,7 +250,7 @@ exports[`Role update should fail when updating to enable write permissions witho "role": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "You cannot grant edit permissions without also granting read permissions. Please enable read access first.", }, "message": "Multiple validation errors occurred while updating role", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-creation.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-creation.integration-spec.ts.snap index 54eb1e51f4..1615b7cc17 100644 --- a/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-creation.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-creation.integration-spec.ts.snap @@ -29,7 +29,7 @@ exports[`Skill creation should fail when content is empty string 1`] = ` "skill": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Content cannot be empty", }, "message": "Multiple validation errors occurred while creating skill", "name": "GraphQLError", @@ -79,7 +79,7 @@ exports[`Skill creation should fail when label is empty string 1`] = ` "skill": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label cannot be empty", }, "message": "Multiple validation errors occurred while creating skill", "name": "GraphQLError", @@ -129,7 +129,7 @@ exports[`Skill creation should fail when name already exists 1`] = ` "skill": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "A skill with this name already exists", }, "message": "Multiple validation errors occurred while creating skill", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-update.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-update.integration-spec.ts.snap index 80ac72f2a4..ad2add569e 100644 --- a/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-update.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/skill/__snapshots__/failing-skill-update.integration-spec.ts.snap @@ -52,7 +52,7 @@ exports[`Skill update should fail when updating with empty content 1`] = ` "skill": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Content cannot be empty", }, "message": "Multiple validation errors occurred while updating skill", "name": "GraphQLError", @@ -87,7 +87,7 @@ exports[`Skill update should fail when updating with empty label 1`] = ` "skill": 1, "totalErrors": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Label cannot be empty", }, "message": "Multiple validation errors occurred while updating skill", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-creation-circular-dependency.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-creation-circular-dependency.integration-spec.ts.snap index 543efd7271..eb121a9b39 100644 --- a/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-creation-circular-dependency.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-creation-circular-dependency.integration-spec.ts.snap @@ -40,7 +40,7 @@ exports[`View Filter Group creation should fail with circular dependency when ma "totalErrors": 1, "viewFilterGroup": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "View filter group hierarchy exceeds maximum depth of 2", }, "message": "Multiple validation errors occurred while creating view filter group", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-update-circular-dependency.integration-spec.ts.snap b/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-update-circular-dependency.integration-spec.ts.snap index 50601407c2..341a1ad027 100644 --- a/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-update-circular-dependency.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/metadata/suites/view-filter-group/__snapshots__/failing-view-filter-group-update-circular-dependency.integration-spec.ts.snap @@ -28,7 +28,7 @@ exports[`View Filter Group update should fail with circular dependency when pare "totalErrors": 1, "viewFilterGroup": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "View filter group cannot be its own parent", }, "message": "Multiple validation errors occurred while updating view filter group", "name": "GraphQLError", @@ -63,7 +63,7 @@ exports[`View Filter Group update should fail with circular dependency when upda "totalErrors": 1, "viewFilterGroup": 1, }, - "userFriendlyMessage": "Metadata validation failed", + "userFriendlyMessage": "Circular dependency detected in view filter group hierarchy", }, "message": "Multiple validation errors occurred while updating view filter group", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/rest/suites/__snapshots__/view-group.integration-spec.ts.snap b/packages/twenty-server/test/integration/rest/suites/__snapshots__/view-group.integration-spec.ts.snap index 7828ebfded..0c0ff70d0f 100644 --- a/packages/twenty-server/test/integration/rest/suites/__snapshots__/view-group.integration-spec.ts.snap +++ b/packages/twenty-server/test/integration/rest/suites/__snapshots__/view-group.integration-spec.ts.snap @@ -29,5 +29,6 @@ exports[`View Group REST API POST /metadata/viewGroups should fail to create vie "totalErrors": 1, "viewGroup": 1, }, + "userFriendlyMessage": "Field value is required", } `;