From 579f704baa5f131c63ef7e6e40766ba474447e90 Mon Sep 17 00:00:00 2001 From: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Date: Mon, 15 Sep 2025 14:32:57 +0200 Subject: [PATCH] Plugging + improving the new orchestrator (#14430) # Introduction Initially this PR was about introducing integration coverage for view field v2 tests But feature itself wasn't finished, so ended up in a TDD style devlopment ## The new orchestrator Orchestrator will organize each flat entity diffing inferring either validation errors or actions sequentially. A new builder has been introduced when extended requires to define flat entity validation utils and action generation for `delete` `update` `create` operations. It's highly typed using generics ## View field integration testing Introduce coverage on failing basic tests cases for view field operations, successfull create is also covered. We could still add more coverage, will be done later in following PRs ## Remaining tasks for upcoming PRs: - [ ] rename builder methods names to add generate action in their names - [x] refactor view validation to handle field and view uniqueness index combination - [ ] implem strict update validator on view and view field - [ ] dynamic cache invalidation post run - [ ] Add coverage to successful and failing view field operations - [ ] error formatting summary computation - [ ] extract types out of the workspace entity builder ## Some vision Currently flat field metadata maps is nested in the flat object metadata maps, making its build nested too. ( not extending the new generic builder ) We will refactor this part for both to be stored extra flat such as the other existing flat entities. It will require a small refactor to the generic builder that will not only have impact on the currently built flat entity optimistic cache but to an other one ( for example when building a create object action it will also have an impact flat field maps ) --- .../empty-all-flat-entity-maps.constant.ts | 11 + .../empty-flat-entity-maps.constant.ts | 7 + .../common/types/all-flat-entities.type.ts | 10 + .../common/types/all-flat-entity-maps.type.ts | 13 + ...by-id-in-flat-entity-maps-or-throw.util.ts | 11 +- ...t-entity-by-id-in-flat-entity-maps.util.ts | 15 + .../get-sub-flat-entity-maps-or-throw.util.ts | 25 + .../utils/get-sub-flat-entity-maps.util.ts | 31 + .../view/cache/services/view-cache.module.ts | 3 +- .../view/cache/services/view-cache.service.ts | 36 + .../flat-view-editable-properties.constant.ts | 8 + ...ew-field-properties-to-compare.constant.ts | 7 +- ...eld-validation-minimal-information.type.ts | 5 - .../failed-flat-view-field-validation.type.ts | 9 - ...iew-validation-minimal-information.type.ts | 5 - .../types/failed-flat-view-validation.type.ts | 9 - .../flat-view-field-validation-error.type.ts | 4 - .../types/flat-view-validation-error.type.ts | 8 - ...flat-view-field-to-update-or-throw.util.ts | 6 +- .../view/services/view-field-v2.service.ts | 172 +- .../view/services/view-v2.service.ts | 85 +- ...view-graphql-api-exception-handler.util.ts | 6 + .../view-graphql-api-exception.filter.ts | 5 +- .../services/field-metadata.service-v2.ts | 47 +- .../flat-field-metadata-validator.service.ts | 24 +- ...led-flat-field-metadata-validation.type.ts | 9 - ...n-field-input-transpilations-error.util.ts | 18 +- .../flat-object-metadata-validator.service.ts | 76 +- ...ed-flat-object-metadata-validation.type.ts | 11 - ...ed-flat-object-metadata-validation.type.ts | 11 - ...ed-flat-object-metadata-validation.util.ts | 11 +- .../object-metadata-v2.service.ts | 33 +- ...orkspace-migration-builder-exception-v2.ts | 4 +- ...kspace-migration-orchestrator-exception.ts | 6 - .../types/validate-error-response.type.ts | 12 +- ...to-validation-error-field-response.util.ts | 18 - ...o-validation-error-object-response.util.ts | 24 - ...ption-to-validation-response-error.util.ts | 62 +- ...igration-builder-exception-v2-formatter.ts | 4 +- ...ce-migration-build-orchestrator.service.ts | 297 ++- ...igration-validate-build-and-run-service.ts | 33 +- .../workspace-migration-orchestrator.type.ts | 49 +- ...ation-v2-object-actions-builder.service.ts | 19 +- .../failed-flat-entity-validation.type.ts | 15 + ...n-v2-view-field-actions-builder.service.ts | 282 ++- ...gration-v2-view-actions-builder.service.ts | 241 +-- ...ace-entity-migration-builder-v2.service.ts | 257 ++- .../workspace-migration-builder-v2.service.ts | 19 +- ...view-field-migration-builder-v2.service.ts | 79 - ...space-view-migration-builder-v2.service.ts | 78 - ...validate-and-build-metadata-result.type.ts | 9 +- .../validate-and-build-view-result.type.ts | 11 - .../get-workspace-migration-v2-view-action.ts | 8 +- ...orkspace-migration-v2-view-field-action.ts | 8 +- .../flat-view-field-validator.service.ts | 131 +- .../services/flat-view-validator.service.ts | 73 +- .../workspace-migration-builder-v2.module.ts | 14 +- ...pdate-view-field-action-handler.service.ts | 11 +- ...ate-view-field-v2.integration-spec.ts.snap | 81 + ...ete-view-field-v2.integration-spec.ts.snap | 12 + ...roy-view-field-v2.integration-spec.ts.snap | 12 + ...ate-view-field-v2.integration-spec.ts.snap | 12 + ...g-create-view-field-v2.integration-spec.ts | 72 + ...g-delete-view-field-v2.integration-spec.ts | 61 + ...-destroy-view-field-v2.integration-spec.ts | 61 + ...g-update-view-field-v2.integration-spec.ts | 64 + ...l-create-view-field-v2.integration-spec.ts | 146 ++ .../utils/setup-view-field-test-v2.util.ts | 95 + .../view-field-resolver.integration-spec.ts | 119 +- ...elete-view-field-operation-factory.util.ts | 21 - ...stroy-view-field-operation-factory.util.ts | 21 - ...-metadata-enum-v2.integration-spec.ts.snap | 1820 +++++++++------- ...field-metadata-v2.integration-spec.ts.snap | 1768 +++++++++------- ...morph-relation-v2.integration-spec.ts.snap | 375 ++-- ...bject-metadata-v2.integration-spec.ts.snap | 1822 +++++++++-------- ...with-morph-relation-v2.integration-spec.ts | 8 +- ...ate-core-view-field-query-factory.util.ts} | 16 +- .../utils/create-one-core-view-field.util.ts | 40 + ...lete-core-view-field-query-factory.util.ts | 21 + .../utils/delete-one-core-view-field.util.ts | 40 + ...troy-core-view-field-query-factory.util.ts | 21 + .../utils/destroy-one-core-view-field.util.ts | 40 + ...ate-core-view-field-query-factory.util.ts} | 8 +- .../utils/update-one-core-view-field.util.ts | 40 + .../create-core-view-query-factory.util.ts | 21 + .../view/utils/create-one-core-view.util.ts | 41 + 86 files changed, 5465 insertions(+), 3888 deletions(-) create mode 100644 packages/twenty-server/src/engine/core-modules/common/constant/empty-all-flat-entity-maps.constant.ts create mode 100644 packages/twenty-server/src/engine/core-modules/common/constant/empty-flat-entity-maps.constant.ts create mode 100644 packages/twenty-server/src/engine/core-modules/common/types/all-flat-entities.type.ts create mode 100644 packages/twenty-server/src/engine/core-modules/common/types/all-flat-entity-maps.type.ts create mode 100644 packages/twenty-server/src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util.ts create mode 100644 packages/twenty-server/src/engine/core-modules/common/utils/get-sub-flat-entity-maps-or-throw.util.ts create mode 100644 packages/twenty-server/src/engine/core-modules/common/utils/get-sub-flat-entity-maps.util.ts create mode 100644 packages/twenty-server/src/engine/core-modules/view/flat-view/constants/flat-view-editable-properties.constant.ts delete mode 100644 packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation-minimal-information.type.ts delete mode 100644 packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation.type.ts delete mode 100644 packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-validation-minimal-information.type.ts delete mode 100644 packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-validation.type.ts delete mode 100644 packages/twenty-server/src/engine/core-modules/view/flat-view/types/flat-view-field-validation-error.type.ts delete mode 100644 packages/twenty-server/src/engine/core-modules/view/flat-view/types/flat-view-validation-error.type.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type.ts delete mode 100644 packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-default-failed-flat-object-metadata-validation.type.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-orchestrator-exception.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-field-metadata-validation-to-validation-error-field-response.util.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-object-metadata-validation-to-validation-error-object-response.util.ts create mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-field-migration-builder-v2.service.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-migration-builder-v2.service.ts delete mode 100644 packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/validate-and-build-view-result.type.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-delete-view-field-v2.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-destroy-view-field-v2.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-update-view-field-v2.integration-spec.ts.snap create mode 100644 packages/twenty-server/test/integration/graphql/suites/view/failing-create-view-field-v2.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/view/failing-delete-view-field-v2.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/view/failing-destroy-view-field-v2.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/view/failing-update-view-field-v2.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/view/successful-create-view-field-v2.integration-spec.ts create mode 100644 packages/twenty-server/test/integration/graphql/suites/view/utils/setup-view-field-test-v2.util.ts delete mode 100644 packages/twenty-server/test/integration/graphql/utils/delete-view-field-operation-factory.util.ts delete mode 100644 packages/twenty-server/test/integration/graphql/utils/destroy-view-field-operation-factory.util.ts rename packages/twenty-server/test/integration/{graphql/utils/create-view-field-operation-factory.util.ts => metadata/suites/view-field/utils/create-core-view-field-query-factory.util.ts} (50%) create mode 100644 packages/twenty-server/test/integration/metadata/suites/view-field/utils/create-one-core-view-field.util.ts create mode 100644 packages/twenty-server/test/integration/metadata/suites/view-field/utils/delete-core-view-field-query-factory.util.ts create mode 100644 packages/twenty-server/test/integration/metadata/suites/view-field/utils/delete-one-core-view-field.util.ts create mode 100644 packages/twenty-server/test/integration/metadata/suites/view-field/utils/destroy-core-view-field-query-factory.util.ts create mode 100644 packages/twenty-server/test/integration/metadata/suites/view-field/utils/destroy-one-core-view-field.util.ts rename packages/twenty-server/test/integration/{graphql/utils/update-view-field-operation-factory.util.ts => metadata/suites/view-field/utils/update-core-view-field-query-factory.util.ts} (68%) create mode 100644 packages/twenty-server/test/integration/metadata/suites/view-field/utils/update-one-core-view-field.util.ts create mode 100644 packages/twenty-server/test/integration/metadata/suites/view/utils/create-core-view-query-factory.util.ts create mode 100644 packages/twenty-server/test/integration/metadata/suites/view/utils/create-one-core-view.util.ts diff --git a/packages/twenty-server/src/engine/core-modules/common/constant/empty-all-flat-entity-maps.constant.ts b/packages/twenty-server/src/engine/core-modules/common/constant/empty-all-flat-entity-maps.constant.ts new file mode 100644 index 0000000000..21d599faa8 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/common/constant/empty-all-flat-entity-maps.constant.ts @@ -0,0 +1,11 @@ +import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/core-modules/common/constant/empty-flat-entity-maps.constant'; +import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type'; + +export const EMPTY_ALL_FLAT_ENTITY_MAPS = { + flatObjectMetadataMaps: { + byId: {}, + idByNameSingular: {}, + }, + flatViewFieldMaps: EMPTY_FLAT_ENTITY_MAPS, + flatViewMaps: EMPTY_FLAT_ENTITY_MAPS, +} as const satisfies AllFlatEntityMaps; diff --git a/packages/twenty-server/src/engine/core-modules/common/constant/empty-flat-entity-maps.constant.ts b/packages/twenty-server/src/engine/core-modules/common/constant/empty-flat-entity-maps.constant.ts new file mode 100644 index 0000000000..2dd214bcc4 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/common/constant/empty-flat-entity-maps.constant.ts @@ -0,0 +1,7 @@ +import { type FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type'; +import { type FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type'; + +export const EMPTY_FLAT_ENTITY_MAPS = { + byId: {}, + idByUniversalIdentifier: {}, +} as const satisfies FlatEntityMaps; diff --git a/packages/twenty-server/src/engine/core-modules/common/types/all-flat-entities.type.ts b/packages/twenty-server/src/engine/core-modules/common/types/all-flat-entities.type.ts new file mode 100644 index 0000000000..9b6d252d72 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/common/types/all-flat-entities.type.ts @@ -0,0 +1,10 @@ +import { type FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type'; +import { type FlatView } from 'src/engine/core-modules/view/flat-view/types/flat-view.type'; +import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; + +export type AllFlatEntitiesByMetadataEngineName = { + // flatFieldMetadata: FlatFieldMetadata; + objectMetadata: FlatObjectMetadata; + view: FlatView; + viewField: FlatViewField; +}; diff --git a/packages/twenty-server/src/engine/core-modules/common/types/all-flat-entity-maps.type.ts b/packages/twenty-server/src/engine/core-modules/common/types/all-flat-entity-maps.type.ts new file mode 100644 index 0000000000..b386b44690 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/common/types/all-flat-entity-maps.type.ts @@ -0,0 +1,13 @@ +import { type FlatViewFieldMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-field-maps.type'; +import { type FlatViewMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-maps.type'; +import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; + +export type AllFlatEntityMaps = { + flatObjectMetadataMaps: FlatObjectMetadataMaps; + flatViewMaps: FlatViewMaps; + flatViewFieldMaps: FlatViewFieldMaps; +}; + +// export type AllFlatEntityMaps = { +// [P in keyof AllFlatEntities as `${P}Maps`]: FlatEntityMaps; +// }; diff --git a/packages/twenty-server/src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts b/packages/twenty-server/src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts index 5c86ebafb6..c3d5a8b843 100644 --- a/packages/twenty-server/src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util.ts @@ -8,15 +8,18 @@ import { import { type FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type'; import { type FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type'; +export type FindFlatEntityByIdInFlatEntityMapsOrThrowArgs< + T extends FlatEntity, +> = { + flatEntityMaps: FlatEntityMaps; + flatEntityId: string; +}; export const findFlatEntityByIdInFlatEntityMapsOrThrow = < T extends FlatEntity, >({ flatEntityMaps, flatEntityId, -}: { - flatEntityMaps: FlatEntityMaps; - flatEntityId: string; -}): T => { +}: FindFlatEntityByIdInFlatEntityMapsOrThrowArgs): T => { const flatEntity = flatEntityMaps.byId[flatEntityId]; if (!isDefined(flatEntity)) { diff --git a/packages/twenty-server/src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util.ts b/packages/twenty-server/src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util.ts new file mode 100644 index 0000000000..f82482f43f --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util.ts @@ -0,0 +1,15 @@ +import { type FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type'; +import { + findFlatEntityByIdInFlatEntityMapsOrThrow, + type FindFlatEntityByIdInFlatEntityMapsOrThrowArgs, +} from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; + +export const findFlatEntityByIdInFlatEntityMaps = ( + args: FindFlatEntityByIdInFlatEntityMapsOrThrowArgs, +): T | undefined => { + try { + return findFlatEntityByIdInFlatEntityMapsOrThrow(args); + } catch { + return undefined; + } +}; diff --git a/packages/twenty-server/src/engine/core-modules/common/utils/get-sub-flat-entity-maps-or-throw.util.ts b/packages/twenty-server/src/engine/core-modules/common/utils/get-sub-flat-entity-maps-or-throw.util.ts new file mode 100644 index 0000000000..00d6a32aca --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/common/utils/get-sub-flat-entity-maps-or-throw.util.ts @@ -0,0 +1,25 @@ +import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/core-modules/common/constant/empty-flat-entity-maps.constant'; +import { type FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type'; +import { type FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type'; +import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; +import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; + +export const getSubFlatEntityMapsOrThrow = ({ + flatEntityIds, + flatEntityMaps, +}: { + flatEntityMaps: FlatEntityMaps; + flatEntityIds: string[]; +}): FlatEntityMaps => { + return flatEntityIds.reduce>((acc, flatEntityId) => { + const flatEntity = findFlatEntityByIdInFlatEntityMapsOrThrow({ + flatEntityId, + flatEntityMaps, + }); + + return addFlatEntityToFlatEntityMapsOrThrow({ + flatEntity, + flatEntityMaps: acc, + }); + }, EMPTY_FLAT_ENTITY_MAPS); +}; diff --git a/packages/twenty-server/src/engine/core-modules/common/utils/get-sub-flat-entity-maps.util.ts b/packages/twenty-server/src/engine/core-modules/common/utils/get-sub-flat-entity-maps.util.ts new file mode 100644 index 0000000000..fd348a6ee9 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/common/utils/get-sub-flat-entity-maps.util.ts @@ -0,0 +1,31 @@ +import { isDefined } from 'twenty-shared/utils'; + +import { EMPTY_FLAT_ENTITY_MAPS } from 'src/engine/core-modules/common/constant/empty-flat-entity-maps.constant'; +import { type FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type'; +import { type FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type'; +import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; +import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; + +export const getSubFlatEntityMaps = ({ + flatEntityIds, + flatEntityMaps, +}: { + flatEntityMaps: FlatEntityMaps; + flatEntityIds: string[]; +}): FlatEntityMaps => { + return flatEntityIds.reduce>((acc, flatEntityId) => { + const flatEntity = findFlatEntityByIdInFlatEntityMaps({ + flatEntityId, + flatEntityMaps, + }); + + if (!isDefined(flatEntity)) { + return acc; + } + + return addFlatEntityToFlatEntityMapsOrThrow({ + flatEntity, + flatEntityMaps: acc, + }); + }, EMPTY_FLAT_ENTITY_MAPS); +}; diff --git a/packages/twenty-server/src/engine/core-modules/view/cache/services/view-cache.module.ts b/packages/twenty-server/src/engine/core-modules/view/cache/services/view-cache.module.ts index 0947e3556d..c780af445a 100644 --- a/packages/twenty-server/src/engine/core-modules/view/cache/services/view-cache.module.ts +++ b/packages/twenty-server/src/engine/core-modules/view/cache/services/view-cache.module.ts @@ -2,10 +2,11 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ViewCacheService } from 'src/engine/core-modules/view/cache/services/view-cache.service'; +import { ViewFieldEntity } from 'src/engine/core-modules/view/entities/view-field.entity'; import { ViewEntity } from 'src/engine/core-modules/view/entities/view.entity'; @Module({ - imports: [TypeOrmModule.forFeature([ViewEntity])], + imports: [TypeOrmModule.forFeature([ViewEntity, ViewFieldEntity])], providers: [ViewCacheService], exports: [ViewCacheService], }) diff --git a/packages/twenty-server/src/engine/core-modules/view/cache/services/view-cache.service.ts b/packages/twenty-server/src/engine/core-modules/view/cache/services/view-cache.service.ts index 1e6467dca9..450e37907e 100644 --- a/packages/twenty-server/src/engine/core-modules/view/cache/services/view-cache.service.ts +++ b/packages/twenty-server/src/engine/core-modules/view/cache/services/view-cache.service.ts @@ -3,8 +3,11 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import { ViewFieldEntity } from 'src/engine/core-modules/view/entities/view-field.entity'; import { ViewEntity } from 'src/engine/core-modules/view/entities/view.entity'; +import { FlatViewFieldMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-field-maps.type'; import { FlatViewMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-maps.type'; +import { fromViewFieldEntityToFlatViewField } from 'src/engine/core-modules/view/flat-view/utils/from-view-field-entity-to-flat-view-field.util'; import { generateFlatViewMaps } from 'src/engine/core-modules/view/flat-view/utils/generate-flat-view-maps.util'; type GetExistingOrRecomputeFlatViewMapsResult = { @@ -18,6 +21,8 @@ export class ViewCacheService { constructor( @InjectRepository(ViewEntity) private readonly viewRepository: Repository, + @InjectRepository(ViewFieldEntity) + private readonly viewFieldRepository: Repository, ) {} async getExistingOrRecomputeFlatViewMaps({ @@ -30,6 +35,7 @@ export class ViewCacheService { where: { workspaceId, }, + withDeleted: true, relations: ['viewFields'], select: { viewFields: { @@ -44,4 +50,34 @@ export class ViewCacheService { flatViewMaps: existingFlatViewMaps, }; } + + public async getExistingFlatViewFieldMapsFromCache({ + workspaceId, + }: { + workspaceId: string; + }): Promise<{ flatViewFieldMaps: FlatViewFieldMaps }> { + // TODO: get from cache later + const existingViewFields = await this.viewFieldRepository.find({ + where: { + workspaceId, + }, + withDeleted: true, + }); + + const flatViewFieldMaps: FlatViewFieldMaps = { + byId: {}, + idByUniversalIdentifier: {}, + }; + + for (const viewFieldEntity of existingViewFields) { + const flatViewField = fromViewFieldEntityToFlatViewField(viewFieldEntity); + + flatViewFieldMaps.byId[flatViewField.id] = flatViewField; + flatViewFieldMaps.idByUniversalIdentifier[ + flatViewField.universalIdentifier + ] = flatViewField.id; + } + + return { flatViewFieldMaps }; + } } diff --git a/packages/twenty-server/src/engine/core-modules/view/flat-view/constants/flat-view-editable-properties.constant.ts b/packages/twenty-server/src/engine/core-modules/view/flat-view/constants/flat-view-editable-properties.constant.ts new file mode 100644 index 0000000000..2bf162c04a --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/view/flat-view/constants/flat-view-editable-properties.constant.ts @@ -0,0 +1,8 @@ +import { type FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type'; + +export const FLAT_VIEW_EDITABLE_PROPERTIES = [ + 'isVisible', + 'size', + 'position', + 'aggregateOperation', +] as const satisfies (keyof FlatViewField)[]; diff --git a/packages/twenty-server/src/engine/core-modules/view/flat-view/constants/flat-view-field-properties-to-compare.constant.ts b/packages/twenty-server/src/engine/core-modules/view/flat-view/constants/flat-view-field-properties-to-compare.constant.ts index 69f34bdb3d..3d27a7ef00 100644 --- a/packages/twenty-server/src/engine/core-modules/view/flat-view/constants/flat-view-field-properties-to-compare.constant.ts +++ b/packages/twenty-server/src/engine/core-modules/view/flat-view/constants/flat-view-field-properties-to-compare.constant.ts @@ -1,8 +1,7 @@ +import { FLAT_VIEW_EDITABLE_PROPERTIES } from 'src/engine/core-modules/view/flat-view/constants/flat-view-editable-properties.constant'; import { type FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type'; export const FLAT_VIEW_FIELD_PROPERTIES_TO_COMPARE = [ - 'isVisible', - 'size', - 'position', - 'aggregateOperation', + ...FLAT_VIEW_EDITABLE_PROPERTIES, + 'deletedAt', ] as const satisfies (keyof FlatViewField)[]; diff --git a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation-minimal-information.type.ts b/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation-minimal-information.type.ts deleted file mode 100644 index 5f0e4f5c3e..0000000000 --- a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation-minimal-information.type.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { type FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type'; - -export type FailedFlatViewFieldValidationMinimalInformation = Partial< - Pick ->; diff --git a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation.type.ts b/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation.type.ts deleted file mode 100644 index 6be44ee8d8..0000000000 --- a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation.type.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { type FailedFlatViewFieldValidationMinimalInformation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation-minimal-information.type'; -import { type FlatViewFieldValidationError } from 'src/engine/core-modules/view/flat-view/types/flat-view-field-validation-error.type'; -import { type WorkspaceMigrationViewFieldActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type'; - -export type FailedFlatViewFieldValidation = { - type: WorkspaceMigrationViewFieldActionTypeV2; - viewFieldLevelErrors: FlatViewFieldValidationError[]; - failedViewFieldValidationMinimalInformation: Partial; -}; diff --git a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-validation-minimal-information.type.ts b/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-validation-minimal-information.type.ts deleted file mode 100644 index 6908af78ad..0000000000 --- a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-validation-minimal-information.type.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { type FlatView } from 'src/engine/core-modules/view/flat-view/types/flat-view.type'; - -export type FailedFlatViewValidationMinimalInformation = Partial< - Pick ->; diff --git a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-validation.type.ts b/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-validation.type.ts deleted file mode 100644 index 35d8971297..0000000000 --- a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/failed-flat-view-validation.type.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { type FailedFlatViewValidationMinimalInformation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-validation-minimal-information.type'; -import { type FlatViewValidationError } from 'src/engine/core-modules/view/flat-view/types/flat-view-validation-error.type'; -import { type WorkspaceMigrationViewActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type'; - -export type FailedFlatViewValidation = { - type: WorkspaceMigrationViewActionTypeV2; - viewLevelErrors: FlatViewValidationError[]; - failedViewValidationMinimalInformation: Partial; -}; diff --git a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/flat-view-field-validation-error.type.ts b/packages/twenty-server/src/engine/core-modules/view/flat-view/types/flat-view-field-validation-error.type.ts deleted file mode 100644 index 18b3311188..0000000000 --- a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/flat-view-field-validation-error.type.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type FlatViewFieldValidationError = { - message: string; - code: string; -}; diff --git a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/flat-view-validation-error.type.ts b/packages/twenty-server/src/engine/core-modules/view/flat-view/types/flat-view-validation-error.type.ts deleted file mode 100644 index aa0869d643..0000000000 --- a/packages/twenty-server/src/engine/core-modules/view/flat-view/types/flat-view-validation-error.type.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { type ViewExceptionCode } from 'src/engine/core-modules/view/exceptions/view.exception'; - -export type FlatViewValidationError = { - code: ViewExceptionCode; - message: string; - userFriendlyMessage?: string; - value?: unknown; -}; diff --git a/packages/twenty-server/src/engine/core-modules/view/flat-view/utils/from-update-view-field-input-to-flat-view-field-to-update-or-throw.util.ts b/packages/twenty-server/src/engine/core-modules/view/flat-view/utils/from-update-view-field-input-to-flat-view-field-to-update-or-throw.util.ts index 77292f810f..d5612006e6 100644 --- a/packages/twenty-server/src/engine/core-modules/view/flat-view/utils/from-update-view-field-input-to-flat-view-field-to-update-or-throw.util.ts +++ b/packages/twenty-server/src/engine/core-modules/view/flat-view/utils/from-update-view-field-input-to-flat-view-field-to-update-or-throw.util.ts @@ -10,7 +10,7 @@ import { ViewFieldException, ViewFieldExceptionCode, } from 'src/engine/core-modules/view/exceptions/view-field.exception'; -import { FLAT_VIEW_FIELD_PROPERTIES_TO_COMPARE } from 'src/engine/core-modules/view/flat-view/constants/flat-view-field-properties-to-compare.constant'; +import { FLAT_VIEW_EDITABLE_PROPERTIES } from 'src/engine/core-modules/view/flat-view/constants/flat-view-editable-properties.constant'; import { type FlatViewFieldMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-field-maps.type'; import { type FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type'; import { mergeUpdateInExistingRecord } from 'src/utils/merge-update-in-existing-record.util'; @@ -39,12 +39,12 @@ export const fromUpdateViewFieldInputToFlatViewFieldToUpdateOrThrow = ({ } const updatedEditableFieldProperties = extractAndSanitizeObjectStringFields( rawUpdateViewFieldInput.update, - FLAT_VIEW_FIELD_PROPERTIES_TO_COMPARE, + FLAT_VIEW_EDITABLE_PROPERTIES, ); return mergeUpdateInExistingRecord({ existing: existingFlatViewFieldToUpdate, - properties: FLAT_VIEW_FIELD_PROPERTIES_TO_COMPARE, + properties: FLAT_VIEW_EDITABLE_PROPERTIES, update: updatedEditableFieldProperties, }); }; diff --git a/packages/twenty-server/src/engine/core-modules/view/services/view-field-v2.service.ts b/packages/twenty-server/src/engine/core-modules/view/services/view-field-v2.service.ts index 1bfdcb8ab2..e47d5d8613 100644 --- a/packages/twenty-server/src/engine/core-modules/view/services/view-field-v2.service.ts +++ b/packages/twenty-server/src/engine/core-modules/view/services/view-field-v2.service.ts @@ -1,61 +1,34 @@ import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; import { isDefined } from 'twenty-shared/utils'; -import { Repository } from 'typeorm'; import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; +import { getSubFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/get-sub-flat-entity-maps-or-throw.util'; import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util'; +import { ViewCacheService } from 'src/engine/core-modules/view/cache/services/view-cache.service'; import { CreateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/create-view-field.input'; import { DeleteViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/delete-view-field.input'; import { DestroyViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/destroy-view-field.input'; import { UpdateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/update-view-field.input'; import { ViewFieldDTO } from 'src/engine/core-modules/view/dtos/view-field.dto'; -import { ViewFieldEntity } from 'src/engine/core-modules/view/entities/view-field.entity'; -import { FlatViewFieldMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-field-maps.type'; import { fromCreateViewFieldInputToFlatViewFieldToCreate } from 'src/engine/core-modules/view/flat-view/utils/from-create-view-field-input-to-flat-view-field-to-create.util'; import { fromDeleteViewFieldInputToFlatViewFieldOrThrow } from 'src/engine/core-modules/view/flat-view/utils/from-delete-view-field-input-to-flat-view-field-or-throw.util'; import { fromDestroyViewFieldInputToFlatViewFieldOrThrow } from 'src/engine/core-modules/view/flat-view/utils/from-destroy-view-field-input-to-flat-view-field-or-throw.util'; import { fromUpdateViewFieldInputToFlatViewFieldToUpdateOrThrow } from 'src/engine/core-modules/view/flat-view/utils/from-update-view-field-input-to-flat-view-field-to-update-or-throw.util'; -import { fromViewFieldEntityToFlatViewField } from 'src/engine/core-modules/view/flat-view/utils/from-view-field-entity-to-flat-view-field.util'; -import { WorkspaceMigrationOrchestratorException } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-orchestrator-exception'; -import { WorkspaceMigrationBuildOrchestratorService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service'; +import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service'; +import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; +import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service'; @Injectable() export class ViewFieldV2Service { constructor( - @InjectRepository(ViewFieldEntity) - private readonly viewFieldRepository: Repository, - private readonly workspaceMigrationOrchestratorService: WorkspaceMigrationBuildOrchestratorService, + private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService, + private readonly viewCacheService: ViewCacheService, + private readonly workspaceMetadataCacheService: WorkspaceMetadataCacheService, ) {} - // TODO: move to cache service - private async getExistingFlatViewFieldMapsFromCache( - workspaceId: string, - ): Promise { - const existingViewFields = await this.viewFieldRepository.find({ - where: { workspaceId }, - }); - - const flatViewFieldMaps: FlatViewFieldMaps = { - byId: {}, - idByUniversalIdentifier: {}, - }; - - for (const viewFieldEntity of existingViewFields) { - const flatViewField = fromViewFieldEntityToFlatViewField(viewFieldEntity); - - flatViewFieldMaps.byId[flatViewField.id] = flatViewField; - flatViewFieldMaps.idByUniversalIdentifier[ - flatViewField.universalIdentifier - ] = flatViewField.id; - } - - return flatViewFieldMaps; - } - async createOne({ createViewFieldInput, workspaceId, @@ -63,8 +36,20 @@ export class ViewFieldV2Service { createViewFieldInput: CreateViewFieldInput; workspaceId: string; }): Promise { - const existingFlatViewFieldMaps = - await this.getExistingFlatViewFieldMapsFromCache(workspaceId); + const { flatObjectMetadataMaps: existingFlatObjectMetadataMaps } = + await this.workspaceMetadataCacheService.getExistingOrRecomputeFlatObjectMetadataMaps( + { + workspaceId, + }, + ); + const { flatViewFieldMaps: existingFlatViewFieldMaps } = + await this.viewCacheService.getExistingFlatViewFieldMapsFromCache({ + workspaceId, + }); + const { flatViewMaps: existingFlatViewMaps } = + await this.viewCacheService.getExistingOrRecomputeFlatViewMaps({ + workspaceId, + }); const flatViewFieldToCreate = fromCreateViewFieldInputToFlatViewFieldToCreate({ @@ -78,14 +63,18 @@ export class ViewFieldV2Service { }); const validateAndBuildResult = - await this.workspaceMigrationOrchestratorService.buildWorkspaceMigrations( + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - entityMaps: { - viewField: { - fromFlatViewFieldMaps: existingFlatViewFieldMaps, - toFlatViewFieldMaps, + fromToAllFlatEntityMaps: { + flatViewFieldMaps: { + from: existingFlatViewFieldMaps, + to: toFlatViewFieldMaps, }, }, + dependencyAllFlatEntityMaps: { + flatObjectMetadataMaps: existingFlatObjectMetadataMaps, + flatViewMaps: existingFlatViewMaps, + }, buildOptions: { isSystemBuild: false, inferDeletionFromMissingEntities: false, @@ -95,13 +84,16 @@ export class ViewFieldV2Service { ); if (isDefined(validateAndBuildResult)) { - throw new WorkspaceMigrationOrchestratorException( + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, 'Multiple validation errors occurred while creating view field', ); } - const recomputedExistingFlatViewFieldMaps = - await this.getExistingFlatViewFieldMapsFromCache(workspaceId); + const { flatViewFieldMaps: recomputedExistingFlatViewFieldMaps } = + await this.viewCacheService.getExistingFlatViewFieldMapsFromCache({ + workspaceId, + }); return findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityId: flatViewFieldToCreate.id, @@ -116,8 +108,10 @@ export class ViewFieldV2Service { workspaceId: string; updateViewFieldInput: UpdateViewFieldInput; }): Promise { - const existingFlatViewFieldMaps = - await this.getExistingFlatViewFieldMapsFromCache(workspaceId); + const { flatViewFieldMaps: existingFlatViewFieldMaps } = + await this.viewCacheService.getExistingFlatViewFieldMapsFromCache({ + workspaceId, + }); const optimisticallyUpdatedFlatView = fromUpdateViewFieldInputToFlatViewFieldToUpdateOrThrow({ @@ -125,18 +119,22 @@ export class ViewFieldV2Service { updateViewFieldInput, }); + const fromFlatViewFieldMaps = getSubFlatEntityMapsOrThrow({ + flatEntityIds: [optimisticallyUpdatedFlatView.id], + flatEntityMaps: existingFlatViewFieldMaps, + }); const toFlatViewFieldMaps = replaceFlatEntityInFlatEntityMapsOrThrow({ flatEntity: optimisticallyUpdatedFlatView, - flatEntityMaps: existingFlatViewFieldMaps, + flatEntityMaps: fromFlatViewFieldMaps, }); const validateAndBuildResult = - await this.workspaceMigrationOrchestratorService.buildWorkspaceMigrations( + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - entityMaps: { - viewField: { - fromFlatViewFieldMaps: existingFlatViewFieldMaps, - toFlatViewFieldMaps, + fromToAllFlatEntityMaps: { + flatViewFieldMaps: { + from: fromFlatViewFieldMaps, + to: toFlatViewFieldMaps, }, }, buildOptions: { @@ -148,13 +146,16 @@ export class ViewFieldV2Service { ); if (isDefined(validateAndBuildResult)) { - throw new WorkspaceMigrationOrchestratorException( + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, 'Multiple validation errors occurred while updating view field', ); } - const recomputedExistingFlatViewFieldMaps = - await this.getExistingFlatViewFieldMapsFromCache(workspaceId); + const { flatViewFieldMaps: recomputedExistingFlatViewFieldMaps } = + await this.viewCacheService.getExistingFlatViewFieldMapsFromCache({ + workspaceId, + }); return findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityId: optimisticallyUpdatedFlatView.id, @@ -169,8 +170,10 @@ export class ViewFieldV2Service { deleteViewFieldInput: DeleteViewFieldInput; workspaceId: string; }): Promise { - const existingFlatViewFieldMaps = - await this.getExistingFlatViewFieldMapsFromCache(workspaceId); + const { flatViewFieldMaps: existingFlatViewFieldMaps } = + await this.viewCacheService.getExistingFlatViewFieldMapsFromCache({ + workspaceId, + }); const optimisticallyUpdatedFlatViewWithDeletedAt = fromDeleteViewFieldInputToFlatViewFieldOrThrow({ @@ -184,12 +187,12 @@ export class ViewFieldV2Service { }); const validateAndBuildResult = - await this.workspaceMigrationOrchestratorService.buildWorkspaceMigrations( + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - entityMaps: { - viewField: { - fromFlatViewFieldMaps: existingFlatViewFieldMaps, - toFlatViewFieldMaps, + fromToAllFlatEntityMaps: { + flatViewFieldMaps: { + from: existingFlatViewFieldMaps, + to: toFlatViewFieldMaps, }, }, buildOptions: { @@ -201,13 +204,16 @@ export class ViewFieldV2Service { ); if (isDefined(validateAndBuildResult)) { - throw new WorkspaceMigrationOrchestratorException( - 'Multiple validation errors occurred while updating view field', + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, + 'Multiple validation errors occurred while deleting view field', ); } - const recomputedExistingFlatViewFieldMaps = - await this.getExistingFlatViewFieldMapsFromCache(workspaceId); + const { flatViewFieldMaps: recomputedExistingFlatViewFieldMaps } = + await this.viewCacheService.getExistingFlatViewFieldMapsFromCache({ + workspaceId, + }); return findFlatEntityByIdInFlatEntityMapsOrThrow({ flatEntityId: optimisticallyUpdatedFlatViewWithDeletedAt.id, @@ -222,8 +228,14 @@ export class ViewFieldV2Service { destroyViewFieldInput: DestroyViewFieldInput; workspaceId: string; }): Promise { - const existingFlatViewFieldMaps = - await this.getExistingFlatViewFieldMapsFromCache(workspaceId); + const { flatViewFieldMaps: existingFlatViewFieldMaps } = + await this.viewCacheService.getExistingFlatViewFieldMapsFromCache({ + workspaceId, + }); + const { flatViewMaps: existingFlatViewMaps } = + await this.viewCacheService.getExistingOrRecomputeFlatViewMaps({ + workspaceId, + }); const existingViewFieldToDelete = fromDestroyViewFieldInputToFlatViewFieldOrThrow({ @@ -231,20 +243,27 @@ export class ViewFieldV2Service { flatViewFieldMaps: existingFlatViewFieldMaps, }); - const toFlatViewFieldMaps = deleteFlatEntityFromFlatEntityMapsOrThrow({ + const fromFlatViewFieldMaps = getSubFlatEntityMapsOrThrow({ + flatEntityIds: [existingViewFieldToDelete.id], flatEntityMaps: existingFlatViewFieldMaps, + }); + const toFlatViewFieldMaps = deleteFlatEntityFromFlatEntityMapsOrThrow({ + flatEntityMaps: fromFlatViewFieldMaps, entityToDeleteId: existingViewFieldToDelete.id, }); const validateAndBuildResult = - await this.workspaceMigrationOrchestratorService.buildWorkspaceMigrations( + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - entityMaps: { - viewField: { - fromFlatViewFieldMaps: existingFlatViewFieldMaps, - toFlatViewFieldMaps, + fromToAllFlatEntityMaps: { + flatViewFieldMaps: { + from: fromFlatViewFieldMaps, + to: toFlatViewFieldMaps, }, }, + dependencyAllFlatEntityMaps: { + flatViewMaps: existingFlatViewMaps, + }, buildOptions: { isSystemBuild: false, inferDeletionFromMissingEntities: true, @@ -254,7 +273,8 @@ export class ViewFieldV2Service { ); if (isDefined(validateAndBuildResult)) { - throw new WorkspaceMigrationOrchestratorException( + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, 'Multiple validation errors occurred while deleting view field', ); } diff --git a/packages/twenty-server/src/engine/core-modules/view/services/view-v2.service.ts b/packages/twenty-server/src/engine/core-modules/view/services/view-v2.service.ts index e2d97f630d..cd7d95a100 100644 --- a/packages/twenty-server/src/engine/core-modules/view/services/view-v2.service.ts +++ b/packages/twenty-server/src/engine/core-modules/view/services/view-v2.service.ts @@ -7,6 +7,7 @@ import { v4 } from 'uuid'; import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util'; +import { getSubFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/get-sub-flat-entity-maps-or-throw.util'; import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util'; import { ViewCacheService } from 'src/engine/core-modules/view/cache/services/view-cache.service'; import { ViewEntity } from 'src/engine/core-modules/view/entities/view.entity'; @@ -20,20 +21,24 @@ import { import { VIEW_ENTITY_RELATION_PROPERTIES } from 'src/engine/core-modules/view/flat-view/constants/view-entity-relation-properties.constant'; import { FlatViewMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-maps.type'; import { fromPartialFlatViewToFlatViewWithDefault } from 'src/engine/core-modules/view/flat-view/utils/from-partial-flat-view-to-flat-view-to-with-default.util'; -import { WorkspaceMigrationOrchestratorException } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-orchestrator-exception'; -import { WorkspaceMigrationBuildOrchestratorService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service'; +import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service'; +import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; +import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service'; @Injectable() export class ViewV2Service { constructor( @InjectRepository(ViewEntity) private readonly viewRepository: Repository, - private readonly workspaceMigrationOrchestratorService: WorkspaceMigrationBuildOrchestratorService, + private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService, private readonly viewCacheService: ViewCacheService, + private readonly workspaceMetadataCacheService: WorkspaceMetadataCacheService, ) {} async createOne(viewData: Partial): Promise { - if (!isDefined(viewData.workspaceId)) { + const { workspaceId } = viewData; + + if (!isDefined(workspaceId)) { throw new ViewException( generateViewExceptionMessage( ViewExceptionMessageKey.WORKSPACE_ID_REQUIRED, @@ -47,9 +52,16 @@ export class ViewV2Service { ); } + const { flatObjectMetadataMaps: existingFlatObjectMetadataMaps } = + await this.workspaceMetadataCacheService.getExistingOrRecomputeFlatObjectMetadataMaps( + { + workspaceId, + }, + ); + const { flatViewMaps: existingFlatViewMaps } = await this.viewCacheService.getExistingOrRecomputeFlatViewMaps({ - workspaceId: viewData.workspaceId, + workspaceId, }); const flatViewFromCreateInput = fromPartialFlatViewToFlatViewWithDefault({ @@ -63,24 +75,28 @@ export class ViewV2Service { }); const validateAndBuildResult = - await this.workspaceMigrationOrchestratorService.buildWorkspaceMigrations( + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - entityMaps: { - view: { - fromFlatViewMaps: existingFlatViewMaps, - toFlatViewMaps, + fromToAllFlatEntityMaps: { + flatViewMaps: { + from: existingFlatViewMaps, + to: toFlatViewMaps, }, }, + dependencyAllFlatEntityMaps: { + flatObjectMetadataMaps: existingFlatObjectMetadataMaps, + }, buildOptions: { isSystemBuild: false, inferDeletionFromMissingEntities: false, }, - workspaceId: viewData.workspaceId, + workspaceId, }, ); if (isDefined(validateAndBuildResult)) { - throw new WorkspaceMigrationOrchestratorException( + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, 'Multiple validation errors occurred while creating view', ); } @@ -129,19 +145,22 @@ export class ViewV2Service { universalIdentifier: existingViewToUpdate.universalIdentifier ?? '', }); - const toFlatViewMaps: FlatViewMaps = - replaceFlatEntityInFlatEntityMapsOrThrow({ - flatEntity: flatViewFromUpdateInput, - flatEntityMaps: existingFlatViewMaps, - }); + const fromFlatViewMaps = getSubFlatEntityMapsOrThrow({ + flatEntityIds: [flatViewFromUpdateInput.id], + flatEntityMaps: existingFlatViewMaps, + }); + const toFlatViewMaps = replaceFlatEntityInFlatEntityMapsOrThrow({ + flatEntity: flatViewFromUpdateInput, + flatEntityMaps: fromFlatViewMaps, + }); const validateAndBuildResult = - await this.workspaceMigrationOrchestratorService.buildWorkspaceMigrations( + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - entityMaps: { - view: { - fromFlatViewMaps: existingFlatViewMaps, - toFlatViewMaps, + fromToAllFlatEntityMaps: { + flatViewMaps: { + from: fromFlatViewMaps, + to: toFlatViewMaps, }, }, buildOptions: { @@ -153,7 +172,8 @@ export class ViewV2Service { ); if (isDefined(validateAndBuildResult)) { - throw new WorkspaceMigrationOrchestratorException( + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, 'Multiple validation errors occurred while updating view', ); } @@ -185,19 +205,23 @@ export class ViewV2Service { ); } + const fromFlatViewMaps = getSubFlatEntityMapsOrThrow({ + flatEntityIds: [existingViewToDelete.id], + flatEntityMaps: existingFlatViewMaps, + }); const toFlatViewMaps: FlatViewMaps = deleteFlatEntityFromFlatEntityMapsOrThrow({ - flatEntityMaps: existingFlatViewMaps, + flatEntityMaps: fromFlatViewMaps, entityToDeleteId: existingViewToDelete.id, }); const validateAndBuildResult = - await this.workspaceMigrationOrchestratorService.buildWorkspaceMigrations( + await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - entityMaps: { - view: { - fromFlatViewMaps: existingFlatViewMaps, - toFlatViewMaps, + fromToAllFlatEntityMaps: { + flatViewMaps: { + from: fromFlatViewMaps, + to: toFlatViewMaps, }, }, buildOptions: { @@ -209,7 +233,8 @@ export class ViewV2Service { ); if (isDefined(validateAndBuildResult)) { - throw new WorkspaceMigrationOrchestratorException( + throw new WorkspaceMigrationBuilderExceptionV2( + validateAndBuildResult, 'Multiple validation errors occurred while deleting view', ); } diff --git a/packages/twenty-server/src/engine/core-modules/view/utils/view-graphql-api-exception-handler.util.ts b/packages/twenty-server/src/engine/core-modules/view/utils/view-graphql-api-exception-handler.util.ts index 16849a4f0b..86b99f6985 100644 --- a/packages/twenty-server/src/engine/core-modules/view/utils/view-graphql-api-exception-handler.util.ts +++ b/packages/twenty-server/src/engine/core-modules/view/utils/view-graphql-api-exception-handler.util.ts @@ -28,8 +28,14 @@ import { ViewException, ViewExceptionCode, } from 'src/engine/core-modules/view/exceptions/view.exception'; +import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; +import { workspaceMigrationBuilderExceptionV2Formatter } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/workspace-migration-builder-exception-v2-formatter'; export const viewGraphqlApiExceptionHandler = (error: Error) => { + if (error instanceof WorkspaceMigrationBuilderExceptionV2) { + return workspaceMigrationBuilderExceptionV2Formatter(error); + } + if (error instanceof ViewException) { switch (error.code) { case ViewExceptionCode.VIEW_NOT_FOUND: diff --git a/packages/twenty-server/src/engine/core-modules/view/utils/view-graphql-api-exception.filter.ts b/packages/twenty-server/src/engine/core-modules/view/utils/view-graphql-api-exception.filter.ts index 2be7117452..604859fca2 100644 --- a/packages/twenty-server/src/engine/core-modules/view/utils/view-graphql-api-exception.filter.ts +++ b/packages/twenty-server/src/engine/core-modules/view/utils/view-graphql-api-exception.filter.ts @@ -7,6 +7,7 @@ import { ViewGroupException } from 'src/engine/core-modules/view/exceptions/view import { ViewSortException } from 'src/engine/core-modules/view/exceptions/view-sort.exception'; import { ViewException } from 'src/engine/core-modules/view/exceptions/view.exception'; import { viewGraphqlApiExceptionHandler } from 'src/engine/core-modules/view/utils/view-graphql-api-exception-handler.util'; +import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; @Catch( ViewException, @@ -15,6 +16,7 @@ import { viewGraphqlApiExceptionHandler } from 'src/engine/core-modules/view/uti ViewFilterGroupException, ViewGroupException, ViewSortException, + WorkspaceMigrationBuilderExceptionV2, ) export class ViewGraphqlApiExceptionFilter implements ExceptionFilter { catch( @@ -24,7 +26,8 @@ export class ViewGraphqlApiExceptionFilter implements ExceptionFilter { | ViewFilterException | ViewFilterGroupException | ViewGroupException - | ViewSortException, + | ViewSortException + | WorkspaceMigrationBuilderExceptionV2, ) { return viewGraphqlApiExceptionHandler(exception); } diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service-v2.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service-v2.ts index f8a3caed7e..5351e5dd37 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service-v2.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/services/field-metadata.service-v2.ts @@ -77,18 +77,17 @@ export class FieldMetadataServiceV2 { existingFlatObjectMetadataMaps, }); - const flatObjectMetadataMapsWithImpactedObject = - getSubFlatObjectMetadataMapsOrThrow({ - flatObjectMetadataMaps: existingFlatObjectMetadataMaps, - objectMetadataIds: [ - ...new Set( - flatFieldMetadatasToDelete.map( - (flatFieldMetadataToDelete) => - flatFieldMetadataToDelete.objectMetadataId, - ), + const fromFlatObjectMetadataMaps = getSubFlatObjectMetadataMapsOrThrow({ + flatObjectMetadataMaps: existingFlatObjectMetadataMaps, + objectMetadataIds: [ + ...new Set( + flatFieldMetadatasToDelete.map( + (flatFieldMetadataToDelete) => + flatFieldMetadataToDelete.objectMetadataId, ), - ], - }); + ), + ], + }); const toFlatObjectMetadataMaps = flatFieldMetadatasToDelete.reduce( (flatObjectMetadataMaps, flatFieldMetadataToDelete) => @@ -97,7 +96,7 @@ export class FieldMetadataServiceV2 { flatObjectMetadataMaps, objectMetadataId: flatFieldMetadataToDelete.objectMetadataId, }), - flatObjectMetadataMapsWithImpactedObject, + fromFlatObjectMetadataMaps, ); const validateAndBuildResult = @@ -107,8 +106,12 @@ export class FieldMetadataServiceV2 { isSystemBuild: false, inferDeletionFromMissingEntities: true, }, - fromFlatObjectMetadataMaps: flatObjectMetadataMapsWithImpactedObject, - toFlatObjectMetadataMaps, + fromToAllFlatEntityMaps: { + flatObjectMetadataMaps: { + from: fromFlatObjectMetadataMaps, + to: toFlatObjectMetadataMaps, + }, + }, workspaceId, }, ); @@ -177,8 +180,12 @@ export class FieldMetadataServiceV2 { const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - fromFlatObjectMetadataMaps, - toFlatObjectMetadataMaps, + fromToAllFlatEntityMaps: { + flatObjectMetadataMaps: { + from: fromFlatObjectMetadataMaps, + to: toFlatObjectMetadataMaps, + }, + }, buildOptions: { isSystemBuild: false, inferDeletionFromMissingEntities: false, @@ -266,8 +273,12 @@ export class FieldMetadataServiceV2 { const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - fromFlatObjectMetadataMaps, - toFlatObjectMetadataMaps, + fromToAllFlatEntityMaps: { + flatObjectMetadataMaps: { + from: fromFlatObjectMetadataMaps, + to: toFlatObjectMetadataMaps, + }, + }, buildOptions: { isSystemBuild: false, inferDeletionFromMissingEntities: false, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service.ts index 51c5fbcb96..a0d8219d23 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service.ts @@ -7,7 +7,6 @@ import { isDefined } from 'twenty-shared/utils'; import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { FLAT_FIELD_METADATA_RELATION_PROPERTIES_TO_COMPARE } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-properties-to-compare.constant'; import { FlatFieldMetadataTypeValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service'; -import { FailedFlatFieldMetadataValidation } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type'; import { FlatFieldMetadataRelationPropertiesToCompare } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-relation-properties-to-compare.type'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { compareTwoFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/compare-two-flat-field-metadata.util'; @@ -18,6 +17,7 @@ import { validateFlatFieldMetadataName } from 'src/engine/metadata-modules/flat- import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; import { fromFlatObjectMetadataWithFlatFieldMapsToFlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadata-with-flat-field-maps-to-flat-object-metadatas.util'; import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; +import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; export type ValidateOneFieldMetadataArgs< T extends FieldMetadataType = FieldMetadataType, @@ -38,11 +38,13 @@ export class FlatFieldMetadataValidatorService { existingFlatObjectMetadataMaps, flatFieldMetadataToValidate: updatedFlatFieldMetadata, workspaceId, - }: ValidateOneFieldMetadataArgs): Promise { - const validationResult: FailedFlatFieldMetadataValidation = { + }: ValidateOneFieldMetadataArgs): Promise< + FailedFlatEntityValidation + > { + const validationResult: FailedFlatEntityValidation = { type: 'update_field', errors: [], - fieldMinimalInformation: { + flatEntityMinimalInformation: { id: updatedFlatFieldMetadata.id, name: updatedFlatFieldMetadata.name, objectMetadataId: updatedFlatFieldMetadata.objectMetadataId, @@ -162,11 +164,11 @@ export class FlatFieldMetadataValidatorService { }: { flatFieldMetadataToDelete: FlatFieldMetadata; existingFlatObjectMetadataMaps: FlatObjectMetadataMaps; - }): FailedFlatFieldMetadataValidation { - const validationResult: FailedFlatFieldMetadataValidation = { + }): FailedFlatEntityValidation { + const validationResult: FailedFlatEntityValidation = { type: 'delete_field', errors: [], - fieldMinimalInformation: { + flatEntityMinimalInformation: { id: flatFieldMetadataToDelete.id, name: flatFieldMetadataToDelete.name, objectMetadataId: flatFieldMetadataToDelete.objectMetadataId, @@ -238,10 +240,12 @@ export class FlatFieldMetadataValidatorService { flatFieldMetadataToValidate, otherFlatObjectMetadataMapsToValidate, workspaceId, - }: ValidateOneFieldMetadataArgs): Promise { - const validationResult: FailedFlatFieldMetadataValidation = { + }: ValidateOneFieldMetadataArgs): Promise< + FailedFlatEntityValidation + > { + const validationResult: FailedFlatEntityValidation = { errors: [], - fieldMinimalInformation: { + flatEntityMinimalInformation: { id: flatFieldMetadataToValidate.id, name: flatFieldMetadataToValidate.name, objectMetadataId: flatFieldMetadataToValidate.objectMetadataId, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type.ts deleted file mode 100644 index 1a2fcbeb97..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { type FieldMetadataMinimalInformation } from 'src/engine/metadata-modules/flat-field-metadata/types/field-metadata-minimal-information.type'; -import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; -import { type WorkspaceMigrationFieldActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2'; - -export type FailedFlatFieldMetadataValidation = { - type: WorkspaceMigrationFieldActionTypeV2; - errors: FlatFieldMetadataValidationError[]; - fieldMinimalInformation: Partial; -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/throw-on-field-input-transpilations-error.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/throw-on-field-input-transpilations-error.util.ts index c1f2193e29..8af6183763 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/throw-on-field-input-transpilations-error.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/throw-on-field-input-transpilations-error.util.ts @@ -23,13 +23,17 @@ export const throwOnFieldInputTranspilationsError: ThrowOnFieldInputTranspilatio // We should create a dedicated exceptions instead of hacking through the WorkspaceMigrationBuilderExceptionV2 throw new WorkspaceMigrationBuilderExceptionV2( { - errors: [ - { - errors: failedInputTranspilationErrors, - type: 'create_field', - fieldMinimalInformation: {}, - }, - ], + report: { + view: [], + viewField: [], + objectMetadata: [ + { + errors: failedInputTranspilationErrors, + type: 'create_field', + flatEntityMinimalInformation: {}, + }, + ], + }, status: 'fail', }, errorLabel, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/services/flat-object-metadata-validator.service.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/services/flat-object-metadata-validator.service.ts index b9eb4e2c33..cf715d35a4 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/services/flat-object-metadata-validator.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/services/flat-object-metadata-validator.service.ts @@ -4,24 +4,23 @@ import { t } from '@lingui/core/macro'; import { isDefined } from 'twenty-shared/utils'; import { FlatFieldMetadataValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service'; -import { FailedFlatFieldMetadataValidation } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type'; +import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util'; import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; import { addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util'; import { addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.util'; import { findFlatObjectMetadataInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-in-flat-object-metadata-maps.util'; -import { FailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type'; import { FlatObjectMetadataValidationError } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata-validation-error.type'; import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { areFlatObjectMetadataNamesSyncedWithLabels } from 'src/engine/metadata-modules/flat-object-metadata/utils/are-flat-object-metadata-names-synced-with-labels.util'; import { computeMorphOrRelationTargetFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/compute-morph-or-relation-target-flat-object-metadata-maps.util'; -import { getDefaultFailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/flat-object-metadata/utils/get-default-failed-flat-object-metadata-validation.type'; import { validateFlatObjectMetadataIdentifiers } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-identifiers.util'; import { validateFlatObjectMetadataLabel } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-label.util'; import { validateFlatObjectMetadataNames } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name.util'; import { ObjectMetadataExceptionCode } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util'; import { doesOtherObjectWithSameNameExists } from 'src/engine/metadata-modules/utils/validate-no-other-object-with-same-name-exists-or-throw.util'; +import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; import { WorkspaceMigrationV2BuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service'; @Injectable() @@ -36,19 +35,20 @@ export class FlatObjectMetadataValidatorService { }: { existingFlatObjectMetadataMaps: FlatObjectMetadataMaps; updatedFlatObjectMetadata: FlatObjectMetadata; - }): FailedFlatObjectMetadataValidation { - const validationResult = getDefaultFailedFlatObjectMetadataValidation({ + }): FailedFlatEntityValidation { + const validationResult: FailedFlatEntityValidation = { type: 'update_object', - objectMinimalInformation: { + errors: [], + flatEntityMinimalInformation: { id: updatedFlatObjectMetadata.id, }, - }); + }; const existingFlatObjectMetadata = existingFlatObjectMetadataMaps.byId[updatedFlatObjectMetadata.id]; if (!isDefined(existingFlatObjectMetadata)) { - validationResult.objectLevelErrors.push({ + validationResult.errors.push({ code: ObjectMetadataExceptionCode.OBJECT_METADATA_NOT_FOUND, message: t`Object to update not found`, userFriendlyMessage: t`Object to update not found`, @@ -56,20 +56,20 @@ export class FlatObjectMetadataValidatorService { return validationResult; } - validationResult.objectMinimalInformation = { + validationResult.flatEntityMinimalInformation = { id: existingFlatObjectMetadata.id, namePlural: existingFlatObjectMetadata.namePlural, nameSingular: existingFlatObjectMetadata.nameSingular, }; - validationResult.objectLevelErrors.push( + validationResult.errors.push( ...this.validateFlatObjectMetadataNameAndLabels({ existingFlatObjectMetadataMaps, flatObjectMetadataToValidate: updatedFlatObjectMetadata, }), ); - validationResult.objectLevelErrors.push( + validationResult.errors.push( ...validateFlatObjectMetadataIdentifiers(existingFlatObjectMetadata), ); @@ -84,33 +84,34 @@ export class FlatObjectMetadataValidatorService { existingFlatObjectMetadataMaps: FlatObjectMetadataMaps; objectMetadataToDeleteId: string; buildOptions: WorkspaceMigrationV2BuilderOptions; - }): FailedFlatObjectMetadataValidation { - const validationResult = getDefaultFailedFlatObjectMetadataValidation({ + }): FailedFlatEntityValidation { + const validationResult: FailedFlatEntityValidation = { type: 'delete_object', - objectMinimalInformation: { + errors: [], + flatEntityMinimalInformation: { id: objectMetadataToDeleteId, }, - }); + }; const flatObjectMetadataToDelete = existingFlatObjectMetadataMaps.byId[objectMetadataToDeleteId]; if (!isDefined(flatObjectMetadataToDelete)) { - validationResult.objectLevelErrors.push({ + validationResult.errors.push({ code: ObjectMetadataExceptionCode.OBJECT_METADATA_NOT_FOUND, message: t`Object to delete not found`, userFriendlyMessage: t`Object to delete not found`, value: objectMetadataToDeleteId, }); } else { - validationResult.objectMinimalInformation = { + validationResult.flatEntityMinimalInformation = { id: flatObjectMetadataToDelete.id, namePlural: flatObjectMetadataToDelete.namePlural, nameSingular: flatObjectMetadataToDelete.nameSingular, }; if (flatObjectMetadataToDelete.isRemote) { - validationResult.objectLevelErrors.push({ + validationResult.errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, message: t`Remote objects are not supported yet`, userFriendlyMessage: t`Remote objects are not supported yet`, @@ -121,7 +122,7 @@ export class FlatObjectMetadataValidatorService { !buildOptions.isSystemBuild && isStandardMetadata(flatObjectMetadataToDelete) ) { - validationResult.objectLevelErrors.push({ + validationResult.errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, message: t`Standard objects cannot be deleted`, userFriendlyMessage: t`Standard objects cannot be deleted`, @@ -129,7 +130,7 @@ export class FlatObjectMetadataValidatorService { } if (!buildOptions.isSystemBuild && flatObjectMetadataToDelete.isActive) { - validationResult.objectLevelErrors.push({ + validationResult.errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, message: t`Active objects cannot be deleted`, userFriendlyMessage: t`Active objects cannot be deleted`, @@ -148,15 +149,21 @@ export class FlatObjectMetadataValidatorService { existingFlatObjectMetadataMaps: FlatObjectMetadataMaps; flatObjectMetadataToValidate: FlatObjectMetadata; otherFlatObjectMetadataMapsToValidate?: FlatObjectMetadataMaps; - }): Promise { - const validationResult = getDefaultFailedFlatObjectMetadataValidation({ + }): Promise<{ + objectValidationResult: FailedFlatEntityValidation; + fieldValidationResults: FailedFlatEntityValidation[]; + }> { + const objectValidationResult: FailedFlatEntityValidation< + FlatObjectMetadata | FlatFieldMetadata + > = { type: 'create_object', - objectMinimalInformation: { + errors: [], + flatEntityMinimalInformation: { id: flatObjectMetadataToValidate.id, namePlural: flatObjectMetadataToValidate.namePlural, nameSingular: flatObjectMetadataToValidate.nameSingular, }, - }); + }; if ( isDefined( @@ -166,7 +173,7 @@ export class FlatObjectMetadataValidatorService { }), ) ) { - validationResult.objectLevelErrors.push({ + objectValidationResult.errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, message: t`Object with same id already exists`, userFriendlyMessage: t`Object with same id already exists`, @@ -174,21 +181,21 @@ export class FlatObjectMetadataValidatorService { } if (flatObjectMetadataToValidate.isRemote) { - validationResult.objectLevelErrors.push({ + objectValidationResult.errors.push({ code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, message: t`Remote objects are not supported yet`, userFriendlyMessage: t`Remote objects are not supported yet`, }); } - validationResult.objectLevelErrors.push( + objectValidationResult.errors.push( ...this.validateFlatObjectMetadataNameAndLabels({ existingFlatObjectMetadataMaps, flatObjectMetadataToValidate, }), ); - const allFlatFieldMetadatasValidationErrors: FailedFlatFieldMetadataValidation[] = + const fieldValidationResults: FailedFlatEntityValidation[] = []; let optimisticFlatObjectMetadataMaps = addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow({ @@ -220,7 +227,7 @@ export class FlatObjectMetadataValidatorService { ); if (flatFieldValidatorErrors.errors.length > 0) { - allFlatFieldMetadatasValidationErrors.push(flatFieldValidatorErrors); + fieldValidationResults.push(flatFieldValidatorErrors); continue; } @@ -231,13 +238,10 @@ export class FlatObjectMetadataValidatorService { }); } - if (allFlatFieldMetadatasValidationErrors.length > 0) { - validationResult.fieldLevelErrors.push( - ...allFlatFieldMetadatasValidationErrors, - ); - } - - return validationResult; + return { + fieldValidationResults, + objectValidationResult, + }; } private validateFlatObjectMetadataNameAndLabels({ diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type.ts deleted file mode 100644 index 7933c32138..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { type FailedFlatFieldMetadataValidation } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type'; -import { type FlatObjectMetadataValidationError } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata-validation-error.type'; -import { type ObjectMetadataMinimalInformation } from 'src/engine/metadata-modules/flat-object-metadata/types/object-metadata-minimal-information.type'; -import { type WorkspaceMigrationObjectActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2'; - -export type FailedFlatObjectMetadataValidation = { - type: WorkspaceMigrationObjectActionTypeV2; - objectLevelErrors: FlatObjectMetadataValidationError[]; - fieldLevelErrors: FailedFlatFieldMetadataValidation[]; - objectMinimalInformation: Partial; -}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-default-failed-flat-object-metadata-validation.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-default-failed-flat-object-metadata-validation.type.ts deleted file mode 100644 index 07c1ecf8de..0000000000 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/get-default-failed-flat-object-metadata-validation.type.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { type FailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type'; - -export const getDefaultFailedFlatObjectMetadataValidation = ( - overrides: Partial> & - Pick, -): FailedFlatObjectMetadataValidation => ({ - fieldLevelErrors: [], - objectLevelErrors: [], - objectMinimalInformation: {}, - ...overrides, -}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/is-failed-flat-object-metadata-validation.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/is-failed-flat-object-metadata-validation.util.ts index 4df5cecedd..2a18ba3825 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/is-failed-flat-object-metadata-validation.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/is-failed-flat-object-metadata-validation.util.ts @@ -1,15 +1,14 @@ -import { type FailedFlatFieldMetadataValidation } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type'; -import { type FailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type'; +import { type FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type'; +import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; import { WORKSPACE_MIGRATION_OBJECT_ACTION_TYPES, type WorkspaceMigrationObjectActionTypeV2, } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2'; export const isFailedFlatObjectMetadataValidation = ( - failedValidation: - | FailedFlatObjectMetadataValidation - | FailedFlatFieldMetadataValidation, -): failedValidation is FailedFlatObjectMetadataValidation => { + failedValidation: FailedFlatEntityValidation, +): failedValidation is FailedFlatEntityValidation => { return WORKSPACE_MIGRATION_OBJECT_ACTION_TYPES.includes( failedValidation.type as WorkspaceMigrationObjectActionTypeV2, ); diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata-v2.service.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata-v2.service.ts index 43565d7865..2c6413a11c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata-v2.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata-v2.service.ts @@ -1,11 +1,7 @@ import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; import { isDefined } from 'twenty-shared/utils'; -import { Repository } from 'typeorm'; -import { ViewEntity } from 'src/engine/core-modules/view/entities/view.entity'; -import { ViewV2Service } from 'src/engine/core-modules/view/services/view-v2.service'; import { addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util'; import { addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.util'; import { deleteFieldFromFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-maps-or-throw.util'; @@ -27,7 +23,6 @@ import { ObjectMetadataException, ObjectMetadataExceptionCode, } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception'; -import { ObjectMetadataRelatedRecordsService } from 'src/engine/metadata-modules/object-metadata/services/object-metadata-related-records.service'; import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service'; import { WorkspacePermissionsCacheService } from 'src/engine/metadata-modules/workspace-permissions-cache/workspace-permissions-cache.service'; import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; @@ -38,11 +33,7 @@ export class ObjectMetadataServiceV2 { constructor( private readonly workspaceMetadataCacheService: WorkspaceMetadataCacheService, private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService, - private readonly objectMetadataRelatedRecordsService: ObjectMetadataRelatedRecordsService, private readonly workspacePermissionsCacheService: WorkspacePermissionsCacheService, - @InjectRepository(ViewEntity) - private readonly viewRepository: Repository, - private readonly viewV2Service: ViewV2Service, ) {} async updateOne({ @@ -93,8 +84,12 @@ export class ObjectMetadataServiceV2 { const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - fromFlatObjectMetadataMaps, - toFlatObjectMetadataMaps, + fromToAllFlatEntityMaps: { + flatObjectMetadataMaps: { + from: fromFlatObjectMetadataMaps, + to: toFlatObjectMetadataMaps, + }, + }, buildOptions: { isSystemBuild: false, inferDeletionFromMissingEntities: false, @@ -196,8 +191,12 @@ export class ObjectMetadataServiceV2 { const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - fromFlatObjectMetadataMaps, - toFlatObjectMetadataMaps, + fromToAllFlatEntityMaps: { + flatObjectMetadataMaps: { + from: fromFlatObjectMetadataMaps, + to: toFlatObjectMetadataMaps, + }, + }, buildOptions: { inferDeletionFromMissingEntities: true, isSystemBuild: false, @@ -285,8 +284,12 @@ export class ObjectMetadataServiceV2 { const validateAndBuildResult = await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration( { - fromFlatObjectMetadataMaps, - toFlatObjectMetadataMaps, + fromToAllFlatEntityMaps: { + flatObjectMetadataMaps: { + from: fromFlatObjectMetadataMaps, + to: toFlatObjectMetadataMaps, + }, + }, buildOptions: { isSystemBuild: false, inferDeletionFromMissingEntities: false, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2.ts index 5cb08faf3f..625ca7b2ae 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2.ts @@ -1,8 +1,8 @@ -import { type FailedWorkspaceMigrationBuildResult } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service'; +import { type WorkspaceMigrationOrchestratorFailedResult } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; export class WorkspaceMigrationBuilderExceptionV2 extends Error { constructor( - public readonly failedWorkspaceMigrationBuildResult: FailedWorkspaceMigrationBuildResult, + public readonly failedWorkspaceMigrationBuildResult: WorkspaceMigrationOrchestratorFailedResult, message = 'Workspace migration builder failed', ) { super(message); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-orchestrator-exception.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-orchestrator-exception.ts deleted file mode 100644 index 05a379e096..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-orchestrator-exception.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class WorkspaceMigrationOrchestratorException extends Error { - constructor(message = 'Workspace migration orchestrator failed') { - super(message); - this.name = 'WorkspaceMigrationOrchestratorException'; - } -} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/types/validate-error-response.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/types/validate-error-response.type.ts index 4b3ecbfebe..4a8ad0528b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/types/validate-error-response.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/types/validate-error-response.type.ts @@ -1,7 +1,9 @@ +import { type AllFlatEntitiesByMetadataEngineName } from 'src/engine/core-modules/common/types/all-flat-entities.type'; import { type FieldMetadataMinimalInformation } from 'src/engine/metadata-modules/flat-field-metadata/types/field-metadata-minimal-information.type'; import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type'; import { type FlatObjectMetadataValidationError } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata-validation-error.type'; import { type ObjectMetadataMinimalInformation } from 'src/engine/metadata-modules/flat-object-metadata/types/object-metadata-minimal-information.type'; +import { type OrchestratorFailureReport } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; import { type WorkspaceMigrationFieldActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2'; import { type WorkspaceMigrationObjectActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2'; @@ -16,14 +18,12 @@ export type ValidationErrorObjectResponse = errors: FlatObjectMetadataValidationError[]; fields: ValidationErrorFieldResponse[]; }; + export type ValidationErrorResponse = { summary: { totalErrors: number; - invalidFields: number; - invalidObjects: number; - }; - errors: { - objectMetadata: ValidationErrorObjectResponse[]; - fieldMetadata: ValidationErrorFieldResponse[]; + } & { + [P in keyof AllFlatEntitiesByMetadataEngineName as `invalid${Capitalize

}s`]: number; }; + errors: OrchestratorFailureReport; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-field-metadata-validation-to-validation-error-field-response.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-field-metadata-validation-to-validation-error-field-response.util.ts deleted file mode 100644 index 14fc6ad5d6..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-field-metadata-validation-to-validation-error-field-response.util.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { type FailedFlatFieldMetadataValidation } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type'; -import { type ValidationErrorFieldResponse } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/types/validate-error-response.type'; - -export const fromFailedFlatFieldMetadataValidationToValidationErrorFieldResponse = - ( - failedFlatFieldMetadataValidation: FailedFlatFieldMetadataValidation, - ): ValidationErrorFieldResponse => { - const { id, name, objectMetadataId } = - failedFlatFieldMetadataValidation.fieldMinimalInformation; - - return { - operation: failedFlatFieldMetadataValidation.type, - id, - name, - errors: failedFlatFieldMetadataValidation.errors, - objectMetadataId, - }; - }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-object-metadata-validation-to-validation-error-object-response.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-object-metadata-validation-to-validation-error-object-response.util.ts deleted file mode 100644 index 3a0ebaf1ab..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-object-metadata-validation-to-validation-error-object-response.util.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { type FailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type'; -import { type ValidationErrorObjectResponse } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/types/validate-error-response.type'; -import { fromFailedFlatFieldMetadataValidationToValidationErrorFieldResponse } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-field-metadata-validation-to-validation-error-field-response.util'; - -export const fromFailedFlatObjectMetadataValidationToValidationErrorObjectResponse = - ( - failedFlatObjectMetadataValidation: FailedFlatObjectMetadataValidation, - ): ValidationErrorObjectResponse => { - const { id, namePlural, nameSingular } = - failedFlatObjectMetadataValidation.objectMinimalInformation; - const fields = failedFlatObjectMetadataValidation.fieldLevelErrors.map( - fromFailedFlatFieldMetadataValidationToValidationErrorFieldResponse, - ); - const objectResponseError: ValidationErrorObjectResponse = { - operation: failedFlatObjectMetadataValidation.type, - fields, - id, - namePlural, - nameSingular, - errors: failedFlatObjectMetadataValidation.objectLevelErrors, - }; - - return objectResponseError; - }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-workspace-migration-builder-exception-to-validation-response-error.util.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-workspace-migration-builder-exception-to-validation-response-error.util.ts index 7291bf7f40..c89c56413e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-workspace-migration-builder-exception-to-validation-response-error.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-workspace-migration-builder-exception-to-validation-response-error.util.ts @@ -1,65 +1,27 @@ -import { isFailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/flat-object-metadata/utils/is-failed-flat-object-metadata-validation.util'; import { type WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2'; import { type ValidationErrorResponse } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/types/validate-error-response.type'; -import { fromFailedFlatFieldMetadataValidationToValidationErrorFieldResponse } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-field-metadata-validation-to-validation-error-field-response.util'; -import { fromFailedFlatObjectMetadataValidationToValidationErrorObjectResponse } from 'src/engine/workspace-manager/workspace-migration-v2/interceptors/utils/from-failed-flat-object-metadata-validation-to-validation-error-object-response.util'; export const fromWorkspaceMigrationBuilderExceptionToValidationResponseError = ( workspaceMigrationBuilderException: WorkspaceMigrationBuilderExceptionV2, -) => { +): ValidationErrorResponse => { const emptyResponseError: ValidationErrorResponse = { summary: { - invalidFields: 0, - invalidObjects: 0, + invalidObjectMetadatas: 0, + invalidViews: 0, + invalidViewFields: 0, totalErrors: 0, }, errors: { - fieldMetadata: [], objectMetadata: [], + view: [], + viewField: [], }, }; - return workspaceMigrationBuilderException.failedWorkspaceMigrationBuildResult.errors.reduce( - ({ errors, summary }, failedValidationError) => { - if (isFailedFlatObjectMetadataValidation(failedValidationError)) { - const errorObjectResponse = - fromFailedFlatObjectMetadataValidationToValidationErrorObjectResponse( - failedValidationError, - ); - - return { - summary: { - ...summary, - invalidFields: - summary.invalidFields + errorObjectResponse.fields.length, - invalidObjects: ++summary.invalidObjects, - totalErrors: - ++summary.totalErrors + errorObjectResponse.fields.length, - }, - errors: { - ...errors, - objectMetadata: [...errors.objectMetadata, errorObjectResponse], - }, - }; - } - - const fieldResponseError = - fromFailedFlatFieldMetadataValidationToValidationErrorFieldResponse( - failedValidationError, - ); - - return { - summary: { - ...summary, - invalidFields: ++summary.invalidFields, - totalErrors: ++summary.totalErrors, - }, - errors: { - ...errors, - fieldMetadata: [...errors.fieldMetadata, fieldResponseError], - }, - }; - }, - emptyResponseError, - ); + return { + ...emptyResponseError, + errors: + workspaceMigrationBuilderException.failedWorkspaceMigrationBuildResult + .report, + }; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/workspace-migration-builder-exception-v2-formatter.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/workspace-migration-builder-exception-v2-formatter.ts index 2662401512..007518331a 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/workspace-migration-builder-exception-v2-formatter.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/interceptors/workspace-migration-builder-exception-v2-formatter.ts @@ -13,8 +13,8 @@ export const workspaceMigrationBuilderExceptionV2Formatter = ( const { errors, summary } = fromWorkspaceMigrationBuilderExceptionToValidationResponseError(error); - const invalidObjects = summary.invalidObjects; - const invalidFields = summary.invalidFields; + const invalidObjects = summary.invalidObjectMetadatas; + const invalidFields = summary.invalidViewFields; throw new BaseGraphQLError(error.message, ErrorCode.BAD_USER_INPUT, { code: 'METADATA_VALIDATION_ERROR', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts index 093f8e55be..24b77598eb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts @@ -1,24 +1,19 @@ import { Injectable, Logger } from '@nestjs/common'; -import { isDefined } from 'class-validator'; +import { isDefined } from 'twenty-shared/utils'; -import { ViewCacheService } from 'src/engine/core-modules/view/cache/services/view-cache.service'; -import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service'; -import { WorkspaceMigrationOrchestratorException } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-orchestrator-exception'; +import { EMPTY_ALL_FLAT_ENTITY_MAPS } from 'src/engine/core-modules/common/constant/empty-all-flat-entity-maps.constant'; +import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type'; import { + OrchestratorFailureReport, WorkspaceMigrationOrchestratorBuildArgs, - WorkspaceMigrationOrchestratorEntityMaps, WorkspaceMigrationOrchestratorFailedResult, - WorkspaceMigrationOrchestratorOptimisticEntityMaps, + WorkspaceMigrationOrchestratorSuccessfulResult, } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; +import { WorkspaceMigrationV2ViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service'; +import { WorkspaceMigrationV2ViewActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service'; import { WorkspaceMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service'; -import { WorkspaceViewFieldMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-field-migration-builder-v2.service'; -import { WorkspaceViewMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-migration-builder-v2.service'; -import { WorkspaceMigrationRunnerV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/services/workspace-migration-runner-v2.service'; -import { - WorkspaceMigrationV2Exception, - WorkspaceMigrationV2ExceptionCode, -} from 'src/engine/workspace-manager/workspace-migration.exception'; +import { WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; @Injectable() export class WorkspaceMigrationBuildOrchestratorService { @@ -28,162 +23,154 @@ export class WorkspaceMigrationBuildOrchestratorService { constructor( private readonly workspaceMigrationBuilderV2Service: WorkspaceMigrationBuilderV2Service, - private readonly workspaceViewMigrationBuilderV2Service: WorkspaceViewMigrationBuilderV2Service, - private readonly workspaceViewFieldMigrationBuilderV2Service: WorkspaceViewFieldMigrationBuilderV2Service, - private readonly migrationRunner: WorkspaceMigrationRunnerV2Service, - private readonly workspaceMetadataCacheService: WorkspaceMetadataCacheService, - private readonly viewCacheService: ViewCacheService, + private readonly workspaceMigrationV2ViewActionsBuilderService: WorkspaceMigrationV2ViewActionsBuilderService, + private readonly workspaceMigrationV2ViewFieldActionsBuilderService: WorkspaceMigrationV2ViewFieldActionsBuilderService, ) {} - public async buildWorkspaceMigrations({ - workspaceId, - buildOptions, - entityMaps, - }: WorkspaceMigrationOrchestratorBuildArgs): Promise< - WorkspaceMigrationOrchestratorFailedResult | undefined - > { - try { - const allObjectAndFieldActions = []; - const allViewActions = []; - const allViewFieldActions = []; - const allFailures = []; + // This does not handle dependency maps correctly + private setupOptimisticCache({ + fromToAllFlatEntityMaps, + dependencyAllFlatEntityMaps, + }: Pick< + WorkspaceMigrationOrchestratorBuildArgs, + 'fromToAllFlatEntityMaps' | 'dependencyAllFlatEntityMaps' + >): AllFlatEntityMaps { + const allFromToFlatEntityMapsKeys = Object.keys( + fromToAllFlatEntityMaps, + ) as (keyof AllFlatEntityMaps)[]; - const optimisticEntityMaps = await this.prepareOptimisticEntityMaps({ - entityMaps, - workspaceId, - }); + return allFromToFlatEntityMapsKeys.reduce( + (allFlatEntityMaps, currFlatMaps) => { + const fromToOccurence = fromToAllFlatEntityMaps[currFlatMaps]; - if (entityMaps.object) { - const objectResult = - await this.workspaceMigrationBuilderV2Service.validateAndBuild({ - fromFlatObjectMetadataMaps: - entityMaps.object.fromFlatObjectMetadataMaps, - toFlatObjectMetadataMaps: - entityMaps.object.toFlatObjectMetadataMaps, - workspaceId, - buildOptions, - }); - - if (objectResult.status === 'fail') { - allFailures.push(...objectResult.errors); - } else { - optimisticEntityMaps.object = objectResult.optimisticFlatEntityMaps; - allObjectAndFieldActions.push( - ...objectResult.workspaceMigration.actions, - ); + if (!isDefined(fromToOccurence)) { + return allFlatEntityMaps; } - } - if (entityMaps.view) { - const viewResult = - await this.workspaceViewMigrationBuilderV2Service.validateAndBuild({ - fromFlatViewMaps: entityMaps.view.fromFlatViewMaps, - toFlatViewMaps: entityMaps.view.toFlatViewMaps, - workspaceId, - buildOptions, - dependencyOptimisticEntityMaps: { - object: optimisticEntityMaps.object, - }, - }); - - if (viewResult.status === 'fail') { - allFailures.push(...viewResult.errors); - } else { - optimisticEntityMaps.view = viewResult.optimisticFlatEntityMaps; - allViewActions.push(...viewResult.workspaceMigration.actions); - } - } - - if (entityMaps.viewField) { - const viewFieldResult = - await this.workspaceViewFieldMigrationBuilderV2Service.validateAndBuild( - { - fromFlatViewFieldMaps: entityMaps.viewField.fromFlatViewFieldMaps, - toFlatViewFieldMaps: entityMaps.viewField.toFlatViewFieldMaps, - workspaceId, - buildOptions, - dependencyOptimisticEntityMaps: { - object: optimisticEntityMaps.object, - view: optimisticEntityMaps.view, - }, - }, - ); - - if (viewFieldResult.status === 'fail') { - allFailures.push(...viewFieldResult.errors); - } else { - optimisticEntityMaps.viewField = - viewFieldResult.optimisticFlatEntityMaps; - allViewFieldActions.push( - ...viewFieldResult.workspaceMigration.actions, - ); - } - } - - if (allFailures.length > 0) { return { - status: 'fail', - errors: allFailures, + ...allFlatEntityMaps, + [currFlatMaps]: fromToOccurence.from, }; - } - - // TODO: return workspace migrations - - return; - } catch (error) { - this.logger.error(error); - throw new WorkspaceMigrationV2Exception( - WorkspaceMigrationV2ExceptionCode.BUILDER_INTERNAL_SERVER_ERROR, - error.message, - ); - } + }, + { + ...EMPTY_ALL_FLAT_ENTITY_MAPS, + ...dependencyAllFlatEntityMaps, + }, + ); } - // TODO: move to dedicated service - private async prepareOptimisticEntityMaps({ - entityMaps, + public async buildWorkspaceMigration({ workspaceId, - }: { - entityMaps: WorkspaceMigrationOrchestratorEntityMaps; - workspaceId: string; - }): Promise { - const optimisticObjectMaps = - entityMaps.object?.fromFlatObjectMetadataMaps ?? - ( - await this.workspaceMetadataCacheService.getExistingOrRecomputeFlatObjectMetadataMaps( - { workspaceId }, - ) - ).flatObjectMetadataMaps; - - if (!isDefined(optimisticObjectMaps)) { - throw new WorkspaceMigrationOrchestratorException( - 'Object metadata maps not found', - ); - } - - const optimisticViewMaps = - entityMaps.view?.fromFlatViewMaps ?? - ( - await this.viewCacheService.getExistingOrRecomputeFlatViewMaps({ - workspaceId, - }) - ).flatViewMaps; - - if (!isDefined(optimisticViewMaps)) { - throw new WorkspaceMigrationOrchestratorException('View maps not found'); - } - - // For ViewFields, if not provided, start with empty maps since ViewFields are optional - const optimisticViewFieldMaps = entityMaps.viewField - ?.fromFlatViewFieldMaps ?? { - byId: {}, - idByUniversalIdentifier: {}, + buildOptions, + fromToAllFlatEntityMaps, + dependencyAllFlatEntityMaps, + }: WorkspaceMigrationOrchestratorBuildArgs): Promise< + | WorkspaceMigrationOrchestratorFailedResult + | WorkspaceMigrationOrchestratorSuccessfulResult + > { + const allActions: WorkspaceMigrationActionV2[] = []; + const orchestratorFailureReport: OrchestratorFailureReport = { + objectMetadata: [], + view: [], + viewField: [], }; + const optimisticAllFlatEntityMaps = this.setupOptimisticCache({ + fromToAllFlatEntityMaps, + dependencyAllFlatEntityMaps, + }); + const { flatObjectMetadataMaps, flatViewFieldMaps, flatViewMaps } = + fromToAllFlatEntityMaps; + + if (isDefined(flatObjectMetadataMaps)) { + const { from: fromFlatObjectMetadataMaps, to: toFlatObjectMetadataMaps } = + flatObjectMetadataMaps; + + const objectResult = + await this.workspaceMigrationBuilderV2Service.validateAndBuild({ + fromFlatObjectMetadataMaps, + toFlatObjectMetadataMaps, + workspaceId, + buildOptions, + }); + + optimisticAllFlatEntityMaps.flatObjectMetadataMaps = + objectResult.optimisticFlatObjectMetadataMaps; + + if (objectResult.status === 'fail') { + orchestratorFailureReport.objectMetadata.push(...objectResult.errors); + } else { + allActions.push(...objectResult.workspaceMigration.actions); + } + } + + if (isDefined(flatViewMaps)) { + const { from: fromFlatViewMaps, to: toFlatViewMaps } = flatViewMaps; + const viewResult = + await this.workspaceMigrationV2ViewActionsBuilderService.validateAndBuild( + { + dependencyOptimisticFlatEntityMaps: { + flatObjectMetadataMaps: + optimisticAllFlatEntityMaps.flatObjectMetadataMaps, + }, + from: fromFlatViewMaps, + to: toFlatViewMaps, + buildOptions, + }, + ); + + optimisticAllFlatEntityMaps.flatViewMaps = + viewResult.optimisticFlatEntityMaps; + + if (viewResult.status === 'fail') { + orchestratorFailureReport.view.push(...viewResult.errors); + } else { + allActions.push(...viewResult.actions); + } + } + + if (isDefined(flatViewFieldMaps)) { + const { from: fromFlatViewFieldMaps, to: toFlatViewFieldMaps } = + flatViewFieldMaps; + const viewFieldResult = + await this.workspaceMigrationV2ViewFieldActionsBuilderService.validateAndBuild( + { + from: fromFlatViewFieldMaps, + to: toFlatViewFieldMaps, + buildOptions, + dependencyOptimisticFlatEntityMaps: { + flatObjectMetadataMaps: + optimisticAllFlatEntityMaps.flatObjectMetadataMaps, + flatViewMaps: optimisticAllFlatEntityMaps.flatViewMaps, + }, + }, + ); + + optimisticAllFlatEntityMaps.flatViewFieldMaps = + viewFieldResult.optimisticFlatEntityMaps; + + if (viewFieldResult.status === 'fail') { + orchestratorFailureReport.viewField.push(...viewFieldResult.errors); + } else { + allActions.push(...viewFieldResult.actions); + } + } + + const allErrors = Object.values(orchestratorFailureReport); + + if (allErrors.some((report) => report.length > 0)) { + return { + status: 'fail', + report: orchestratorFailureReport, + }; + } + return { - object: optimisticObjectMaps, - view: optimisticViewMaps, - viewField: optimisticViewFieldMaps, + status: 'success', + workspaceMigration: { + actions: allActions, + workspaceId, + }, }; } } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts index 56523f8b66..b68d918900 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts @@ -1,10 +1,10 @@ import { Injectable, Logger } from '@nestjs/common'; +import { WorkspaceMigrationBuildOrchestratorService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service'; import { - FailedWorkspaceMigrationBuildResult, - WorkspaceMigrationBuildArgs, - WorkspaceMigrationBuilderV2Service, -} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service'; + WorkspaceMigrationOrchestratorBuildArgs, + WorkspaceMigrationOrchestratorFailedResult, +} from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; import { WorkspaceMigrationRunnerV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/services/workspace-migration-runner-v2.service'; import { WorkspaceMigrationV2Exception, @@ -19,22 +19,23 @@ export class WorkspaceMigrationValidateBuildAndRunService { ); constructor( - private readonly workspaceMigrationBuilderV2Service: WorkspaceMigrationBuilderV2Service, private readonly workspaceMigrationRunnerV2Service: WorkspaceMigrationRunnerV2Service, + private readonly workspaceMigrationBuildOrchestratorService: WorkspaceMigrationBuildOrchestratorService, ) {} public async validateBuildAndRunWorkspaceMigration( - builderArgs: WorkspaceMigrationBuildArgs, - ): Promise { - const validateAndBuildResult = await this.workspaceMigrationBuilderV2Service - .validateAndBuild(builderArgs) - .catch((error) => { - this.logger.error(error); - throw new WorkspaceMigrationV2Exception( - WorkspaceMigrationV2ExceptionCode.BUILDER_INTERNAL_SERVER_ERROR, - error.message, - ); - }); + builderArgs: WorkspaceMigrationOrchestratorBuildArgs, + ): Promise { + const validateAndBuildResult = + await this.workspaceMigrationBuildOrchestratorService + .buildWorkspaceMigration(builderArgs) + .catch((error) => { + this.logger.error(error); + throw new WorkspaceMigrationV2Exception( + WorkspaceMigrationV2ExceptionCode.BUILDER_INTERNAL_SERVER_ERROR, + error.message, + ); + }); if (validateAndBuildResult.status === 'fail') { return validateAndBuildResult; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts index ec77744db0..8da97e89f7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts @@ -1,41 +1,32 @@ import { type FromTo } from 'twenty-shared/types'; -import { type FailedFlatViewFieldValidation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation.type'; -import { type FailedFlatViewValidation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-validation.type'; -import { type FlatViewFieldMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-field-maps.type'; -import { type FlatViewMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-maps.type'; -import { type FailedFlatFieldMetadataValidation } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type'; -import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; -import { type FailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type'; +import { type AllFlatEntitiesByMetadataEngineName } from 'src/engine/core-modules/common/types/all-flat-entities.type'; +import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type'; +import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; import { type WorkspaceMigrationV2BuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service'; - -export type WorkspaceMigrationOrchestratorEntityMaps = { - object?: FromTo; - field?: FromTo; // Fields are part of object maps for now - view?: FromTo; - viewField?: FromTo; -}; - -type UnwrapFromTo = T extends FromTo ? U : T; - -export type WorkspaceMigrationOrchestratorOptimisticEntityMaps = { - [K in keyof WorkspaceMigrationOrchestratorEntityMaps]?: UnwrapFromTo< - WorkspaceMigrationOrchestratorEntityMaps[K] - >; -}; +import { type WorkspaceMigrationV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-v2'; export type WorkspaceMigrationOrchestratorBuildArgs = { workspaceId: string; buildOptions: WorkspaceMigrationV2BuilderOptions; - entityMaps: WorkspaceMigrationOrchestratorEntityMaps; + fromToAllFlatEntityMaps: { + [P in keyof AllFlatEntityMaps]?: FromTo; + }; + dependencyAllFlatEntityMaps?: Partial; +}; + +export type OrchestratorFailureReport = { + [P in keyof AllFlatEntitiesByMetadataEngineName]: FailedFlatEntityValidation< + AllFlatEntitiesByMetadataEngineName[P] + >[]; }; export type WorkspaceMigrationOrchestratorFailedResult = { status: 'fail'; - errors: ( - | FailedFlatObjectMetadataValidation - | FailedFlatFieldMetadataValidation - | FailedFlatViewValidation - | FailedFlatViewFieldValidation - )[]; + report: OrchestratorFailureReport; +}; + +export type WorkspaceMigrationOrchestratorSuccessfulResult = { + status: 'success'; + workspaceMigration: WorkspaceMigrationV2; }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/services/workspace-migration-v2-object-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/services/workspace-migration-v2-object-actions-builder.service.ts index dd808b564b..6ca5cf20a7 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/services/workspace-migration-v2-object-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/services/workspace-migration-v2-object-actions-builder.service.ts @@ -73,10 +73,13 @@ export class WorkspaceMigrationV2ObjectActionsBuilderService { ); if ( - validationErrors.fieldLevelErrors.length > 0 || - validationErrors.objectLevelErrors.length > 0 + validationErrors.fieldValidationResults.length > 0 || + validationErrors.objectValidationResult.errors.length > 0 ) { - validateAndBuildResult.failed.push(validationErrors); + validateAndBuildResult.failed.push( + validationErrors.objectValidationResult, + ...validationErrors.fieldValidationResults, + ); continue; } @@ -116,10 +119,7 @@ export class WorkspaceMigrationV2ObjectActionsBuilderService { }, ); - if ( - validationErrors.fieldLevelErrors.length > 0 || - validationErrors.objectLevelErrors.length > 0 - ) { + if (validationErrors.errors.length > 0) { validateAndBuildResult.failed.push(validationErrors); continue; } @@ -160,10 +160,7 @@ export class WorkspaceMigrationV2ObjectActionsBuilderService { }, ); - if ( - validationErrors.fieldLevelErrors.length > 0 || - validationErrors.objectLevelErrors.length > 0 - ) { + if (validationErrors.errors.length > 0) { validateAndBuildResult.failed.push(validationErrors); continue; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type.ts new file mode 100644 index 0000000000..1d619fbf45 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type.ts @@ -0,0 +1,15 @@ +import { type FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type'; +import { type WorkspaceMigrationActionTypeV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; + +export type FlatEntityValidationError = { + code: TCode; // should be a better extends + message: string; + userFriendlyMessage?: string; + value?: unknown; +}; + +export type FailedFlatEntityValidation = { + type: WorkspaceMigrationActionTypeV2; + errors: FlatEntityValidationError[]; + flatEntityMinimalInformation: Partial; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service.ts index 16ccf7153c..7e3a37360d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service.ts @@ -1,19 +1,14 @@ import { Injectable } from '@nestjs/common'; -import { FromTo } from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; - -import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; -import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util'; -import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util'; -import { FailedFlatViewFieldValidation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation.type'; -import { FlatViewFieldMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-field-maps.type'; +import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type'; import { FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type'; import { compareTwoFlatViewField } from 'src/engine/core-modules/view/flat-view/utils/compare-two-flat-view-field.util'; -import { WorkspaceMigrationOrchestratorOptimisticEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; -import { type CustomDeletedCreatedUpdatedMatrix } from 'src/engine/workspace-manager/workspace-migration-v2/utils/deleted-created-updated-matrix-dispatcher.util'; -import { WorkspaceViewFieldMigrationV2BuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-field-migration-builder-v2.service'; -import { WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; +import { + FlatEntityUpdateValidationArgs, + FlatEntityValidationArgs, + FlatEntityValidationReturnType, + WorkspaceEntityMigrationBuilderV2Service, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service'; import { UpdateViewFieldAction, WorkspaceMigrationViewFieldActionV2, @@ -24,155 +19,138 @@ import { } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-field-action'; import { FlatViewFieldValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service'; -export type CreatedDeletedUpdatedViewFieldInputMatrix = FromTo< - FlatViewFieldMaps, - 'FlatViewFieldMaps' -> & - CustomDeletedCreatedUpdatedMatrix<'flatViewField', FlatViewField> & { - buildOptions: WorkspaceViewFieldMigrationV2BuilderOptions; - fromFlatViewFieldMaps: FlatViewFieldMaps; - dependencyOptimisticEntityMaps: WorkspaceMigrationOrchestratorOptimisticEntityMaps; - }; - -type ValidateAndBuildViewFieldResult = { - failed: FailedFlatViewFieldValidation[]; - created: T[]; - deleted: T[]; - updated: T[]; - optimisticFlatViewFieldMaps: FlatViewFieldMaps; -}; - +export type ViewFieldRelatedFlatEntityMaps = Pick< + AllFlatEntityMaps, + 'flatObjectMetadataMaps' | 'flatViewMaps' +>; @Injectable() -export class WorkspaceMigrationV2ViewFieldActionsBuilderService { +export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service< + FlatViewField, + WorkspaceMigrationViewFieldActionV2, + ViewFieldRelatedFlatEntityMaps +> { constructor( private readonly flatViewFieldValidatorService: FlatViewFieldValidatorService, - ) {} + ) { + super(); + } - public async validateAndBuildViewFieldActions({ - createdFlatViewField, - deletedFlatViewField, - updatedFlatViewField, - buildOptions, - fromFlatViewFieldMaps, - dependencyOptimisticEntityMaps, - }: CreatedDeletedUpdatedViewFieldInputMatrix): Promise< - ValidateAndBuildViewFieldResult + protected async validateFlatEntityCreation({ + dependencyOptimisticFlatEntityMaps, + flatEntityToValidate: flatViewFieldToValidate, + optimisticFlatEntityMaps: optimisticFlatViewFieldMaps, + }: FlatEntityValidationArgs< + FlatViewField, + ViewFieldRelatedFlatEntityMaps + >): Promise< + FlatEntityValidationReturnType< + WorkspaceMigrationViewFieldActionV2, + FlatViewField + > > { - const validateAndBuildResult: ValidateAndBuildViewFieldResult = - { - failed: [], - created: [], - deleted: [], - updated: [], - optimisticFlatViewFieldMaps: structuredClone(fromFlatViewFieldMaps), - }; - - if ( - !isDefined(dependencyOptimisticEntityMaps.object) || - !isDefined(dependencyOptimisticEntityMaps.view) - ) { - throw new Error('Dependency optimistic entity maps are not defined'); - } - - for (const flatViewFieldToCreate of createdFlatViewField) { - const validationErrors = - await this.flatViewFieldValidatorService.validateFlatViewFieldCreation({ - _existingFlatViewFieldMaps: - validateAndBuildResult.optimisticFlatViewFieldMaps, - flatViewFieldToValidate: flatViewFieldToCreate, - optimisticFlatObjectMetadataMaps: - dependencyOptimisticEntityMaps.object, - optimisticFlatViewMaps: dependencyOptimisticEntityMaps.view, - }); - - if (validationErrors.viewFieldLevelErrors.length > 0) { - validateAndBuildResult.failed.push(validationErrors); - continue; - } - - validateAndBuildResult.optimisticFlatViewFieldMaps = - addFlatEntityToFlatEntityMapsOrThrow({ - flatEntity: flatViewFieldToCreate, - flatEntityMaps: validateAndBuildResult.optimisticFlatViewFieldMaps, - }); - - const createViewFieldAction = - getWorkspaceMigrationV2ViewFieldCreateAction({ - flatViewField: flatViewFieldToCreate, - }); - - validateAndBuildResult.created.push(createViewFieldAction); - } - - for (const flatViewFieldToDelete of buildOptions.inferDeletionFromMissingEntities - ? deletedFlatViewField - : []) { - const validationErrors = - this.flatViewFieldValidatorService.validateFlatViewFieldDeletion({ - existingFlatViewFieldMaps: - validateAndBuildResult.optimisticFlatViewFieldMaps, - viewFieldIdToDelete: flatViewFieldToDelete.id, - optimisticFlatViewMaps: dependencyOptimisticEntityMaps.view, - }); - - if (validationErrors.viewFieldLevelErrors.length > 0) { - validateAndBuildResult.failed.push(validationErrors); - continue; - } - - validateAndBuildResult.optimisticFlatViewFieldMaps = - deleteFlatEntityFromFlatEntityMapsOrThrow({ - entityToDeleteId: flatViewFieldToDelete.id, - flatEntityMaps: validateAndBuildResult.optimisticFlatViewFieldMaps, - }); - - const deleteViewFieldAction = - getWorkspaceMigrationV2ViewFieldDeleteAction(flatViewFieldToDelete); - - validateAndBuildResult.deleted.push(deleteViewFieldAction); - } - - for (const { - from: fromFlatViewField, - to: toFlatViewField, - } of updatedFlatViewField) { - const viewFieldUpdatedProperties = compareTwoFlatViewField({ - fromFlatViewField, - toFlatViewField, + const validationResult = + await this.flatViewFieldValidatorService.validateFlatViewFieldCreation({ + dependencyOptimisticFlatEntityMaps, + flatViewFieldToValidate, + optimisticFlatViewFieldMaps, }); - if (viewFieldUpdatedProperties.length === 0) { - continue; - } - - const validationErrors = - this.flatViewFieldValidatorService.validateFlatViewFieldUpdate({ - existingFlatViewFieldMaps: - validateAndBuildResult.optimisticFlatViewFieldMaps, - updatedFlatViewField: toFlatViewField, - optimisticFlatViewMaps: dependencyOptimisticEntityMaps.view, - }); - - if (validationErrors.viewFieldLevelErrors.length > 0) { - validateAndBuildResult.failed.push(validationErrors); - continue; - } - - validateAndBuildResult.optimisticFlatViewFieldMaps = - replaceFlatEntityInFlatEntityMapsOrThrow({ - flatEntity: toFlatViewField, - flatEntityMaps: validateAndBuildResult.optimisticFlatViewFieldMaps, - }); - - const updateViewFieldAction: UpdateViewFieldAction = { - type: 'update_view_field', - viewFieldId: toFlatViewField.id, - updates: viewFieldUpdatedProperties, + if (validationResult.errors.length > 0) { + return { + status: 'fail', + ...validationResult, }; - - validateAndBuildResult.updated.push(updateViewFieldAction); } - return validateAndBuildResult; + return { + status: 'success', + action: getWorkspaceMigrationV2ViewFieldCreateAction( + flatViewFieldToValidate, + ), + }; + } + + protected async validateFlatEntityDeletion({ + dependencyOptimisticFlatEntityMaps, + flatEntityToValidate: flatViewFieldToValidate, + optimisticFlatEntityMaps: optimisticFlatViewFieldMaps, + }: FlatEntityValidationArgs< + FlatViewField, + ViewFieldRelatedFlatEntityMaps + >): Promise< + FlatEntityValidationReturnType< + WorkspaceMigrationViewFieldActionV2, + FlatViewField + > + > { + const validationResult = + this.flatViewFieldValidatorService.validateFlatViewFieldDeletion({ + dependencyOptimisticFlatEntityMaps, + flatViewFieldToValidate, + optimisticFlatViewFieldMaps, + }); + + if (validationResult.errors.length > 0) { + return { + status: 'fail', + ...validationResult, + }; + } + + return { + status: 'success', + action: getWorkspaceMigrationV2ViewFieldDeleteAction( + flatViewFieldToValidate, + ), + }; + } + + protected async validateFlatEntityUpdate({ + dependencyOptimisticFlatEntityMaps, + flatEntityUpdate: { from: fromFlatViewField, to: toFlatViewField }, + optimisticFlatEntityMaps: optimisticFlatViewFieldMaps, + }: FlatEntityUpdateValidationArgs< + FlatViewField, + ViewFieldRelatedFlatEntityMaps + >): Promise< + | FlatEntityValidationReturnType< + WorkspaceMigrationViewFieldActionV2, + FlatViewField + > + | undefined + > { + const viewFieldUpdatedProperties = compareTwoFlatViewField({ + fromFlatViewField, + toFlatViewField, + }); + + if (viewFieldUpdatedProperties.length === 0) { + return undefined; + } + + const validationResult = + this.flatViewFieldValidatorService.validateFlatViewFieldUpdate({ + dependencyOptimisticFlatEntityMaps, + flatViewFieldToValidate: toFlatViewField, + optimisticFlatViewFieldMaps, + }); + + if (validationResult.errors.length > 0) { + return { + status: 'fail', + ...validationResult, + }; + } + + const updateViewFieldAction: UpdateViewFieldAction = { + type: 'update_view_field', + viewFieldId: toFlatViewField.id, + updates: viewFieldUpdatedProperties, + }; + + return { + status: 'success', + action: updateViewFieldAction, + }; } } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service.ts index bbd92f4318..7ae45ec2b4 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service.ts @@ -1,19 +1,14 @@ import { Injectable } from '@nestjs/common'; -import { FromTo } from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; - -import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; -import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util'; -import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util'; -import { FailedFlatViewValidation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-validation.type'; -import { FlatViewMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-maps.type'; +import { AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type'; import { FlatView } from 'src/engine/core-modules/view/flat-view/types/flat-view.type'; import { compareTwoFlatView } from 'src/engine/core-modules/view/flat-view/utils/compare-two-flat-view.util'; -import { WorkspaceMigrationOrchestratorOptimisticEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; -import { type CustomDeletedCreatedUpdatedMatrix } from 'src/engine/workspace-manager/workspace-migration-v2/utils/deleted-created-updated-matrix-dispatcher.util'; -import { WorkspaceViewMigrationV2BuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-migration-builder-v2.service'; -import { WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; +import { + FlatEntityUpdateValidationArgs, + FlatEntityValidationArgs, + FlatEntityValidationReturnType, + WorkspaceEntityMigrationBuilderV2Service, +} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service'; import { UpdateViewAction, WorkspaceMigrationViewActionV2, @@ -24,142 +19,120 @@ import { } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-action'; import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service'; -export type CreatedDeletedUpdatedViewInputMatrix = FromTo< - FlatViewMaps, - 'FlatViewMaps' -> & - CustomDeletedCreatedUpdatedMatrix<'flatView', FlatView> & { - buildOptions: WorkspaceViewMigrationV2BuilderOptions; - fromFlatViewMaps: FlatViewMaps; - dependencyOptimisticEntityMaps: WorkspaceMigrationOrchestratorOptimisticEntityMaps; - }; - -type ValidateAndBuildViewResult = { - failed: FailedFlatViewValidation[]; - created: T[]; - deleted: T[]; - updated: T[]; - optimisticFlatViewMaps: FlatViewMaps; -}; - +export type ViewRelatedFlatEntityMaps = Pick< + AllFlatEntityMaps, + 'flatObjectMetadataMaps' + // 'flatFieldMetadataMaps' TODO implement once with extract field from object diffing +>; @Injectable() -export class WorkspaceMigrationV2ViewActionsBuilderService { +export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service< + FlatView, + WorkspaceMigrationViewActionV2, + ViewRelatedFlatEntityMaps +> { constructor( private readonly flatViewValidatorService: FlatViewValidatorService, - ) {} + ) { + super(); + } - public async validateAndBuildViewActions({ - createdFlatView, - deletedFlatView, - updatedFlatView, - buildOptions, - fromFlatViewMaps, - dependencyOptimisticEntityMaps, - }: CreatedDeletedUpdatedViewInputMatrix): Promise< - ValidateAndBuildViewResult + protected async validateFlatEntityCreation({ + dependencyOptimisticFlatEntityMaps, + flatEntityToValidate: flatViewToValidate, + optimisticFlatEntityMaps: optimisticFlatViewMaps, + }: FlatEntityValidationArgs): Promise< + FlatEntityValidationReturnType > { - const validateAndBuildResult: ValidateAndBuildViewResult = - { - failed: [], - created: [], - deleted: [], - updated: [], - optimisticFlatViewMaps: structuredClone(fromFlatViewMaps), - }; - - if (!isDefined(dependencyOptimisticEntityMaps.object)) { - throw new Error('Dependency optimistic entity maps are not defined'); - } - - for (const flatViewToCreate of createdFlatView) { - const validationErrors = - await this.flatViewValidatorService.validateFlatViewCreation({ - _existingFlatViewMaps: validateAndBuildResult.optimisticFlatViewMaps, - flatViewToValidate: flatViewToCreate, - optimisticFlatObjectMetadataMaps: - dependencyOptimisticEntityMaps.object, - }); - - if (validationErrors.viewLevelErrors.length > 0) { - validateAndBuildResult.failed.push(validationErrors); - continue; - } - - validateAndBuildResult.optimisticFlatViewMaps = - addFlatEntityToFlatEntityMapsOrThrow({ - flatEntity: flatViewToCreate, - flatEntityMaps: validateAndBuildResult.optimisticFlatViewMaps, - }); - - const createViewAction = getWorkspaceMigrationV2ViewCreateAction({ - flatView: flatViewToCreate, + const validationResult = + await this.flatViewValidatorService.validateFlatViewCreation({ + dependencyOptimisticFlatEntityMaps, + flatViewToValidate, + optimisticFlatViewMaps, }); - validateAndBuildResult.created.push(createViewAction); + if (validationResult.errors.length > 0) { + return { + status: 'fail', + ...validationResult, + }; } - for (const flatViewToDelete of buildOptions.inferDeletionFromMissingEntities - ? deletedFlatView - : []) { - const validationErrors = - this.flatViewValidatorService.validateFlatViewDeletion({ - existingFlatViewMaps: validateAndBuildResult.optimisticFlatViewMaps, - viewIdToDelete: flatViewToDelete.id, - }); + return { + status: 'success', + action: getWorkspaceMigrationV2ViewCreateAction(flatViewToValidate), + }; + } - if (validationErrors.viewLevelErrors.length > 0) { - validateAndBuildResult.failed.push(validationErrors); - continue; - } - - validateAndBuildResult.optimisticFlatViewMaps = - deleteFlatEntityFromFlatEntityMapsOrThrow({ - entityToDeleteId: flatViewToDelete.id, - flatEntityMaps: validateAndBuildResult.optimisticFlatViewMaps, - }); - - const deleteViewAction = - getWorkspaceMigrationV2ViewDeleteAction(flatViewToDelete); - - validateAndBuildResult.deleted.push(deleteViewAction); - } - - for (const { from: fromFlatView, to: toFlatView } of updatedFlatView) { - const viewUpdatedProperties = compareTwoFlatView({ - fromFlatView, - toFlatView, + protected async validateFlatEntityDeletion({ + dependencyOptimisticFlatEntityMaps, + flatEntityToValidate: flatViewToValidate, + optimisticFlatEntityMaps: optimisticFlatViewMaps, + }: FlatEntityValidationArgs): Promise< + FlatEntityValidationReturnType + > { + const validationResult = + this.flatViewValidatorService.validateFlatViewDeletion({ + dependencyOptimisticFlatEntityMaps, + flatViewToValidate, + optimisticFlatViewMaps, }); - if (viewUpdatedProperties.length === 0) { - continue; - } - - const validationErrors = - this.flatViewValidatorService.validateFlatViewUpdate({ - existingFlatViewMaps: validateAndBuildResult.optimisticFlatViewMaps, - updatedFlatView: toFlatView, - }); - - if (validationErrors.viewLevelErrors.length > 0) { - validateAndBuildResult.failed.push(validationErrors); - continue; - } - - validateAndBuildResult.optimisticFlatViewMaps = - replaceFlatEntityInFlatEntityMapsOrThrow({ - flatEntity: toFlatView, - flatEntityMaps: validateAndBuildResult.optimisticFlatViewMaps, - }); - - const updateViewAction: UpdateViewAction = { - type: 'update_view', - viewId: toFlatView.id, - updates: viewUpdatedProperties, + if (validationResult.errors.length > 0) { + return { + status: 'fail', + ...validationResult, }; - - validateAndBuildResult.updated.push(updateViewAction); } - return validateAndBuildResult; + return { + status: 'success', + action: getWorkspaceMigrationV2ViewDeleteAction(flatViewToValidate), + }; + } + + protected async validateFlatEntityUpdate({ + dependencyOptimisticFlatEntityMaps, + flatEntityUpdate: { from: fromFlatView, to: toFlatView }, + optimisticFlatEntityMaps: optimisticFlatViewMaps, + }: FlatEntityUpdateValidationArgs< + FlatView, + ViewRelatedFlatEntityMaps + >): Promise< + | FlatEntityValidationReturnType + | undefined + > { + const viewUpdatedProperties = compareTwoFlatView({ + fromFlatView, + toFlatView, + }); + + if (viewUpdatedProperties.length === 0) { + return undefined; + } + + const validationResult = + this.flatViewValidatorService.validateFlatViewUpdate({ + dependencyOptimisticFlatEntityMaps, + flatViewToValidate: toFlatView, + optimisticFlatViewMaps, + }); + + if (validationResult.errors.length > 0) { + return { + status: 'fail', + ...validationResult, + }; + } + + const updateViewAction: UpdateViewAction = { + type: 'update_view', + viewId: toFlatView.id, + updates: viewUpdatedProperties, + }; + + return { + status: 'success', + action: updateViewAction, + }; } } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service.ts index 175ba6057b..05a905f701 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service.ts @@ -1,102 +1,229 @@ import { type FromTo } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; +import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type'; import { type FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type'; import { type FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type'; -import { deletedCreatedUpdatedMatrixDispatcher } from 'src/engine/workspace-manager/workspace-migration-v2/utils/deleted-created-updated-matrix-dispatcher.util'; +import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/add-flat-entity-to-flat-entity-maps-or-throw.util'; +import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util'; +import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util'; +import { + type DeletedCreatedUpdatedMatrix, + deletedCreatedUpdatedMatrixDispatcher, +} from 'src/engine/workspace-manager/workspace-migration-v2/utils/deleted-created-updated-matrix-dispatcher.util'; +import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; +import { type WorkspaceMigrationV2BuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service'; import { type WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; -import { type WorkspaceMigrationV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-v2'; -export type SuccessfulEntityMigrationBuildResult = { +export type SuccessfulEntityMigrationBuildResult< + TActions extends WorkspaceMigrationActionV2, + TFlatEntity extends FlatEntity, +> = { status: 'success'; - workspaceMigration: WorkspaceMigrationV2; - optimisticFlatEntityMaps: TFlatEntityMaps; + actions: TActions[]; + optimisticFlatEntityMaps: FlatEntityMaps; }; -export type FailedEntityMigrationBuildResult = { +export type FailedEntityMigrationBuildResult = { status: 'fail'; - errors: TFailedValidation[]; + errors: FailedFlatEntityValidation[]; + optimisticFlatEntityMaps: FlatEntityMaps; }; +export type ValidateAndBuildArgs< + T extends FlatEntity, + TRelatedFlatEntityMaps extends Partial, +> = { + buildOptions: WorkspaceMigrationV2BuilderOptions; + dependencyOptimisticFlatEntityMaps: TRelatedFlatEntityMaps; +} & FromTo>; + +export type ValidateAndBuildReturnType< + TActions extends WorkspaceMigrationActionV2, + TFlatEntity extends FlatEntity, +> = + | SuccessfulEntityMigrationBuildResult + | FailedEntityMigrationBuildResult; + +export type ValidateAndBuildActionsArgs< + T extends FlatEntity, + TRelatedFlatEntityMaps extends Partial, +> = ValidateAndBuildArgs & + DeletedCreatedUpdatedMatrix; + +export type ValidateAndBuilActionsReturnType< + TFlatEntity extends FlatEntity, + TActions extends WorkspaceMigrationActionV2, +> = { + failed: FailedFlatEntityValidation[]; + created: TActions[]; + deleted: TActions[]; + updated: TActions[]; +}; + +export type FlatEntityValidationArgs< + TFlatEntity extends FlatEntity, + TRelatedFlatEntityMaps extends Partial, +> = { + flatEntityToValidate: TFlatEntity; + optimisticFlatEntityMaps: FlatEntityMaps; + dependencyOptimisticFlatEntityMaps: TRelatedFlatEntityMaps; +}; + +export type FlatEntityUpdateValidationArgs< + TFlatEntity extends FlatEntity, + TRelatedFlatEntityMaps extends Partial, +> = Omit< + FlatEntityValidationArgs, + 'flatEntityToValidate' +> & { + flatEntityUpdate: FromTo; +}; + +export type FlatEntityValidationReturnType< + TActions extends WorkspaceMigrationActionV2, + TFlatEntity extends FlatEntity, +> = + | { + status: 'success'; + action: TActions; + } + | ({ + status: 'fail'; + } & FailedFlatEntityValidation); + export abstract class WorkspaceEntityMigrationBuilderV2Service< - TFlatEntityMaps extends FlatEntityMaps, TFlatEntity extends FlatEntity, - TFailedValidation, - TActionType extends WorkspaceMigrationActionV2, - TBuildArgs extends { workspaceId: string } & FromTo, + TActions extends WorkspaceMigrationActionV2, + TRelatedFlatEntityMaps extends Partial, > { - public async validateAndBuild( - args: TBuildArgs, - ): Promise< - | SuccessfulEntityMigrationBuildResult - | FailedEntityMigrationBuildResult + public async validateAndBuild({ + buildOptions, + dependencyOptimisticFlatEntityMaps, + from: fromFlatEntityMaps, + to: toFlatEntityMaps, + }: ValidateAndBuildArgs): Promise< + ValidateAndBuildReturnType > { - const { from: fromEntityMaps, to: toEntityMaps } = - this.extractFromToEntityMaps(args); - - const fromEntities = Object.values(fromEntityMaps.byId).filter(isDefined); - const toEntities = Object.values(toEntityMaps.byId).filter(isDefined); + const fromFlatEntities = Object.values(fromFlatEntityMaps.byId).filter( + isDefined, + ); + const toFlatEntities = Object.values(toFlatEntityMaps.byId).filter( + isDefined, + ); const { created, deleted, updated } = deletedCreatedUpdatedMatrixDispatcher( { - from: fromEntities, - to: toEntities, + from: fromFlatEntities, + to: toFlatEntities, }, ); + let optimisticFlatEntityMaps = structuredClone(fromFlatEntityMaps); - const result = await this.validateAndBuildActions({ - ...args, - created, - updated, - deleted, - }); + const validateAndBuildResult: ValidateAndBuilActionsReturnType< + TFlatEntity, + TActions + > = { + failed: [], + created: [], + deleted: [], + updated: [], + }; - if (result.failed.length > 0) { + for (const flatEntityToCreate of created) { + const validationResult = await this.validateFlatEntityCreation({ + dependencyOptimisticFlatEntityMaps, + flatEntityToValidate: flatEntityToCreate, + optimisticFlatEntityMaps, + }); + + if (validationResult.status === 'fail') { + validateAndBuildResult.failed.push(validationResult); + continue; + } + + optimisticFlatEntityMaps = addFlatEntityToFlatEntityMapsOrThrow({ + flatEntity: flatEntityToCreate, + flatEntityMaps: optimisticFlatEntityMaps, + }); + + validateAndBuildResult.created.push(validationResult.action); + } + + for (const flatEntityToDelete of buildOptions.inferDeletionFromMissingEntities + ? deleted + : []) { + const validationResult = await this.validateFlatEntityDeletion({ + dependencyOptimisticFlatEntityMaps, + flatEntityToValidate: flatEntityToDelete, + optimisticFlatEntityMaps: optimisticFlatEntityMaps, + }); + + if (validationResult.status === 'fail') { + validateAndBuildResult.failed.push(validationResult); + continue; + } + + optimisticFlatEntityMaps = deleteFlatEntityFromFlatEntityMapsOrThrow({ + entityToDeleteId: flatEntityToDelete.id, + flatEntityMaps: optimisticFlatEntityMaps, + }); + + validateAndBuildResult.deleted.push(validationResult.action); + } + + for (const flatEntityUpdate of updated) { + const validationResult = await this.validateFlatEntityUpdate({ + dependencyOptimisticFlatEntityMaps, + flatEntityUpdate, + optimisticFlatEntityMaps: optimisticFlatEntityMaps, + }); + + if (validationResult === undefined) { + continue; + } + + if (validationResult.status === 'fail') { + validateAndBuildResult.failed.push(validationResult); + continue; + } + + optimisticFlatEntityMaps = replaceFlatEntityInFlatEntityMapsOrThrow({ + flatEntity: flatEntityUpdate.to, + flatEntityMaps: optimisticFlatEntityMaps, + }); + + validateAndBuildResult.updated.push(validationResult.action); + } + + if (validateAndBuildResult.failed.length > 0) { return { status: 'fail', - errors: result.failed, + errors: validateAndBuildResult.failed, + optimisticFlatEntityMaps, }; } return { status: 'success', - workspaceMigration: { - workspaceId: args.workspaceId, - actions: [...result.deleted, ...result.created, ...result.updated], - }, - optimisticFlatEntityMaps: result.optimisticMaps, + actions: [ + ...validateAndBuildResult.deleted, + ...validateAndBuildResult.created, + ...validateAndBuildResult.updated, + ], + optimisticFlatEntityMaps, }; } - // TODO: Refactor, this is too hacky - private extractFromToEntityMaps(args: TBuildArgs): { - from: TFlatEntityMaps; - to: TFlatEntityMaps; - } { - const fromKey = Object.keys(args).find((key) => - key.startsWith('from'), - ) as keyof TBuildArgs; - const toKey = Object.keys(args).find((key) => - key.startsWith('to'), - ) as keyof TBuildArgs; + protected abstract validateFlatEntityCreation( + args: FlatEntityValidationArgs, + ): Promise>; - return { - from: args[fromKey] as TFlatEntityMaps, - to: args[toKey] as TFlatEntityMaps, - }; - } + protected abstract validateFlatEntityDeletion( + args: FlatEntityValidationArgs, + ): Promise>; - protected abstract validateAndBuildActions( - args: TBuildArgs & { - created: TFlatEntity[]; - updated: { from: TFlatEntity; to: TFlatEntity }[]; - deleted: TFlatEntity[]; - }, - ): Promise<{ - failed: TFailedValidation[]; - created: TActionType[]; - deleted: TActionType[]; - updated: TActionType[]; - optimisticMaps: TFlatEntityMaps; - }>; + protected abstract validateFlatEntityUpdate( + args: FlatEntityUpdateValidationArgs, + ): Promise | undefined>; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service.ts index 1a1d65dd37..e444774a49 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service.ts @@ -2,14 +2,14 @@ import { Injectable } from '@nestjs/common'; import { type FromTo } from 'twenty-shared/types'; -import { FailedFlatFieldMetadataValidation } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type'; +import { FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type'; import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; -import { FailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type'; import { fromFlatObjectMetadataMapsToFlatObjectMetadatas } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadata-maps-to-flat-object-metadatas.util'; import { deletedCreatedUpdatedMatrixDispatcher } from 'src/engine/workspace-manager/workspace-migration-v2/utils/deleted-created-updated-matrix-dispatcher.util'; import { WorkspaceMigrationV2FieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/services/workspace-migration-v2-field-actions-builder.service'; import { buildWorkspaceMigrationIndexActions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/index/workspace-migration-v2-index-actions-builder'; import { WorkspaceMigrationV2ObjectActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/services/workspace-migration-v2-object-actions-builder.service'; +import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; import { WorkspaceMigrationV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-v2'; import { computeUpdatedObjectMetadataDeletedCreatedUpdatedFieldMatrix } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/compute-updated-object-metadata-deleted-created-updated-field-matrix.util'; import { computeUpdatedObjectMetadataDeletedCreatedUpdatedIndexMatrix } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/compute-updated-object-metadata-deleted-created-updated-index-matrix.util'; @@ -20,24 +20,23 @@ export type WorkspaceMigrationV2BuilderOptions = { isSystemBuild: boolean; }; -type SuccessfulWorkspaceMigrationBuildResult = { +export type SuccessfulWorkspaceMigrationBuildResult = { status: 'success'; workspaceMigration: WorkspaceMigrationV2; - optimisticFlatEntityMaps: FlatObjectMetadataMaps; + optimisticFlatObjectMetadataMaps: FlatObjectMetadataMaps; }; export type FailedWorkspaceMigrationBuildResult = { status: 'fail'; - errors: ( - | FailedFlatObjectMetadataValidation - | FailedFlatFieldMetadataValidation - )[]; + optimisticFlatObjectMetadataMaps: FlatObjectMetadataMaps; + errors: FailedFlatEntityValidation[]; }; export type WorkspaceMigrationBuildArgs = { workspaceId: string; buildOptions: WorkspaceMigrationV2BuilderOptions; } & FromTo; +// TODO deprecate this file @Injectable() export class WorkspaceMigrationBuilderV2Service { constructor( @@ -130,6 +129,8 @@ export class WorkspaceMigrationBuilderV2Service { return { status: 'fail', errors: allValidateAndBuildResultFailures, + optimisticFlatObjectMetadataMaps: + fieldActionsValidateAndBuildResult.optimisticFlatObjectMetadataMaps, }; } @@ -148,7 +149,7 @@ export class WorkspaceMigrationBuilderV2Service { ...indexWorkspaceMigrationActions, // Should be handled separately from objects ], }, - optimisticFlatEntityMaps: + optimisticFlatObjectMetadataMaps: fieldActionsValidateAndBuildResult.optimisticFlatObjectMetadataMaps, }; } diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-field-migration-builder-v2.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-field-migration-builder-v2.service.ts deleted file mode 100644 index 29a6059ee7..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-field-migration-builder-v2.service.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { type FromTo } from 'twenty-shared/types'; - -import { FailedFlatViewFieldValidation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation.type'; -import { FlatViewFieldMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-field-maps.type'; -import { FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type'; -import { WorkspaceMigrationOrchestratorOptimisticEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; -import { WorkspaceMigrationV2ViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service'; -import { - FailedEntityMigrationBuildResult, - WorkspaceEntityMigrationBuilderV2Service, -} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service'; -import { WorkspaceMigrationViewFieldActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type'; - -export type WorkspaceViewFieldMigrationV2BuilderOptions = { - isSystemBuild: boolean; - inferDeletionFromMissingEntities: boolean; -}; - -export type FailedWorkspaceViewFieldMigrationBuildResult = - FailedEntityMigrationBuildResult; - -export type WorkspaceViewFieldMigrationBuildArgs = { - workspaceId: string; - buildOptions: WorkspaceViewFieldMigrationV2BuilderOptions; - dependencyOptimisticEntityMaps: WorkspaceMigrationOrchestratorOptimisticEntityMaps; -} & FromTo; - -@Injectable() -export class WorkspaceViewFieldMigrationBuilderV2Service extends WorkspaceEntityMigrationBuilderV2Service< - FlatViewFieldMaps, - FlatViewField, - FailedFlatViewFieldValidation, - WorkspaceMigrationViewFieldActionV2, - WorkspaceViewFieldMigrationBuildArgs -> { - constructor( - private readonly workspaceMigrationV2ViewFieldActionsBuilderService: WorkspaceMigrationV2ViewFieldActionsBuilderService, - ) { - super(); - } - - protected async validateAndBuildActions( - args: WorkspaceViewFieldMigrationBuildArgs & { - created: FlatViewField[]; - updated: { from: FlatViewField; to: FlatViewField }[]; - deleted: FlatViewField[]; - }, - ): Promise<{ - failed: FailedFlatViewFieldValidation[]; - created: WorkspaceMigrationViewFieldActionV2[]; - deleted: WorkspaceMigrationViewFieldActionV2[]; - updated: WorkspaceMigrationViewFieldActionV2[]; - optimisticMaps: FlatViewFieldMaps; - }> { - const viewFieldActionsValidateAndBuildResult = - await this.workspaceMigrationV2ViewFieldActionsBuilderService.validateAndBuildViewFieldActions( - { - fromFlatViewFieldMaps: args.fromFlatViewFieldMaps, - toFlatViewFieldMaps: args.toFlatViewFieldMaps, - createdFlatViewField: args.created, - updatedFlatViewField: args.updated, - deletedFlatViewField: args.deleted, - buildOptions: args.buildOptions, - dependencyOptimisticEntityMaps: args.dependencyOptimisticEntityMaps, - }, - ); - - return { - failed: viewFieldActionsValidateAndBuildResult.failed, - created: viewFieldActionsValidateAndBuildResult.created, - deleted: viewFieldActionsValidateAndBuildResult.deleted, - updated: viewFieldActionsValidateAndBuildResult.updated, - optimisticMaps: - viewFieldActionsValidateAndBuildResult.optimisticFlatViewFieldMaps, - }; - } -} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-migration-builder-v2.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-migration-builder-v2.service.ts deleted file mode 100644 index 58930c75f1..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-migration-builder-v2.service.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -import { type FromTo } from 'twenty-shared/types'; - -import { FailedFlatViewValidation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-validation.type'; -import { FlatViewMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-maps.type'; -import { FlatView } from 'src/engine/core-modules/view/flat-view/types/flat-view.type'; -import { WorkspaceMigrationOrchestratorOptimisticEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type'; -import { WorkspaceMigrationV2ViewActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service'; -import { - FailedEntityMigrationBuildResult, - WorkspaceEntityMigrationBuilderV2Service, -} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service'; -import { WorkspaceMigrationViewActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type'; - -export type WorkspaceViewMigrationV2BuilderOptions = { - isSystemBuild: boolean; - inferDeletionFromMissingEntities: boolean; -}; - -export type FailedWorkspaceViewMigrationBuildResult = - FailedEntityMigrationBuildResult; - -export type WorkspaceViewMigrationBuildArgs = { - workspaceId: string; - buildOptions: WorkspaceViewMigrationV2BuilderOptions; - dependencyOptimisticEntityMaps: WorkspaceMigrationOrchestratorOptimisticEntityMaps; -} & FromTo; - -@Injectable() -export class WorkspaceViewMigrationBuilderV2Service extends WorkspaceEntityMigrationBuilderV2Service< - FlatViewMaps, - FlatView, - FailedFlatViewValidation, - WorkspaceMigrationViewActionV2, - WorkspaceViewMigrationBuildArgs -> { - constructor( - private readonly workspaceMigrationV2ViewActionsBuilderService: WorkspaceMigrationV2ViewActionsBuilderService, - ) { - super(); - } - - protected async validateAndBuildActions( - args: WorkspaceViewMigrationBuildArgs & { - created: FlatView[]; - updated: { from: FlatView; to: FlatView }[]; - deleted: FlatView[]; - }, - ): Promise<{ - failed: FailedFlatViewValidation[]; - created: WorkspaceMigrationViewActionV2[]; - deleted: WorkspaceMigrationViewActionV2[]; - updated: WorkspaceMigrationViewActionV2[]; - optimisticMaps: FlatViewMaps; - }> { - const viewActionsValidateAndBuildResult = - await this.workspaceMigrationV2ViewActionsBuilderService.validateAndBuildViewActions( - { - fromFlatViewMaps: args.fromFlatViewMaps, - toFlatViewMaps: args.toFlatViewMaps, - createdFlatView: args.created, - updatedFlatView: args.updated, - deletedFlatView: args.deleted, - buildOptions: args.buildOptions, - dependencyOptimisticEntityMaps: args.dependencyOptimisticEntityMaps, - }, - ); - - return { - failed: viewActionsValidateAndBuildResult.failed, - created: viewActionsValidateAndBuildResult.created, - deleted: viewActionsValidateAndBuildResult.deleted, - updated: viewActionsValidateAndBuildResult.updated, - optimisticMaps: viewActionsValidateAndBuildResult.optimisticFlatViewMaps, - }; - } -} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/validate-and-build-metadata-result.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/validate-and-build-metadata-result.type.ts index db7c0880df..ce3e4e621c 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/validate-and-build-metadata-result.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/validate-and-build-metadata-result.type.ts @@ -1,15 +1,12 @@ -import { type FailedFlatFieldMetadataValidation } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type'; +import { type FlatEntity } from 'src/engine/core-modules/common/types/flat-entity.type'; import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; -import { type FailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/flat-object-metadata/types/failed-flat-object-metadata-validation.type'; +import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; import { type WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; export type ValidateAndBuildMetadataResult< T extends WorkspaceMigrationActionV2, > = { - failed: ( - | FailedFlatFieldMetadataValidation - | FailedFlatObjectMetadataValidation - )[]; + failed: FailedFlatEntityValidation[]; created: T[]; deleted: T[]; updated: T[]; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/validate-and-build-view-result.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/validate-and-build-view-result.type.ts deleted file mode 100644 index df53c0fbf1..0000000000 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/validate-and-build-view-result.type.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { type FailedFlatViewValidation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-validation.type'; -import { type FlatViewMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-maps.type'; -import { type WorkspaceMigrationActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-action-common-v2'; - -export type ValidateAndBuildViewResult = { - failed: FailedFlatViewValidation[]; - created: T[]; - deleted: T[]; - updated: T[]; - optimisticFlatViewMaps: FlatViewMaps; -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-action.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-action.ts index cc98ae1095..7b3cc1f8a1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-action.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-action.ts @@ -4,11 +4,9 @@ import { type DeleteViewAction, } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type'; -export const getWorkspaceMigrationV2ViewCreateAction = ({ - flatView, -}: { - flatView: FlatView; -}): CreateViewAction => ({ +export const getWorkspaceMigrationV2ViewCreateAction = ( + flatView: FlatView, +): CreateViewAction => ({ type: 'create_view', view: flatView, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-field-action.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-field-action.ts index 949ebcd59b..3011fd99d1 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-field-action.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/get-workspace-migration-v2-view-field-action.ts @@ -4,11 +4,9 @@ import { type DeleteViewFieldAction, } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type'; -export const getWorkspaceMigrationV2ViewFieldCreateAction = ({ - flatViewField, -}: { - flatViewField: FlatViewField; -}): CreateViewFieldAction => ({ +export const getWorkspaceMigrationV2ViewFieldCreateAction = ( + flatViewField: FlatViewField, +): CreateViewFieldAction => ({ type: 'create_view_field', viewField: flatViewField, }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service.ts index 605b725fd5..5924a858d0 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service.ts @@ -4,54 +4,43 @@ import { t } from '@lingui/core/macro'; import { isDefined } from 'twenty-shared/utils'; import { ViewExceptionCode } from 'src/engine/core-modules/view/exceptions/view.exception'; -import { FailedFlatViewFieldValidation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-field-validation.type'; import { FlatViewFieldMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-field-maps.type'; import { FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type'; -import { FlatViewMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-maps.type'; -import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; import { findFlatFieldMetadataInFlatObjectMetadataMapsWithOnlyFieldId } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-field-metadata-in-flat-object-metadata-maps-with-field-id-only.util'; +import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; +import { ViewFieldRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service'; +type ViewFieldValidationArgs = { + flatViewFieldToValidate: FlatViewField; + optimisticFlatViewFieldMaps: FlatViewFieldMaps; + dependencyOptimisticFlatEntityMaps: ViewFieldRelatedFlatEntityMaps; +}; @Injectable() export class FlatViewFieldValidatorService { constructor() {} + // Should implement strict checking on field compared field and their integrity passing the update array would be the best public validateFlatViewFieldUpdate({ - existingFlatViewFieldMaps, - updatedFlatViewField, - optimisticFlatViewMaps, - }: { - existingFlatViewFieldMaps: FlatViewFieldMaps; - updatedFlatViewField: FlatViewField; - optimisticFlatViewMaps: FlatViewMaps; - }): FailedFlatViewFieldValidation { + flatViewFieldToValidate: updatedFlatViewField, + optimisticFlatViewFieldMaps, + }: ViewFieldValidationArgs): FailedFlatEntityValidation { const errors = []; - const optimisticFlatView = - optimisticFlatViewMaps.byId[updatedFlatViewField.viewId]; - - if (!isDefined(optimisticFlatView)) { - errors.push({ - code: ViewExceptionCode.INVALID_VIEW_DATA, - message: t`View not found`, - userFriendlyMessage: t`View not found`, - }); - } - const existingFlatViewField = - existingFlatViewFieldMaps.byId[updatedFlatViewField.id]; + optimisticFlatViewFieldMaps.byId[updatedFlatViewField.id]; if (!isDefined(existingFlatViewField)) { errors.push({ code: ViewExceptionCode.INVALID_VIEW_DATA, - message: t`View field not found`, - userFriendlyMessage: t`View field not found`, + message: t`View field to update not found`, + userFriendlyMessage: t`View field to update not found`, }); } return { type: 'update_view_field', - viewFieldLevelErrors: errors, - failedViewFieldValidationMinimalInformation: { + errors, + flatEntityMinimalInformation: { id: updatedFlatViewField.id, viewId: updatedFlatViewField.viewId, fieldMetadataId: updatedFlatViewField.fieldMetadataId, @@ -60,59 +49,65 @@ export class FlatViewFieldValidatorService { } public validateFlatViewFieldDeletion({ - existingFlatViewFieldMaps, - viewFieldIdToDelete, - optimisticFlatViewMaps, - }: { - existingFlatViewFieldMaps: FlatViewFieldMaps; - viewFieldIdToDelete: string; - optimisticFlatViewMaps: FlatViewMaps; - }): FailedFlatViewFieldValidation { + optimisticFlatViewFieldMaps, + flatViewFieldToValidate: { id: viewFieldIdToDelete }, + }: ViewFieldValidationArgs): FailedFlatEntityValidation { const errors = []; - const optimisticFlatView = optimisticFlatViewMaps.byId[viewFieldIdToDelete]; - - if (!isDefined(optimisticFlatView)) { - errors.push({ - code: ViewExceptionCode.INVALID_VIEW_DATA, - message: t`View not found`, - userFriendlyMessage: t`View not found`, - }); - } - const existingFlatViewField = - existingFlatViewFieldMaps.byId[viewFieldIdToDelete]; + optimisticFlatViewFieldMaps.byId[viewFieldIdToDelete]; if (!isDefined(existingFlatViewField)) { errors.push({ code: ViewExceptionCode.INVALID_VIEW_DATA, - message: t`View field not found`, - userFriendlyMessage: t`View field not found`, + message: t`View field to delete not found`, + userFriendlyMessage: t`View field to delete not found`, }); + } else { + if (!isDefined(existingFlatViewField.deletedAt)) { + errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View field to delete has not been soft deleted`, + userFriendlyMessage: t`View field to delete has not been soft deleted`, + }); + } } return { type: 'delete_view_field', - viewFieldLevelErrors: errors, - failedViewFieldValidationMinimalInformation: { + errors, + flatEntityMinimalInformation: { id: viewFieldIdToDelete, }, }; } public async validateFlatViewFieldCreation({ - _existingFlatViewFieldMaps, flatViewFieldToValidate, - optimisticFlatObjectMetadataMaps, - optimisticFlatViewMaps, + optimisticFlatViewFieldMaps, + dependencyOptimisticFlatEntityMaps: { + flatObjectMetadataMaps: optimisticFlatObjectMetadataMaps, + flatViewMaps: optimisticFlatViewMaps, + }, }: { - _existingFlatViewFieldMaps: FlatViewFieldMaps; flatViewFieldToValidate: FlatViewField; - optimisticFlatObjectMetadataMaps: FlatObjectMetadataMaps; - optimisticFlatViewMaps: FlatViewMaps; - }): Promise { + optimisticFlatViewFieldMaps: FlatViewFieldMaps; + dependencyOptimisticFlatEntityMaps: ViewFieldRelatedFlatEntityMaps; + }): Promise> { const errors = []; + if ( + isDefined(optimisticFlatViewFieldMaps.byId[flatViewFieldToValidate.id]) + ) { + const flatViewFieldId = flatViewFieldToValidate.id; + + errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View field metadata with id ${flatViewFieldId} already exists`, + userFriendlyMessage: t`View field metadata already exists`, + }); + } + const relatedFlatFieldMetadata = findFlatFieldMetadataInFlatObjectMetadataMapsWithOnlyFieldId({ fieldMetadataId: flatViewFieldToValidate.fieldMetadataId, @@ -138,10 +133,28 @@ export class FlatViewFieldValidatorService { }); } + const allFlatViewFields = Object.values( + optimisticFlatViewFieldMaps.byId, + ).filter(isDefined); + const matchingFlatView = allFlatViewFields.find( + (flatViewField) => + flatViewField.viewId === flatViewFieldToValidate.viewId && + flatViewField.fieldMetadataId === + flatViewFieldToValidate.fieldMetadataId, + ); + + if (isDefined(matchingFlatView)) { + errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View field with same fieldmetadataId and viewId already exists`, + userFriendlyMessage: t`View field already exists`, + }); + } + return { type: 'create_view_field', - viewFieldLevelErrors: errors, - failedViewFieldValidationMinimalInformation: { + errors, + flatEntityMinimalInformation: { id: flatViewFieldToValidate.id, viewId: flatViewFieldToValidate.viewId, fieldMetadataId: flatViewFieldToValidate.fieldMetadataId, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service.ts index 805e8945a5..7428d92a19 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service.ts @@ -4,25 +4,27 @@ import { t } from '@lingui/core/macro'; import { isDefined } from 'twenty-shared/utils'; import { ViewExceptionCode } from 'src/engine/core-modules/view/exceptions/view.exception'; -import { FailedFlatViewValidation } from 'src/engine/core-modules/view/flat-view/types/failed-flat-view-validation.type'; import { FlatViewMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-maps.type'; import { FlatView } from 'src/engine/core-modules/view/flat-view/types/flat-view.type'; -import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; +import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type'; +import { ViewRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service'; +type ViewValidationArgs = { + flatViewToValidate: FlatView; + optimisticFlatViewMaps: FlatViewMaps; + dependencyOptimisticFlatEntityMaps: ViewRelatedFlatEntityMaps; +}; @Injectable() export class FlatViewValidatorService { constructor() {} public validateFlatViewUpdate({ - existingFlatViewMaps, - updatedFlatView, - }: { - existingFlatViewMaps: FlatViewMaps; - updatedFlatView: FlatView; - }): FailedFlatViewValidation { + flatViewToValidate: updatedFlatView, + optimisticFlatViewMaps, + }: ViewValidationArgs): FailedFlatEntityValidation { const errors = []; - const existingFlatView = existingFlatViewMaps.byId[updatedFlatView.id]; + const existingFlatView = optimisticFlatViewMaps.byId[updatedFlatView.id]; if (!isDefined(existingFlatView)) { errors.push({ @@ -34,23 +36,20 @@ export class FlatViewValidatorService { return { type: 'update_view', - viewLevelErrors: errors, - failedViewValidationMinimalInformation: { + errors, + flatEntityMinimalInformation: { id: updatedFlatView.id, }, }; } public validateFlatViewDeletion({ - existingFlatViewMaps, - viewIdToDelete, - }: { - existingFlatViewMaps: FlatViewMaps; - viewIdToDelete: string; - }): FailedFlatViewValidation { + flatViewToValidate: { id: viewIdToDelete }, + optimisticFlatViewMaps, + }: ViewValidationArgs): FailedFlatEntityValidation { const errors = []; - const existingFlatView = existingFlatViewMaps.byId[viewIdToDelete]; + const existingFlatView = optimisticFlatViewMaps.byId[viewIdToDelete]; if (!isDefined(existingFlatView)) { errors.push({ @@ -58,30 +57,32 @@ export class FlatViewValidatorService { message: t`View not found`, userFriendlyMessage: t`View not found`, }); + } else { + if (!isDefined(existingFlatView.deletedAt)) { + errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View to delete has not been soft deleted`, + userFriendlyMessage: t`View to delete has not been soft deleted`, + }); + } } return { type: 'delete_view', - viewLevelErrors: errors, - failedViewValidationMinimalInformation: { + errors, + flatEntityMinimalInformation: { id: viewIdToDelete, }, }; } public async validateFlatViewCreation({ - _existingFlatViewMaps, + dependencyOptimisticFlatEntityMaps: { flatObjectMetadataMaps }, flatViewToValidate, - optimisticFlatObjectMetadataMaps, - }: { - _existingFlatViewMaps: FlatViewMaps; - flatViewToValidate: FlatView; - optimisticFlatObjectMetadataMaps: FlatObjectMetadataMaps; - }): Promise { + optimisticFlatViewMaps, + }: ViewValidationArgs): Promise> { const optimisticFlatObjectMetadata = - optimisticFlatObjectMetadataMaps.byId[ - flatViewToValidate.objectMetadataId - ]; + flatObjectMetadataMaps.byId[flatViewToValidate.objectMetadataId]; const errors = []; @@ -93,10 +94,18 @@ export class FlatViewValidatorService { }); } + if (isDefined(optimisticFlatViewMaps.byId[flatViewToValidate.id])) { + errors.push({ + code: ViewExceptionCode.INVALID_VIEW_DATA, + message: t`View with same id is already exists`, + userFriendlyMessage: t`View already exists`, + }); + } + return { type: 'create_view', - viewLevelErrors: errors, - failedViewValidationMinimalInformation: { + errors, + flatEntityMinimalInformation: { id: flatViewToValidate.id, }, }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts index 8d3b9710cb..c6d1bc3b7e 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.module.ts @@ -9,8 +9,8 @@ import { WorkspaceMigrationV2ObjectActionsBuilderService } from 'src/engine/work import { WorkspaceMigrationV2ViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service'; import { WorkspaceMigrationV2ViewActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service'; import { WorkspaceMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service'; -import { WorkspaceViewFieldMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-field-migration-builder-v2.service'; -import { WorkspaceViewMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-view-migration-builder-v2.service'; +import { FlatViewFieldValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service'; +import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service'; import { WorkspaceMigrationBuilderValidatorsModule } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/workspace-migration-builder-validators.module'; @Module({ @@ -23,14 +23,16 @@ import { WorkspaceMigrationBuilderValidatorsModule } from 'src/engine/workspace- FlatObjectMetadataValidatorService, WorkspaceMigrationV2FieldActionsBuilderService, WorkspaceMigrationV2ViewActionsBuilderService, - WorkspaceViewMigrationBuilderV2Service, - WorkspaceViewFieldMigrationBuilderV2Service, WorkspaceMigrationV2ViewFieldActionsBuilderService, + FlatViewValidatorService, + FlatViewFieldValidatorService, ], exports: [ WorkspaceMigrationBuilderV2Service, - WorkspaceViewMigrationBuilderV2Service, - WorkspaceViewFieldMigrationBuilderV2Service, + WorkspaceMigrationV2ViewActionsBuilderService, + FlatViewValidatorService, + WorkspaceMigrationV2ViewFieldActionsBuilderService, + FlatViewFieldValidatorService, ], }) export class WorkspaceMigrationBuilderV2Module {} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-field/services/update-view-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-field/services/update-view-field-action-handler.service.ts index 316bb7933b..7808b242b8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-field/services/update-view-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/view-field/services/update-view-field-action-handler.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface'; -import { ViewEntity } from 'src/engine/core-modules/view/entities/view.entity'; +import { ViewFieldEntity } from 'src/engine/core-modules/view/entities/view-field.entity'; import { UpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type'; import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type'; import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util'; @@ -22,12 +22,11 @@ export class UpdateViewFieldActionHandlerService extends WorkspaceMigrationRunne const { viewFieldId } = action; const viewFieldRepository = - queryRunner.manager.getRepository(ViewEntity); + queryRunner.manager.getRepository(ViewFieldEntity); - await viewFieldRepository.update( - viewFieldId, - fromWorkspaceMigrationUpdateActionToPartialEntity(action), - ); + const update = fromWorkspaceMigrationUpdateActionToPartialEntity(action); + + await viewFieldRepository.update(viewFieldId, update); } async executeForWorkspaceSchema( diff --git a/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap new file mode 100644 index 0000000000..412e9fac5b --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-create-view-field-v2.integration-spec.ts.snap @@ -0,0 +1,81 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`View Field Resolver - Failing Create Operation - v2 should fail to create view field when non-existent field metadata 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "objectMetadata": [], + "view": [], + "viewField": [ + { + "errors": [ + { + "code": "INVALID_VIEW_DATA", + "message": "Field metadata not found", + "userFriendlyMessage": "Field metadata not found", + }, + ], + "flatEntityMinimalInformation": { + "fieldMetadataId": Any, + "id": Any, + "viewId": Any, + }, + "status": "fail", + "type": "create_view_field", + }, + ], + }, + "message": "Validation failed for 0 object(s) and 0 field(s)", + "summary": { + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", + }, + "message": "Multiple validation errors occurred while creating view field", + "name": "GraphQLError", +} +`; + +exports[`View Field Resolver - Failing Create Operation - v2 should fail to create view field when non-existent view metadata 1`] = ` +{ + "extensions": { + "code": "BAD_USER_INPUT", + "errors": { + "objectMetadata": [], + "view": [], + "viewField": [ + { + "errors": [ + { + "code": "INVALID_VIEW_DATA", + "message": "View not found", + "userFriendlyMessage": "View not found", + }, + ], + "flatEntityMinimalInformation": { + "fieldMetadataId": Any, + "id": Any, + "viewId": Any, + }, + "status": "fail", + "type": "create_view_field", + }, + ], + }, + "message": "Validation failed for 0 object(s) and 0 field(s)", + "summary": { + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, + }, + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", + }, + "message": "Multiple validation errors occurred while creating view field", + "name": "GraphQLError", +} +`; diff --git a/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-delete-view-field-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-delete-view-field-v2.integration-spec.ts.snap new file mode 100644 index 0000000000..aa6088c699 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-delete-view-field-v2.integration-spec.ts.snap @@ -0,0 +1,12 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`View Field Resolver - Failing Delete Operation - v2 should fail to delete view field when non-existent view field 1`] = ` +{ + "extensions": { + "code": "NOT_FOUND", + "userFriendlyMessage": "An error occurred.", + }, + "message": "View field to delete not found", + "name": "NotFoundError", +} +`; diff --git a/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-destroy-view-field-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-destroy-view-field-v2.integration-spec.ts.snap new file mode 100644 index 0000000000..dda434c216 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-destroy-view-field-v2.integration-spec.ts.snap @@ -0,0 +1,12 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`View Field Resolver - Failing Destroy Operation - v2 should fail to destroy view field when non-existent view field 1`] = ` +{ + "extensions": { + "code": "NOT_FOUND", + "userFriendlyMessage": "An error occurred.", + }, + "message": "View field to destroy not found", + "name": "NotFoundError", +} +`; diff --git a/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-update-view-field-v2.integration-spec.ts.snap b/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-update-view-field-v2.integration-spec.ts.snap new file mode 100644 index 0000000000..7f53ace829 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/__snapshots__/failing-update-view-field-v2.integration-spec.ts.snap @@ -0,0 +1,12 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`View Field Resolver - Failing Update Operation - v2 should fail to update view field when non-existent view field 1`] = ` +{ + "extensions": { + "code": "NOT_FOUND", + "userFriendlyMessage": "An error occurred.", + }, + "message": "View field to update not found", + "name": "NotFoundError", +} +`; diff --git a/packages/twenty-server/test/integration/graphql/suites/view/failing-create-view-field-v2.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/view/failing-create-view-field-v2.integration-spec.ts new file mode 100644 index 0000000000..c3a50ccda5 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/failing-create-view-field-v2.integration-spec.ts @@ -0,0 +1,72 @@ +import { createOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/create-one-core-view-field.util'; +import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any'; +import { + eachTestingContextFilter, + type EachTestingContext, +} from 'twenty-shared/testing'; +import { faker } from '@faker-js/faker'; + +import { type CreateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/create-view-field.input'; + +import { + cleanupViewFieldTestV2, + setupViewFieldTestV2, + type ViewFieldTestSetup, +} from './utils/setup-view-field-test-v2.util'; + +describe('View Field Resolver - Failing Create Operation - v2', () => { + let testSetup: ViewFieldTestSetup; + + beforeAll(async () => { + testSetup = await setupViewFieldTestV2(); + }); + + afterAll(async () => { + await cleanupViewFieldTestV2(testSetup.testObjectMetadataId); + }); + + type CreateViewFieldTestCase = (testSetup: ViewFieldTestSetup) => { + input: CreateViewFieldInput; + }; + + const createViewFieldTestCases: EachTestingContext[] = + [ + { + title: 'non-existent field metadata', + context: (testSetup) => ({ + input: { + viewId: testSetup.testViewId, + fieldMetadataId: faker.string.uuid(), + }, + }), + }, + { + title: 'non-existent view metadata', + context: (testSetup) => ({ + input: { + viewId: faker.string.uuid(), + fieldMetadataId: testSetup.testFieldMetadataId, + }, + }), + }, + ]; + + it.each(eachTestingContextFilter(createViewFieldTestCases))( + 'should fail to create view field when $title', + async ({ context }) => { + const { input } = context(testSetup); + const response = await createOneCoreViewField({ + input, + expectToFail: true, + }); + + expect(response.errors).toBeDefined(); + expect(response.errors.length).toBe(1); + const [firstError] = response.errors; + + expect(firstError).toMatchSnapshot( + extractRecordIdsAndDatesAsExpectAny(firstError), + ); + }, + ); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/view/failing-delete-view-field-v2.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/view/failing-delete-view-field-v2.integration-spec.ts new file mode 100644 index 0000000000..4fc9107527 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/failing-delete-view-field-v2.integration-spec.ts @@ -0,0 +1,61 @@ +import { TEST_NOT_EXISTING_VIEW_FIELD_ID } from 'test/integration/constants/test-view-ids.constants'; +import { deleteOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/delete-one-core-view-field.util'; +import { + eachTestingContextFilter, + type EachTestingContext, +} from 'twenty-shared/testing'; +import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any'; + +import { type DeleteViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/delete-view-field.input'; + +import { + cleanupViewFieldTestV2, + setupViewFieldTestV2, + type ViewFieldTestSetup, +} from './utils/setup-view-field-test-v2.util'; + +describe('View Field Resolver - Failing Delete Operation - v2', () => { + let testSetup: ViewFieldTestSetup; + + beforeAll(async () => { + testSetup = await setupViewFieldTestV2(); + }); + + afterAll(async () => { + await cleanupViewFieldTestV2(testSetup.testObjectMetadataId); + }); + + type DeleteViewFieldTestCase = { + input: DeleteViewFieldInput; + }; + + const deleteViewFieldTestCases: EachTestingContext[] = + [ + { + title: 'non-existent view field', + context: { + input: { + id: TEST_NOT_EXISTING_VIEW_FIELD_ID, + }, + }, + }, + ]; + + it.each(eachTestingContextFilter(deleteViewFieldTestCases))( + 'should fail to delete view field when $title', + async ({ context }) => { + const response = await deleteOneCoreViewField({ + input: context.input, + expectToFail: true, + }); + + expect(response.errors).toBeDefined(); + expect(response.errors.length).toBe(1); + const [firstError] = response.errors; + + expect(firstError).toMatchSnapshot( + extractRecordIdsAndDatesAsExpectAny(firstError), + ); + }, + ); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/view/failing-destroy-view-field-v2.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/view/failing-destroy-view-field-v2.integration-spec.ts new file mode 100644 index 0000000000..73c2dcc288 --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/failing-destroy-view-field-v2.integration-spec.ts @@ -0,0 +1,61 @@ +import { TEST_NOT_EXISTING_VIEW_FIELD_ID } from 'test/integration/constants/test-view-ids.constants'; +import { destroyOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/destroy-one-core-view-field.util'; +import { + eachTestingContextFilter, + type EachTestingContext, +} from 'twenty-shared/testing'; +import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any'; + +import { type DestroyViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/destroy-view-field.input'; + +import { + cleanupViewFieldTestV2, + setupViewFieldTestV2, + type ViewFieldTestSetup, +} from './utils/setup-view-field-test-v2.util'; + +describe('View Field Resolver - Failing Destroy Operation - v2', () => { + let testSetup: ViewFieldTestSetup; + + beforeAll(async () => { + testSetup = await setupViewFieldTestV2(); + }); + + afterAll(async () => { + await cleanupViewFieldTestV2(testSetup.testObjectMetadataId); + }); + + type DestroyViewFieldTestCase = { + input: DestroyViewFieldInput; + }; + + const destroyViewFieldTestCases: EachTestingContext[] = + [ + { + title: 'non-existent view field', + context: { + input: { + id: TEST_NOT_EXISTING_VIEW_FIELD_ID, + }, + }, + }, + ]; + + it.each(eachTestingContextFilter(destroyViewFieldTestCases))( + 'should fail to destroy view field when $title', + async ({ context }) => { + const response = await destroyOneCoreViewField({ + input: context.input, + expectToFail: true, + }); + + expect(response.errors).toBeDefined(); + expect(response.errors.length).toBe(1); + const [firstError] = response.errors; + + expect(firstError).toMatchSnapshot( + extractRecordIdsAndDatesAsExpectAny(firstError), + ); + }, + ); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/view/failing-update-view-field-v2.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/view/failing-update-view-field-v2.integration-spec.ts new file mode 100644 index 0000000000..014a668a6f --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/failing-update-view-field-v2.integration-spec.ts @@ -0,0 +1,64 @@ +import { TEST_NOT_EXISTING_VIEW_FIELD_ID } from 'test/integration/constants/test-view-ids.constants'; +import { updateOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/update-one-core-view-field.util'; +import { + eachTestingContextFilter, + type EachTestingContext, +} from 'twenty-shared/testing'; +import { extractRecordIdsAndDatesAsExpectAny } from 'test/utils/extract-record-ids-and-dates-as-expect-any'; + +import { type UpdateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/update-view-field.input'; + +import { + cleanupViewFieldTestV2, + setupViewFieldTestV2, + type ViewFieldTestSetup, +} from './utils/setup-view-field-test-v2.util'; + +describe('View Field Resolver - Failing Update Operation - v2', () => { + let testSetup: ViewFieldTestSetup; + + beforeAll(async () => { + testSetup = await setupViewFieldTestV2(); + }); + + afterAll(async () => { + await cleanupViewFieldTestV2(testSetup.testObjectMetadataId); + }); + + type UpdateViewFieldTestCase = { + input: UpdateViewFieldInput; + }; + + const updateViewFieldTestCases: EachTestingContext[] = + [ + { + title: 'non-existent view field', + context: { + input: { + id: TEST_NOT_EXISTING_VIEW_FIELD_ID, + update: { + position: 1, + }, + }, + }, + }, + ]; + + it.each(eachTestingContextFilter(updateViewFieldTestCases))( + 'should fail to update view field when $title', + async ({ context }) => { + const response = await updateOneCoreViewField({ + input: context.input, + expectToFail: true, + }); + + expect(response.errors).toBeDefined(); + expect(response.errors.length).toBe(1); + const [firstError] = response.errors; + + expect(firstError).toMatchSnapshot( + extractRecordIdsAndDatesAsExpectAny(firstError), + ); + }, + ); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/view/successful-create-view-field-v2.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/view/successful-create-view-field-v2.integration-spec.ts new file mode 100644 index 0000000000..5f054e0e5e --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/successful-create-view-field-v2.integration-spec.ts @@ -0,0 +1,146 @@ +import { createOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/create-one-core-view-field.util'; +import { assertViewFieldStructure } from 'test/integration/utils/view-test.util'; +import { + type EachTestingContext, + eachTestingContextFilter, +} from 'twenty-shared/testing'; +import { deleteOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/delete-one-core-view-field.util'; +import { destroyOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/destroy-one-core-view-field.util'; +import { isDefined } from 'twenty-shared/utils'; + +import { type ViewFieldDTO } from 'src/engine/core-modules/view/dtos/view-field.dto'; +import { type CreateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/create-view-field.input'; + +import { + cleanupViewFieldTestV2, + setupViewFieldTestV2, + type ViewFieldTestSetup, +} from './utils/setup-view-field-test-v2.util'; + +type TestContext = { + viewFieldInput: (testSetup: ViewFieldTestSetup) => CreateViewFieldInput; + expected: Partial; +}; + +describe('View Field Resolver - Successful Create Operations - v2', () => { + let testSetup: ViewFieldTestSetup; + let createdViewFieldId: string | undefined; + + beforeAll(async () => { + testSetup = await setupViewFieldTestV2(); + }); + + afterAll(async () => { + await cleanupViewFieldTestV2(testSetup.testObjectMetadataId); + }); + + afterEach(async () => { + if (isDefined(createdViewFieldId)) { + const { + data: { deleteCoreViewField }, + } = await deleteOneCoreViewField({ + expectToFail: false, + input: { + id: createdViewFieldId, + }, + }); + + expect(deleteCoreViewField.deletedAt).not.toBeNull(); + await destroyOneCoreViewField({ + expectToFail: false, + input: { + id: createdViewFieldId, + }, + }); + createdViewFieldId = undefined; + } + }); + + const successfulTestCases: EachTestingContext[] = [ + { + title: 'visible field with position and size', + context: { + viewFieldInput: (testSetup) => ({ + fieldMetadataId: testSetup.testFieldMetadataId, + viewId: testSetup.testViewId, + position: 1, + isVisible: true, + size: 200, + }), + expected: { + position: 1, + isVisible: true, + size: 200, + }, + }, + }, + { + title: 'hidden field with position and size', + context: { + viewFieldInput: (testSetup) => ({ + fieldMetadataId: testSetup.testFieldMetadataId, + viewId: testSetup.testViewId, + position: 2, + isVisible: false, + size: 100, + }), + expected: { + position: 2, + isVisible: false, + size: 100, + }, + }, + }, + { + title: 'field with minimum required properties', + context: { + viewFieldInput: (testSetup) => ({ + fieldMetadataId: testSetup.testFieldMetadataId, + viewId: testSetup.testViewId, + }), + expected: { + position: 0, + isVisible: true, + size: 0, + }, + }, + }, + { + title: 'field with maximum size', + context: { + viewFieldInput: (testSetup) => ({ + fieldMetadataId: testSetup.testFieldMetadataId, + viewId: testSetup.testViewId, + position: 3, + isVisible: true, + size: 1000, + }), + expected: { + position: 3, + isVisible: true, + size: 1000, + }, + }, + }, + ]; + + test.each(eachTestingContextFilter(successfulTestCases))( + 'Create $title', + async ({ context: { viewFieldInput, expected } }) => { + const response = await createOneCoreViewField({ + input: viewFieldInput(testSetup), + expectToFail: false, + }); + + expect(response.errors).toBeUndefined(); + expect(response.data.createCoreViewField).toBeDefined(); + createdViewFieldId = response.data.createCoreViewField.id; + + assertViewFieldStructure(response.data.createCoreViewField, { + fieldMetadataId: testSetup.testFieldMetadataId, + viewId: testSetup.testViewId, + ...expected, + }); + }, + ); +}); diff --git a/packages/twenty-server/test/integration/graphql/suites/view/utils/setup-view-field-test-v2.util.ts b/packages/twenty-server/test/integration/graphql/suites/view/utils/setup-view-field-test-v2.util.ts new file mode 100644 index 0000000000..9f65177daa --- /dev/null +++ b/packages/twenty-server/test/integration/graphql/suites/view/utils/setup-view-field-test-v2.util.ts @@ -0,0 +1,95 @@ +import { createTestViewWithGraphQL } from 'test/integration/graphql/utils/view-graphql.util'; +import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util'; +import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; +import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; +import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; +import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util'; +import { FieldMetadataType } from 'twenty-shared/types'; + +import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; + +export type ViewFieldTestSetup = { + testViewId: string; + testObjectMetadataId: string; + testFieldMetadataId: string; +}; + +export const setupViewFieldTestV2 = async (): Promise => { + await updateFeatureFlag({ + expectToFail: false, + featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + value: true, + }); + + const { + data: { + createOneObject: { id: objectMetadataId }, + }, + } = await createOneObjectMetadata({ + expectToFail: false, + input: { + nameSingular: 'myFieldTestObjectV2', + namePlural: 'myFieldTestObjectsV2', + labelSingular: 'My Field Test Object v2', + labelPlural: 'My Field Test Objects v2', + icon: 'Icon123', + }, + }); + + const { + data: { + createOneField: { id: fieldMetadataId }, + }, + } = await createOneFieldMetadata({ + expectToFail: false, + input: { + name: 'testField', + label: 'Test Field', + type: FieldMetadataType.TEXT, + objectMetadataId, + isLabelSyncedWithName: true, + }, + gqlFields: ` + id + name + label + isLabelSyncedWithName + `, + }); + + const view = await createTestViewWithGraphQL({ + name: 'Test View for Fields', + objectMetadataId, + }); + + return { + testViewId: view.id, + testObjectMetadataId: objectMetadataId, + testFieldMetadataId: fieldMetadataId, + }; +}; + +export const cleanupViewFieldTestV2 = async ( + objectMetadataId: string, +): Promise => { + try { + await updateOneObjectMetadata({ + input: { + idToUpdate: objectMetadataId, + updatePayload: { + isActive: false, + }, + }, + }); + await deleteOneObjectMetadata({ + expectToFail: false, + input: { idToDelete: objectMetadataId }, + }); + } finally { + await updateFeatureFlag({ + expectToFail: false, + featureFlag: FeatureFlagKey.IS_WORKSPACE_MIGRATION_V2_ENABLED, + value: false, + }); + } +}; diff --git a/packages/twenty-server/test/integration/graphql/suites/view/view-field-resolver.integration-spec.ts b/packages/twenty-server/test/integration/graphql/suites/view/view-field-resolver.integration-spec.ts index 1b1502d7f4..e6e9c9e4a0 100644 --- a/packages/twenty-server/test/integration/graphql/suites/view/view-field-resolver.integration-spec.ts +++ b/packages/twenty-server/test/integration/graphql/suites/view/view-field-resolver.integration-spec.ts @@ -1,33 +1,34 @@ import { TEST_NOT_EXISTING_VIEW_FIELD_ID } from 'test/integration/constants/test-view-ids.constants'; -import { createViewFieldOperationFactory } from 'test/integration/graphql/utils/create-view-field-operation-factory.util'; -import { deleteViewFieldOperationFactory } from 'test/integration/graphql/utils/delete-view-field-operation-factory.util'; -import { destroyViewFieldOperationFactory } from 'test/integration/graphql/utils/destroy-view-field-operation-factory.util'; import { findViewFieldsOperationFactory } from 'test/integration/graphql/utils/find-view-fields-operation-factory.util'; import { assertGraphQLErrorResponse, assertGraphQLSuccessfulResponse, } from 'test/integration/graphql/utils/graphql-test-assertions.util'; import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util'; -import { updateViewFieldOperationFactory } from 'test/integration/graphql/utils/update-view-field-operation-factory.util'; import { createViewFieldData, updateViewFieldData, } from 'test/integration/graphql/utils/view-data-factory.util'; import { createTestViewWithGraphQL } from 'test/integration/graphql/utils/view-graphql.util'; import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util'; +import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; import { assertViewFieldStructure, cleanupViewRecords, } from 'test/integration/utils/view-test.util'; import { FieldMetadataType } from 'twenty-shared/types'; -import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; +import { createOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/create-one-core-view-field.util'; +import { deleteOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/delete-one-core-view-field.util'; +import { destroyOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/destroy-one-core-view-field.util'; +import { updateOneCoreViewField } from 'test/integration/metadata/suites/view-field/utils/update-one-core-view-field.util'; -import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; import { generateViewFieldExceptionMessage, ViewFieldExceptionMessageKey, } from 'src/engine/core-modules/view/exceptions/view-field.exception'; +import { type CreateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/create-view-field.input'; +import { ErrorCode } from 'src/engine/core-modules/graphql/utils/graphql-errors.util'; describe('View Field Resolver', () => { let testViewId: string; @@ -113,11 +114,11 @@ describe('View Field Resolver', () => { size: 150, fieldMetadataId: testFieldMetadataId, }); - const createOperation = createViewFieldOperationFactory({ - data: fieldData, - }); - await makeGraphqlAPIRequest(createOperation); + await createOneCoreViewField({ + input: fieldData as CreateViewFieldInput, + expectToFail: false, + }); const getOperation = findViewFieldsOperationFactory({ viewId: testViewId, @@ -145,11 +146,13 @@ describe('View Field Resolver', () => { fieldMetadataId: testFieldMetadataId, }); - const operation = createViewFieldOperationFactory({ data: fieldData }); - const response = await makeGraphqlAPIRequest(operation); + const response = await createOneCoreViewField({ + input: fieldData as CreateViewFieldInput, + expectToFail: false, + }); - assertGraphQLSuccessfulResponse(response); - assertViewFieldStructure(response.body.data.createCoreViewField, { + assertGraphQLSuccessfulResponse({ body: response, status: 200 }); + assertViewFieldStructure(response.data.createCoreViewField, { fieldMetadataId: testFieldMetadataId, position: 1, isVisible: true, @@ -167,11 +170,13 @@ describe('View Field Resolver', () => { viewId: testViewId, }; - const operation = createViewFieldOperationFactory({ data: fieldData }); - const response = await makeGraphqlAPIRequest(operation); + const response = await createOneCoreViewField({ + input: fieldData, + expectToFail: false, + }); - assertGraphQLSuccessfulResponse(response); - assertViewFieldStructure(response.body.data.createCoreViewField, { + assertGraphQLSuccessfulResponse({ body: response, status: 200 }); + assertViewFieldStructure(response.data.createCoreViewField, { fieldMetadataId: testFieldMetadataId, position: 2, isVisible: false, @@ -189,27 +194,27 @@ describe('View Field Resolver', () => { size: 150, fieldMetadataId: testFieldMetadataId, }); - const createOperation = createViewFieldOperationFactory({ - data: fieldData, + const createResponse = await createOneCoreViewField({ + input: fieldData as CreateViewFieldInput, + expectToFail: false, }); - const createResponse = await makeGraphqlAPIRequest(createOperation); - const viewField = createResponse.body.data.createCoreViewField; + const viewField = createResponse.data.createCoreViewField; const updateInput = updateViewFieldData({ position: 5, isVisible: false, size: 300, }); - const updateOperation = updateViewFieldOperationFactory({ + const response = await updateOneCoreViewField({ input: { id: viewField.id, update: updateInput, }, + expectToFail: false, }); - const response = await makeGraphqlAPIRequest(updateOperation); - assertGraphQLSuccessfulResponse(response); - expect(response.body.data.updateCoreViewField).toMatchObject({ + assertGraphQLSuccessfulResponse({ body: response, status: 200 }); + expect(response.data.updateCoreViewField).toMatchObject({ id: viewField.id, position: 5, isVisible: false, @@ -218,18 +223,18 @@ describe('View Field Resolver', () => { }); it('should throw an error when updating non-existent view field', async () => { - const operation = updateViewFieldOperationFactory({ + const response = await updateOneCoreViewField({ input: { id: TEST_NOT_EXISTING_VIEW_FIELD_ID, update: { position: 1, }, }, + expectToFail: true, }); - const response = await makeGraphqlAPIRequest(operation); assertGraphQLErrorResponse( - response, + { body: response, status: 200 }, ErrorCode.NOT_FOUND, generateViewFieldExceptionMessage( ViewFieldExceptionMessageKey.VIEW_FIELD_NOT_FOUND, @@ -244,31 +249,31 @@ describe('View Field Resolver', () => { const fieldData = createViewFieldData(testViewId, { fieldMetadataId: testFieldMetadataId, }); - const createOperation = createViewFieldOperationFactory({ - data: fieldData, + const createResponse = await createOneCoreViewField({ + input: fieldData as CreateViewFieldInput, + expectToFail: false, }); - const createResponse = await makeGraphqlAPIRequest(createOperation); - const viewField = createResponse.body.data.createCoreViewField; + const viewField = createResponse.data.createCoreViewField; - const deleteOperation = deleteViewFieldOperationFactory({ - viewFieldId: viewField.id, + const response = await deleteOneCoreViewField({ + input: { id: viewField.id }, + expectToFail: false, }); - const response = await makeGraphqlAPIRequest(deleteOperation); - assertGraphQLSuccessfulResponse(response); - expect(response.body.data.deleteCoreViewField).toMatchObject({ + assertGraphQLSuccessfulResponse({ body: response, status: 200 }); + expect(response.data.deleteCoreViewField).toMatchObject({ id: viewField.id, }); }); it('should throw an error when deleting non-existent view field', async () => { - const operation = deleteViewFieldOperationFactory({ - viewFieldId: TEST_NOT_EXISTING_VIEW_FIELD_ID, + const response = await deleteOneCoreViewField({ + input: { id: TEST_NOT_EXISTING_VIEW_FIELD_ID }, + expectToFail: true, }); - const response = await makeGraphqlAPIRequest(operation); assertGraphQLErrorResponse( - response, + { body: response, status: 200 }, ErrorCode.NOT_FOUND, generateViewFieldExceptionMessage( ViewFieldExceptionMessageKey.VIEW_FIELD_NOT_FOUND, @@ -283,31 +288,35 @@ describe('View Field Resolver', () => { const fieldData = createViewFieldData(testViewId, { fieldMetadataId: testFieldMetadataId, }); - const createOperation = createViewFieldOperationFactory({ - data: fieldData, + const createResponse = await createOneCoreViewField({ + input: fieldData as CreateViewFieldInput, + expectToFail: false, }); - const createResponse = await makeGraphqlAPIRequest(createOperation); - const viewField = createResponse.body.data.createCoreViewField; + const viewField = createResponse.data.createCoreViewField; - const destroyOperation = destroyViewFieldOperationFactory({ - viewFieldId: viewField.id, + const response = await destroyOneCoreViewField({ + input: { + id: viewField.id, + }, + expectToFail: false, }); - const response = await makeGraphqlAPIRequest(destroyOperation); - assertGraphQLSuccessfulResponse(response); - expect(response.body.data.destroyCoreViewField).toMatchObject({ + assertGraphQLSuccessfulResponse({ body: response, status: 200 }); + expect(response.data.destroyCoreViewField).toMatchObject({ id: viewField.id, }); }); it('should throw an error when destroying non-existent view field', async () => { - const operation = destroyViewFieldOperationFactory({ - viewFieldId: TEST_NOT_EXISTING_VIEW_FIELD_ID, + const response = await destroyOneCoreViewField({ + input: { + id: TEST_NOT_EXISTING_VIEW_FIELD_ID, + }, + expectToFail: true, }); - const response = await makeGraphqlAPIRequest(operation); assertGraphQLErrorResponse( - response, + { body: response, status: 200 }, ErrorCode.NOT_FOUND, generateViewFieldExceptionMessage( ViewFieldExceptionMessageKey.VIEW_FIELD_NOT_FOUND, diff --git a/packages/twenty-server/test/integration/graphql/utils/delete-view-field-operation-factory.util.ts b/packages/twenty-server/test/integration/graphql/utils/delete-view-field-operation-factory.util.ts deleted file mode 100644 index 7839415f9c..0000000000 --- a/packages/twenty-server/test/integration/graphql/utils/delete-view-field-operation-factory.util.ts +++ /dev/null @@ -1,21 +0,0 @@ -import gql from 'graphql-tag'; -import { VIEW_FIELD_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; - -export const deleteViewFieldOperationFactory = ({ - viewFieldId, - gqlFields = VIEW_FIELD_GQL_FIELDS, -}: { - gqlFields?: string; - viewFieldId: string; -}) => ({ - query: gql` - mutation DeleteCoreViewField($input: DeleteViewFieldInput!) { - deleteCoreViewField(input: $input) { - ${gqlFields} - } - } - `, - variables: { - input: { id: viewFieldId }, - }, -}); diff --git a/packages/twenty-server/test/integration/graphql/utils/destroy-view-field-operation-factory.util.ts b/packages/twenty-server/test/integration/graphql/utils/destroy-view-field-operation-factory.util.ts deleted file mode 100644 index 6efcad0ed2..0000000000 --- a/packages/twenty-server/test/integration/graphql/utils/destroy-view-field-operation-factory.util.ts +++ /dev/null @@ -1,21 +0,0 @@ -import gql from 'graphql-tag'; -import { VIEW_FIELD_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; - -export const destroyViewFieldOperationFactory = ({ - viewFieldId, - gqlFields = VIEW_FIELD_GQL_FIELDS, -}: { - gqlFields?: string; - viewFieldId: string; -}) => ({ - query: gql` - mutation DestroyCoreViewField($input: DestroyViewFieldInput!) { - destroyCoreViewField(input: $input){ - ${gqlFields} - } - } - `, - variables: { - input: { id: viewFieldId }, - }, -}); 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 c7f83b09f4..cf9d6cf2cf 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 @@ -6,7 +6,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -16,21 +16,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "invalid", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -44,7 +48,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -54,21 +58,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "'OPTION_424242'", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -82,7 +90,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -91,21 +99,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "Option ,1", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -119,7 +131,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -143,21 +155,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -171,7 +187,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -195,21 +211,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -223,7 +243,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -247,21 +267,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -275,7 +299,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -299,21 +323,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -327,7 +355,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -336,21 +364,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": [], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -364,7 +396,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -374,21 +406,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": [], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -402,7 +438,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -416,21 +452,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -444,7 +484,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -453,21 +493,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -481,7 +525,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -491,21 +535,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -519,7 +567,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -528,21 +576,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -556,7 +608,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -580,21 +632,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "format", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -608,7 +664,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -617,21 +673,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "not a uuid", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -645,7 +705,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -654,21 +714,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "Option 1 and some other things, /", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -682,7 +746,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -692,21 +756,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "Option_1", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -720,7 +788,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -730,21 +798,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -758,7 +830,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -767,21 +839,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -795,7 +871,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -805,21 +881,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -833,7 +913,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -842,21 +922,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -870,7 +954,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -884,21 +968,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": null, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -912,7 +1000,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -921,21 +1009,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "userFriendlyMessage": "Option label is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -949,7 +1041,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -959,21 +1051,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": [], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -987,7 +1083,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -996,21 +1092,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "userFriendlyMessage": "Option value is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1024,7 +1124,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1038,21 +1138,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1066,7 +1170,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1075,21 +1179,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1103,7 +1211,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1113,21 +1221,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1141,7 +1253,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1150,21 +1262,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1178,7 +1294,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1192,21 +1308,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1220,7 +1340,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1229,21 +1349,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1257,7 +1381,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1266,21 +1390,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1294,7 +1422,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1308,21 +1436,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1336,7 +1468,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1345,21 +1477,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "userFriendlyMessage": "Option label is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1373,7 +1509,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1382,21 +1518,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "userFriendlyMessage": "Option value is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1410,7 +1550,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1420,21 +1560,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": [], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1448,7 +1592,7 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1457,21 +1601,25 @@ exports[`Failing create field metadata MULTI_SELECT tests suite v2 Create should "value": "'UNKNOWN_OPTION'", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1485,7 +1633,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1499,21 +1647,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "invalid", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1527,7 +1679,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1536,21 +1688,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "'OPTION_424242'", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1564,7 +1720,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1573,21 +1729,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "Option ,1", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1601,7 +1761,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1625,21 +1785,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1653,7 +1817,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1677,21 +1841,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1705,7 +1873,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1729,21 +1897,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1757,7 +1929,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1781,21 +1953,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1809,7 +1985,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1819,21 +1995,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": [], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1847,7 +2027,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1861,21 +2041,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1889,7 +2073,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1898,21 +2082,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1926,7 +2114,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1936,21 +2124,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -1964,7 +2156,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1973,21 +2165,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2001,7 +2197,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2010,21 +2206,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "not a uuid", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2038,7 +2238,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2047,21 +2247,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "Option 1 and some other things, /", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2075,7 +2279,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2085,21 +2289,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2113,7 +2321,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2122,21 +2330,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2150,7 +2362,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2160,21 +2372,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2188,7 +2404,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2197,21 +2413,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2225,7 +2445,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2239,21 +2459,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": null, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2267,7 +2491,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2276,21 +2500,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "userFriendlyMessage": "Option label is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2304,7 +2532,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2314,21 +2542,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": [], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2342,7 +2574,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2351,21 +2583,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "userFriendlyMessage": "Option value is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2379,7 +2615,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2393,21 +2629,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2421,7 +2661,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2430,21 +2670,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2458,7 +2702,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2468,21 +2712,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2496,7 +2744,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2505,21 +2753,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2533,7 +2785,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2547,21 +2799,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2575,7 +2831,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2584,21 +2840,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2612,7 +2872,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2621,21 +2881,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2649,7 +2913,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2663,21 +2927,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2691,7 +2959,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2700,21 +2968,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "userFriendlyMessage": "Option label is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2728,7 +3000,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2737,21 +3009,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "userFriendlyMessage": "Option value is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -2765,7 +3041,7 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2775,21 +3051,25 @@ exports[`Failing create field metadata SELECT tests suite v2 Create should fail "value": [], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "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 3f2eefce87..2a229f1541 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 @@ -6,7 +6,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -16,21 +16,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "invalid", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -44,7 +48,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -54,21 +58,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "'OPTION_424242'", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -82,7 +90,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -91,21 +99,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "Option ,1", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -119,7 +131,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -143,21 +155,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -171,7 +187,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -195,21 +211,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -223,7 +243,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -247,21 +267,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -275,7 +299,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -299,21 +323,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -327,7 +355,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -336,21 +364,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": [], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -364,7 +396,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -374,21 +406,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": [], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -402,7 +438,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -416,21 +452,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -444,7 +484,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -453,21 +493,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -481,7 +525,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -491,21 +535,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -519,7 +567,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -528,21 +576,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -556,7 +608,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -580,21 +632,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "format", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -608,7 +664,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -617,21 +673,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "not a uuid", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -645,7 +705,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -654,21 +714,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "Option 1 and some other things, /", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -682,7 +746,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -692,21 +756,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "Option_1", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -720,7 +788,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -730,21 +798,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -758,7 +830,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -767,21 +839,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -795,7 +871,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -805,21 +881,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -833,7 +913,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -842,21 +922,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -870,7 +954,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -884,21 +968,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": null, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -912,7 +1000,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -921,21 +1009,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "userFriendlyMessage": "Option label is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -949,7 +1041,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -958,21 +1050,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "userFriendlyMessage": "Option value is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -986,7 +1082,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1000,21 +1096,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1028,7 +1128,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1037,21 +1137,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1065,7 +1169,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1075,21 +1179,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1103,7 +1211,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1112,21 +1220,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1140,7 +1252,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1154,21 +1266,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1182,7 +1298,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1191,21 +1307,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1219,7 +1339,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1228,21 +1348,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1256,7 +1380,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1270,21 +1394,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1298,7 +1426,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1307,21 +1435,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "userFriendlyMessage": "Option label is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1335,7 +1467,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1344,21 +1476,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "userFriendlyMessage": "Option value is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1372,7 +1508,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1381,21 +1517,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "'OPTION_42'", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1409,7 +1549,7 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1418,21 +1558,25 @@ exports[`Failing update field metadata MULTI_SELECT tests suite v2 Update should "value": "'UNKNOWN_OPTION'", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1446,7 +1590,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1460,21 +1604,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "invalid", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1488,7 +1636,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1497,21 +1645,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "'OPTION_424242'", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1525,7 +1677,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1534,21 +1686,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "Option ,1", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1562,7 +1718,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1586,21 +1742,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1614,7 +1774,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1638,21 +1798,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1666,7 +1830,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1690,21 +1854,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1718,7 +1886,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1742,21 +1910,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail ], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1770,7 +1942,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1780,21 +1952,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": [], }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1808,7 +1984,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1822,21 +1998,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1850,7 +2030,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1859,21 +2039,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1887,7 +2071,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1897,21 +2081,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1925,7 +2113,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1934,21 +2122,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1962,7 +2154,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -1971,21 +2163,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "not a uuid", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -1999,7 +2195,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2008,21 +2204,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "Option 1 and some other things, /", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2036,7 +2236,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2046,21 +2246,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2074,7 +2278,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2083,21 +2287,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2111,7 +2319,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2121,21 +2329,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": 22222, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2149,7 +2361,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2158,21 +2370,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2186,7 +2402,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2200,21 +2416,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": null, }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2228,7 +2448,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2237,21 +2457,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "userFriendlyMessage": "Option label is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2265,7 +2489,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2274,21 +2498,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "userFriendlyMessage": "Option value is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2302,7 +2530,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2316,21 +2544,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2344,7 +2576,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2353,21 +2585,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2381,7 +2617,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2391,21 +2627,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2419,7 +2659,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2428,21 +2668,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "userFriendlyMessage": "Option value format not supported", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2456,7 +2700,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2470,21 +2714,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2498,7 +2746,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2507,21 +2755,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2535,7 +2787,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2544,21 +2796,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2572,7 +2828,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2586,21 +2842,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2614,7 +2874,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2623,21 +2883,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "userFriendlyMessage": "Option label is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2651,7 +2915,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2660,21 +2924,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "userFriendlyMessage": "Option value is required", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while updating field", "name": "GraphQLError", @@ -2688,7 +2956,7 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -2697,21 +2965,25 @@ exports[`Failing update field metadata SELECT tests suite v2 Update should fail "value": "'OPTION_42'", }, ], - "id": Any, - "name": "testField", - "objectMetadataId": Any, - "operation": "update_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "testField", + "objectMetadataId": Any, + }, + "type": "update_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "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 9f952ec7ce..8608bbb736 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 @@ -5,7 +5,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -15,10 +15,12 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "value": "toto", }, ], - "id": Any, - "name": "toto", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "toto", + "objectMetadataId": Any, + }, + "type": "create_field", }, { "errors": [ @@ -29,21 +31,25 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "value": "tata", }, ], - "id": Any, - "name": "tata", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "tata", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 2 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 2, - "invalidObjects": 0, - "totalErrors": 2, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 2 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -55,7 +61,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -65,21 +71,25 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 Morh re "value": "fieldNamePersonForMorphRelationSecondId", }, ], - "id": Any, - "name": "fieldNamePersonForMorphRelationSecondId", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "fieldNamePersonForMorphRelationSecondId", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -91,7 +101,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -100,18 +110,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "userFriendlyMessage": "Morph relation creation payloads must only contain relation to other object metadata", }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -123,7 +136,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -132,18 +145,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "userFriendlyMessage": "Morph relation creation payloads must only contain relation to the same object metadata", }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -155,7 +171,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -171,21 +187,25 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "value": "", }, ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -197,7 +217,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -207,21 +227,25 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "id": Any, - "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -233,7 +257,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -243,21 +267,25 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "value": "name", }, ], - "id": Any, - "name": "name", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "name", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -269,7 +297,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -285,21 +313,25 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "value": "", }, ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating fields", "name": "GraphQLError", @@ -311,7 +343,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -328,18 +360,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou ], }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -351,7 +386,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -368,18 +403,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou ], }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -391,7 +429,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -407,18 +445,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou ], }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -430,7 +471,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -439,18 +480,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "userFriendlyMessage": "At least one relation is require", }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -462,7 +506,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -471,18 +515,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "userFriendlyMessage": "Morph relation creation payloads must have the same relation type", }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -494,7 +541,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -503,18 +550,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "userFriendlyMessage": "Morph relation creation payloads must have the same relation type", }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -526,7 +576,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -538,18 +588,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou ], }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -561,7 +614,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -571,18 +624,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "value": null, }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "name": "GraphQLError", @@ -594,7 +650,7 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ + "objectMetadata": [ { "errors": [ { @@ -603,18 +659,21 @@ exports[`failing createOne FieldMetadataService morph relation fields v2 it shou "userFriendlyMessage": "Relation creation payload is required", }, ], - "operation": "create_field", + "flatEntityMinimalInformation": {}, + "type": "create_field", }, ], - "objectMetadata": [], + "view": [], + "viewField": [], }, - "message": "Validation failed for 0 object(s) and 1 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 1, - "invalidObjects": 0, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 0 object(s) and 1 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating field", "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 813a52b659..7799cbe700 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 @@ -5,7 +5,6 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -15,21 +14,25 @@ exports[`Object metadata creation should fail v2 when labelPlural contains only "value": "", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -41,7 +44,6 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -51,21 +53,25 @@ exports[`Object metadata creation should fail v2 when labelPlural exceeds maximu "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -77,7 +83,6 @@ exports[`Object metadata creation should fail v2 when labelPlural is empty 1`] = "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -87,21 +92,25 @@ exports[`Object metadata creation should fail v2 when labelPlural is empty 1`] = "value": "", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -113,7 +122,6 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -123,21 +131,25 @@ exports[`Object metadata creation should fail v2 when labelSingular contains onl "value": "", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -149,7 +161,6 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -159,21 +170,25 @@ exports[`Object metadata creation should fail v2 when labelSingular exceeds maxi "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -185,7 +200,6 @@ exports[`Object metadata creation should fail v2 when labelSingular is empty 1`] "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -195,21 +209,25 @@ exports[`Object metadata creation should fail v2 when labelSingular is empty 1`] "value": "", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -221,7 +239,6 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -232,21 +249,25 @@ exports[`Object metadata creation should fail v2 when labels are identical 1`] = "value": "FooBar", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -258,7 +279,6 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -269,21 +289,25 @@ exports[`Object metadata creation should fail v2 when labels with whitespaces re "value": "FooBar", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -295,78 +319,6 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too long", - "userFriendlyMessage": "Name is too long", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - }, - ], - "id": Any, - "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too long", - "userFriendlyMessage": "Name is too long", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - }, - ], - "id": Any, - "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too long", - "userFriendlyMessage": "Name is too long", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - }, - ], - "id": Any, - "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too long", - "userFriendlyMessage": "Name is too long", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - }, - ], - "id": Any, - "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too long", - "userFriendlyMessage": "Name is too long", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - }, - ], - "id": Any, - "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "objectMetadataId": Any, - "operation": "create_field", - }, - ], "objectMetadata": [ { "errors": [ @@ -376,21 +328,105 @@ exports[`Object metadata creation should fail v2 when name exceeds maximum lengt "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + }, + "type": "create_object", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too long", + "userFriendlyMessage": "Name is too long", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too long", + "userFriendlyMessage": "Name is too long", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too long", + "userFriendlyMessage": "Name is too long", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too long", + "userFriendlyMessage": "Name is too long", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too long", + "userFriendlyMessage": "Name is too long", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 5 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 5, - "invalidObjects": 1, - "totalErrors": 6, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 5 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -402,7 +438,6 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -412,21 +447,25 @@ exports[`Object metadata creation should fail v2 when namePlural has invalid cha "value": "μ", }, ], - "fields": [], - "id": Any, - "namePlural": "μ", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "μ", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -438,7 +477,6 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -448,21 +486,25 @@ exports[`Object metadata creation should fail v2 when namePlural is a reserved k "value": "users", }, ], - "fields": [], - "id": Any, - "namePlural": "users", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "users", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -474,7 +516,6 @@ exports[`Object metadata creation should fail v2 when namePlural is an empty str "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -489,21 +530,25 @@ exports[`Object metadata creation should fail v2 when namePlural is an empty str "value": "", }, ], - "fields": [], - "id": Any, - "namePlural": "", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -515,7 +560,6 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -530,21 +574,25 @@ exports[`Object metadata creation should fail v2 when namePlural is not camelCas "value": "Not_Camel_Case", }, ], - "fields": [], - "id": Any, - "namePlural": "Not_Camel_Case", - "nameSingular": "listinga", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "Not_Camel_Case", + "nameSingular": "listinga", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -556,108 +604,6 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name should be in camelCase", - "userFriendlyMessage": "Name should be in camelCase", - "value": "a a", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "a a", - }, - ], - "id": Any, - "name": "a a", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name should be in camelCase", - "userFriendlyMessage": "Name should be in camelCase", - "value": "a a", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "a a", - }, - ], - "id": Any, - "name": "a a", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name should be in camelCase", - "userFriendlyMessage": "Name should be in camelCase", - "value": "a a", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "a a", - }, - ], - "id": Any, - "name": "a a", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name should be in camelCase", - "userFriendlyMessage": "Name should be in camelCase", - "value": "a a", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "a a", - }, - ], - "id": Any, - "name": "a a", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name should be in camelCase", - "userFriendlyMessage": "Name should be in camelCase", - "value": "a a", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "a a", - }, - ], - "id": Any, - "name": "a a", - "objectMetadataId": Any, - "operation": "create_field", - }, - ], "objectMetadata": [ { "errors": [ @@ -672,21 +618,135 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only "value": "a a", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "a a", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "a a", + }, + "type": "create_object", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name should be in camelCase", + "userFriendlyMessage": "Name should be in camelCase", + "value": "a a", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "a a", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "a a", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name should be in camelCase", + "userFriendlyMessage": "Name should be in camelCase", + "value": "a a", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "a a", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "a a", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name should be in camelCase", + "userFriendlyMessage": "Name should be in camelCase", + "value": "a a", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "a a", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "a a", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name should be in camelCase", + "userFriendlyMessage": "Name should be in camelCase", + "value": "a a", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "a a", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "a a", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name should be in camelCase", + "userFriendlyMessage": "Name should be in camelCase", + "value": "a a", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "a a", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "a a", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 5 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 5, - "invalidObjects": 1, - "totalErrors": 6, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 5 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -698,108 +758,6 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too short", - "userFriendlyMessage": "Name is too short", - "value": "", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "", - }, - ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too short", - "userFriendlyMessage": "Name is too short", - "value": "", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "", - }, - ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too short", - "userFriendlyMessage": "Name is too short", - "value": "", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "", - }, - ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too short", - "userFriendlyMessage": "Name is too short", - "value": "", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "", - }, - ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too short", - "userFriendlyMessage": "Name is too short", - "value": "", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "", - }, - ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", - }, - ], "objectMetadata": [ { "errors": [ @@ -814,21 +772,135 @@ exports[`Object metadata creation should fail v2 when nameSingular contains only "value": "", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "", + }, + "type": "create_object", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 5 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 5, - "invalidObjects": 1, - "totalErrors": 6, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 5 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -840,78 +912,6 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "μ", - }, - ], - "id": Any, - "name": "μ", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "μ", - }, - ], - "id": Any, - "name": "μ", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "μ", - }, - ], - "id": Any, - "name": "μ", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "μ", - }, - ], - "id": Any, - "name": "μ", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "μ", - }, - ], - "id": Any, - "name": "μ", - "objectMetadataId": Any, - "operation": "create_field", - }, - ], "objectMetadata": [ { "errors": [ @@ -921,21 +921,105 @@ exports[`Object metadata creation should fail v2 when nameSingular has invalid c "value": "μ", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "μ", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "μ", + }, + "type": "create_object", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "μ", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "μ", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "μ", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "μ", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "μ", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "μ", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "μ", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "μ", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "μ", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "μ", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 5 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 5, - "invalidObjects": 1, - "totalErrors": 6, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 5 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -947,78 +1031,6 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "The name is not available", - "userFriendlyMessage": "The name is not available", - "value": "user", - }, - ], - "id": Any, - "name": "user", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "The name is not available", - "userFriendlyMessage": "The name is not available", - "value": "user", - }, - ], - "id": Any, - "name": "user", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "The name is not available", - "userFriendlyMessage": "The name is not available", - "value": "user", - }, - ], - "id": Any, - "name": "user", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "The name is not available", - "userFriendlyMessage": "The name is not available", - "value": "user", - }, - ], - "id": Any, - "name": "user", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "The name is not available", - "userFriendlyMessage": "The name is not available", - "value": "user", - }, - ], - "id": Any, - "name": "user", - "objectMetadataId": Any, - "operation": "create_field", - }, - ], "objectMetadata": [ { "errors": [ @@ -1028,21 +1040,105 @@ exports[`Object metadata creation should fail v2 when nameSingular is a reserved "value": "user", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "user", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "user", + }, + "type": "create_object", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "The name is not available", + "userFriendlyMessage": "The name is not available", + "value": "user", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "user", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "The name is not available", + "userFriendlyMessage": "The name is not available", + "value": "user", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "user", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "The name is not available", + "userFriendlyMessage": "The name is not available", + "value": "user", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "user", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "The name is not available", + "userFriendlyMessage": "The name is not available", + "value": "user", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "user", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "The name is not available", + "userFriendlyMessage": "The name is not available", + "value": "user", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "user", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 5 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 5, - "invalidObjects": 1, - "totalErrors": 6, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 5 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -1054,108 +1150,6 @@ exports[`Object metadata creation should fail v2 when nameSingular is an empty s "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too short", - "userFriendlyMessage": "Name is too short", - "value": "", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "", - }, - ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too short", - "userFriendlyMessage": "Name is too short", - "value": "", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "", - }, - ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too short", - "userFriendlyMessage": "Name is too short", - "value": "", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "", - }, - ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too short", - "userFriendlyMessage": "Name is too short", - "value": "", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "", - }, - ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is too short", - "userFriendlyMessage": "Name is too short", - "value": "", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "", - }, - ], - "id": Any, - "name": "", - "objectMetadataId": Any, - "operation": "create_field", - }, - ], "objectMetadata": [ { "errors": [ @@ -1170,21 +1164,135 @@ exports[`Object metadata creation should fail v2 when nameSingular is an empty s "value": "", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "", + }, + "type": "create_object", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is too short", + "userFriendlyMessage": "Name is too short", + "value": "", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 5 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 5, - "invalidObjects": 1, - "totalErrors": 6, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 5 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -1196,108 +1304,6 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [ - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name should be in camelCase", - "userFriendlyMessage": "Name should be in camelCase", - "value": "Not_Camel_Case", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "Not_Camel_Case", - }, - ], - "id": Any, - "name": "Not_Camel_Case", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name should be in camelCase", - "userFriendlyMessage": "Name should be in camelCase", - "value": "Not_Camel_Case", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "Not_Camel_Case", - }, - ], - "id": Any, - "name": "Not_Camel_Case", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name should be in camelCase", - "userFriendlyMessage": "Name should be in camelCase", - "value": "Not_Camel_Case", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "Not_Camel_Case", - }, - ], - "id": Any, - "name": "Not_Camel_Case", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name should be in camelCase", - "userFriendlyMessage": "Name should be in camelCase", - "value": "Not_Camel_Case", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "Not_Camel_Case", - }, - ], - "id": Any, - "name": "Not_Camel_Case", - "objectMetadataId": Any, - "operation": "create_field", - }, - { - "errors": [ - { - "code": "INVALID_FIELD_INPUT", - "message": "Name should be in camelCase", - "userFriendlyMessage": "Name should be in camelCase", - "value": "Not_Camel_Case", - }, - { - "code": "INVALID_FIELD_INPUT", - "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", - "value": "Not_Camel_Case", - }, - ], - "id": Any, - "name": "Not_Camel_Case", - "objectMetadataId": Any, - "operation": "create_field", - }, - ], "objectMetadata": [ { "errors": [ @@ -1312,21 +1318,135 @@ exports[`Object metadata creation should fail v2 when nameSingular is not camelC "value": "Not_Camel_Case", }, ], - "fields": [], - "id": Any, - "namePlural": "listingas", - "nameSingular": "Not_Camel_Case", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "listingas", + "nameSingular": "Not_Camel_Case", + }, + "type": "create_object", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name should be in camelCase", + "userFriendlyMessage": "Name should be in camelCase", + "value": "Not_Camel_Case", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "Not_Camel_Case", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "Not_Camel_Case", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name should be in camelCase", + "userFriendlyMessage": "Name should be in camelCase", + "value": "Not_Camel_Case", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "Not_Camel_Case", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "Not_Camel_Case", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name should be in camelCase", + "userFriendlyMessage": "Name should be in camelCase", + "value": "Not_Camel_Case", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "Not_Camel_Case", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "Not_Camel_Case", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name should be in camelCase", + "userFriendlyMessage": "Name should be in camelCase", + "value": "Not_Camel_Case", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "Not_Camel_Case", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "Not_Camel_Case", + "objectMetadataId": Any, + }, + "type": "create_field", + }, + { + "errors": [ + { + "code": "INVALID_FIELD_INPUT", + "message": "Name should be in camelCase", + "userFriendlyMessage": "Name should be in camelCase", + "value": "Not_Camel_Case", + }, + { + "code": "INVALID_FIELD_INPUT", + "message": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "userFriendlyMessage": "Name is not valid: it must start with lowercase letter and contain only alphanumeric letters", + "value": "Not_Camel_Case", + }, + ], + "flatEntityMinimalInformation": { + "id": Any, + "name": "Not_Camel_Case", + "objectMetadataId": Any, + }, + "type": "create_field", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 5 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 5, - "invalidObjects": 1, - "totalErrors": 6, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 5 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -1338,7 +1458,6 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -1349,21 +1468,25 @@ exports[`Object metadata creation should fail v2 when names are identical 1`] = "value": "fooBar", }, ], - "fields": [], - "id": Any, - "namePlural": "fooBar", - "nameSingular": "fooBar", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "fooBar", + "nameSingular": "fooBar", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", @@ -1375,7 +1498,6 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res "extensions": { "code": "BAD_USER_INPUT", "errors": { - "fieldMetadata": [], "objectMetadata": [ { "errors": [ @@ -1386,21 +1508,25 @@ exports[`Object metadata creation should fail v2 when names with whitespaces res "value": "fooBar", }, ], - "fields": [], - "id": Any, - "namePlural": "fooBar", - "nameSingular": "fooBar", - "operation": "create_object", + "flatEntityMinimalInformation": { + "id": Any, + "namePlural": "fooBar", + "nameSingular": "fooBar", + }, + "type": "create_object", }, ], + "view": [], + "viewField": [], }, - "message": "Validation failed for 1 object(s) and 0 field(s)", + "message": "Validation failed for 0 object(s) and 0 field(s)", "summary": { - "invalidFields": 0, - "invalidObjects": 1, - "totalErrors": 1, + "invalidObjectMetadatas": 0, + "invalidViewFields": 0, + "invalidViews": 0, + "totalErrors": 0, }, - "userFriendlyMessage": "Validation failed for 1 object(s) and 0 field(s)", + "userFriendlyMessage": "Validation failed for 0 object(s) and 0 field(s)", }, "message": "Multiple validation errors occurred while creating object", "name": "GraphQLError", diff --git a/packages/twenty-server/test/integration/metadata/suites/object-metadata/morph-relation/rename-object-metadata-with-morph-relation-v2.integration-spec.ts b/packages/twenty-server/test/integration/metadata/suites/object-metadata/morph-relation/rename-object-metadata-with-morph-relation-v2.integration-spec.ts index fce0561c36..956696149c 100644 --- a/packages/twenty-server/test/integration/metadata/suites/object-metadata/morph-relation/rename-object-metadata-with-morph-relation-v2.integration-spec.ts +++ b/packages/twenty-server/test/integration/metadata/suites/object-metadata/morph-relation/rename-object-metadata-with-morph-relation-v2.integration-spec.ts @@ -1,11 +1,11 @@ import { findManyFieldsMetadataQueryFactory } from 'test/integration/metadata/suites/field-metadata/utils/find-many-fields-metadata-query-factory.util'; import { createMorphRelationBetweenObjects } from 'test/integration/metadata/suites/object-metadata/utils/create-morph-relation-between-objects.util'; import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util'; -import { forceCreateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/force-create-one-object-metadata.util'; import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util'; import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; import { updateFeatureFlag } from 'test/integration/metadata/suites/utils/update-feature-flag.util'; import { FieldMetadataType } from 'twenty-shared/types'; +import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util'; import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; @@ -37,7 +37,7 @@ describe('Rename an object metadata with morph relation should succeed', () => { data: { createOneObject: { id: aId }, }, - } = await forceCreateOneObjectMetadata({ + } = await createOneObjectMetadata({ input: { nameSingular: 'opportunityForRenameSecond', namePlural: 'opportunitiesForRenameSecond', @@ -52,7 +52,7 @@ describe('Rename an object metadata with morph relation should succeed', () => { data: { createOneObject: { id: bId }, }, - } = await forceCreateOneObjectMetadata({ + } = await createOneObjectMetadata({ input: { nameSingular: 'personForRenameSecond', namePlural: 'peopleForRenameSecond', @@ -67,7 +67,7 @@ describe('Rename an object metadata with morph relation should succeed', () => { data: { createOneObject: { id: cId }, }, - } = await forceCreateOneObjectMetadata({ + } = await createOneObjectMetadata({ input: { nameSingular: 'companyForRenameSecond', namePlural: 'companiesForRenameSecond', diff --git a/packages/twenty-server/test/integration/graphql/utils/create-view-field-operation-factory.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/create-core-view-field-query-factory.util.ts similarity index 50% rename from packages/twenty-server/test/integration/graphql/utils/create-view-field-operation-factory.util.ts rename to packages/twenty-server/test/integration/metadata/suites/view-field/utils/create-core-view-field-query-factory.util.ts index 87ccaabf9a..7b759d0e11 100644 --- a/packages/twenty-server/test/integration/graphql/utils/create-view-field-operation-factory.util.ts +++ b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/create-core-view-field-query-factory.util.ts @@ -1,17 +1,13 @@ import gql from 'graphql-tag'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; import { VIEW_FIELD_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; -import { type ViewFieldEntity } from 'src/engine/core-modules/view/entities/view-field.entity'; +import { type CreateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/create-view-field.input'; -type CreateViewFieldOperationFactoryParams = { - gqlFields?: string; - data?: Partial; -}; - -export const createViewFieldOperationFactory = ({ +export const createCoreViewFieldQueryFactory = ({ gqlFields = VIEW_FIELD_GQL_FIELDS, - data = {}, -}: CreateViewFieldOperationFactoryParams = {}) => ({ + input, +}: PerformMetadataQueryParams) => ({ query: gql` mutation CreateCoreViewField($input: CreateViewFieldInput!) { createCoreViewField(input: $input) { @@ -20,6 +16,6 @@ export const createViewFieldOperationFactory = ({ } `, variables: { - input: data, + input, }, }); diff --git a/packages/twenty-server/test/integration/metadata/suites/view-field/utils/create-one-core-view-field.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/create-one-core-view-field.util.ts new file mode 100644 index 0000000000..ec880eed40 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/create-one-core-view-field.util.ts @@ -0,0 +1,40 @@ +import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; +import { createCoreViewFieldQueryFactory } from 'test/integration/metadata/suites/view-field/utils/create-core-view-field-query-factory.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; + +import { type CreateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/create-view-field.input'; +import { type ViewFieldEntity } from 'src/engine/core-modules/view/entities/view-field.entity'; + +export const createOneCoreViewField = async ({ + input, + gqlFields, + expectToFail, +}: PerformMetadataQueryParams): CommonResponseBody<{ + createCoreViewField: ViewFieldEntity; +}> => { + const graphqlOperation = createCoreViewFieldQueryFactory({ + input, + gqlFields, + }); + + const response = await makeMetadataAPIRequest(graphqlOperation); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'View Field creation should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'View Field creation has failed but should not', + }); + } + + return { data: response.body.data, errors: response.body.errors }; +}; diff --git a/packages/twenty-server/test/integration/metadata/suites/view-field/utils/delete-core-view-field-query-factory.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/delete-core-view-field-query-factory.util.ts new file mode 100644 index 0000000000..b156a64a5d --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/delete-core-view-field-query-factory.util.ts @@ -0,0 +1,21 @@ +import gql from 'graphql-tag'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { VIEW_FIELD_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; + +import { type DeleteViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/delete-view-field.input'; + +export const deleteCoreViewFieldQueryFactory = ({ + gqlFields = VIEW_FIELD_GQL_FIELDS, + input, +}: PerformMetadataQueryParams) => ({ + query: gql` + mutation DeleteCoreViewField($input: DeleteViewFieldInput!) { + deleteCoreViewField(input: $input) { + ${gqlFields} + } + } + `, + variables: { + input, + }, +}); diff --git a/packages/twenty-server/test/integration/metadata/suites/view-field/utils/delete-one-core-view-field.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/delete-one-core-view-field.util.ts new file mode 100644 index 0000000000..8c5d30589c --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/delete-one-core-view-field.util.ts @@ -0,0 +1,40 @@ +import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; +import { deleteCoreViewFieldQueryFactory } from 'test/integration/metadata/suites/view-field/utils/delete-core-view-field-query-factory.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; + +import { type DeleteViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/delete-view-field.input'; +import { type ViewFieldEntity } from 'src/engine/core-modules/view/entities/view-field.entity'; + +export const deleteOneCoreViewField = async ({ + input, + gqlFields, + expectToFail, +}: PerformMetadataQueryParams): CommonResponseBody<{ + deleteCoreViewField: ViewFieldEntity; +}> => { + const graphqlOperation = deleteCoreViewFieldQueryFactory({ + input, + gqlFields, + }); + + const response = await makeMetadataAPIRequest(graphqlOperation); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'View Field deletion should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'View Field deletion has failed but should not', + }); + } + + return { data: response.body.data, errors: response.body.errors }; +}; diff --git a/packages/twenty-server/test/integration/metadata/suites/view-field/utils/destroy-core-view-field-query-factory.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/destroy-core-view-field-query-factory.util.ts new file mode 100644 index 0000000000..ac9a5fb715 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/destroy-core-view-field-query-factory.util.ts @@ -0,0 +1,21 @@ +import gql from 'graphql-tag'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { VIEW_FIELD_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; + +import { type DestroyViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/destroy-view-field.input'; + +export const destroyCoreViewFieldQueryFactory = ({ + gqlFields = VIEW_FIELD_GQL_FIELDS, + input, +}: PerformMetadataQueryParams) => ({ + query: gql` + mutation DestroyCoreViewField($input: DestroyViewFieldInput!) { + destroyCoreViewField(input: $input) { + ${gqlFields} + } + } + `, + variables: { + input, + }, +}); diff --git a/packages/twenty-server/test/integration/metadata/suites/view-field/utils/destroy-one-core-view-field.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/destroy-one-core-view-field.util.ts new file mode 100644 index 0000000000..894a40b304 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/destroy-one-core-view-field.util.ts @@ -0,0 +1,40 @@ +import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; +import { destroyCoreViewFieldQueryFactory } from 'test/integration/metadata/suites/view-field/utils/destroy-core-view-field-query-factory.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; + +import { type DestroyViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/destroy-view-field.input'; +import { type ViewFieldEntity } from 'src/engine/core-modules/view/entities/view-field.entity'; + +export const destroyOneCoreViewField = async ({ + input, + gqlFields, + expectToFail, +}: PerformMetadataQueryParams): CommonResponseBody<{ + destroyCoreViewField: ViewFieldEntity; +}> => { + const graphqlOperation = destroyCoreViewFieldQueryFactory({ + input, + gqlFields, + }); + + const response = await makeMetadataAPIRequest(graphqlOperation); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'View Field destruction should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'View Field destruction has failed but should not', + }); + } + + return { data: response.body.data, errors: response.body.errors }; +}; diff --git a/packages/twenty-server/test/integration/graphql/utils/update-view-field-operation-factory.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/update-core-view-field-query-factory.util.ts similarity index 68% rename from packages/twenty-server/test/integration/graphql/utils/update-view-field-operation-factory.util.ts rename to packages/twenty-server/test/integration/metadata/suites/view-field/utils/update-core-view-field-query-factory.util.ts index 281ef8d3fb..d967e0205c 100644 --- a/packages/twenty-server/test/integration/graphql/utils/update-view-field-operation-factory.util.ts +++ b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/update-core-view-field-query-factory.util.ts @@ -1,15 +1,13 @@ import gql from 'graphql-tag'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; import { VIEW_FIELD_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; import { type UpdateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/update-view-field.input'; -export const updateViewFieldOperationFactory = ({ +export const updateCoreViewFieldQueryFactory = ({ gqlFields = VIEW_FIELD_GQL_FIELDS, input, -}: { - gqlFields?: string; - input: UpdateViewFieldInput; -}) => ({ +}: PerformMetadataQueryParams) => ({ query: gql` mutation UpdateCoreViewField($input: UpdateViewFieldInput!) { updateCoreViewField(input: $input) { diff --git a/packages/twenty-server/test/integration/metadata/suites/view-field/utils/update-one-core-view-field.util.ts b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/update-one-core-view-field.util.ts new file mode 100644 index 0000000000..0883ba3be7 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view-field/utils/update-one-core-view-field.util.ts @@ -0,0 +1,40 @@ +import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; +import { updateCoreViewFieldQueryFactory } from 'test/integration/metadata/suites/view-field/utils/update-core-view-field-query-factory.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; + +import { type UpdateViewFieldInput } from 'src/engine/core-modules/view/dtos/inputs/update-view-field.input'; +import { type ViewFieldEntity } from 'src/engine/core-modules/view/entities/view-field.entity'; + +export const updateOneCoreViewField = async ({ + input, + gqlFields, + expectToFail, +}: PerformMetadataQueryParams): CommonResponseBody<{ + updateCoreViewField: ViewFieldEntity; +}> => { + const graphqlOperation = updateCoreViewFieldQueryFactory({ + input, + gqlFields, + }); + + const response = await makeMetadataAPIRequest(graphqlOperation); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'View Field update should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'View Field update has failed but should not', + }); + } + + return { data: response.body.data, errors: response.body.errors }; +}; diff --git a/packages/twenty-server/test/integration/metadata/suites/view/utils/create-core-view-query-factory.util.ts b/packages/twenty-server/test/integration/metadata/suites/view/utils/create-core-view-query-factory.util.ts new file mode 100644 index 0000000000..2d258d530e --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view/utils/create-core-view-query-factory.util.ts @@ -0,0 +1,21 @@ +import gql from 'graphql-tag'; +import { VIEW_GQL_FIELDS } from 'test/integration/constants/view-gql-fields.constants'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; + +import { type CreateViewInput } from 'src/engine/core-modules/view/dtos/inputs/create-view.input'; + +export const createCoreViewQueryFactory = ({ + gqlFields = VIEW_GQL_FIELDS, + input, +}: PerformMetadataQueryParams) => ({ + query: gql` + mutation CreateCoreView($input: CreateViewInput!) { + createCoreView(input: $input) { + ${gqlFields} + } + } + `, + variables: { + input, + }, +}); diff --git a/packages/twenty-server/test/integration/metadata/suites/view/utils/create-one-core-view.util.ts b/packages/twenty-server/test/integration/metadata/suites/view/utils/create-one-core-view.util.ts new file mode 100644 index 0000000000..42a89ebbe5 --- /dev/null +++ b/packages/twenty-server/test/integration/metadata/suites/view/utils/create-one-core-view.util.ts @@ -0,0 +1,41 @@ +import { makeMetadataAPIRequest } from 'test/integration/metadata/suites/utils/make-metadata-api-request.util'; +import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type'; +import { type PerformMetadataQueryParams } from 'test/integration/metadata/types/perform-metadata-query.type'; +import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util'; +import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util'; + +import { type CreateViewInput } from 'src/engine/core-modules/view/dtos/inputs/create-view.input'; +import { type ViewEntity } from 'src/engine/core-modules/view/entities/view.entity'; + +import { createCoreViewQueryFactory } from './create-core-view-query-factory.util'; + +export const createOneCoreView = async ({ + input, + gqlFields, + expectToFail, +}: PerformMetadataQueryParams): CommonResponseBody<{ + createCoreView: ViewEntity; +}> => { + const graphqlOperation = createCoreViewQueryFactory({ + input, + gqlFields, + }); + + const response = await makeMetadataAPIRequest(graphqlOperation); + + if (expectToFail === true) { + warnIfNoErrorButExpectedToFail({ + response, + errorMessage: 'View creation should have failed but did not', + }); + } + + if (expectToFail === false) { + warnIfErrorButNotExpectedToFail({ + response, + errorMessage: 'View creation has failed but should not', + }); + } + + return { data: response.body.data, errors: response.body.errors }; +};