diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-backfill-view-main-group-by-field-metadata-id.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-backfill-view-main-group-by-field-metadata-id.command.ts deleted file mode 100644 index dd5caa28fc..0000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-backfill-view-main-group-by-field-metadata-id.command.ts +++ /dev/null @@ -1,210 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { isDefined } from 'twenty-shared/utils'; -import { In, IsNull, Not, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { MigrationCommandOptions } from 'src/database/commands/command-runners/migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; -import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; - -@Command({ - name: 'upgrade:1-13:backfill:view-main-group-by-field-metadata-id', - description: - 'Backfill mainGroupByFieldMetadataId on views and clean up inconsistent viewGroups', -}) -export class BackfillViewMainGroupByFieldMetadataIdCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(ViewEntity) - private readonly viewRepository: Repository, - @InjectRepository(ViewGroupEntity) - private readonly viewGroupRepository: Repository, - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - await this.backfillMainGroupByFieldMetadataId(workspaceId, options); - await this.cleanupInconsistentViewGroups(workspaceId, options); - } - - private async backfillMainGroupByFieldMetadataId( - workspaceId: string, - options: MigrationCommandOptions, - ): Promise { - this.logger.log( - `Starting backfill of mainGroupByFieldMetadataId for workspace ${workspaceId}...`, - ); - - const viewsToBackfill = await this.viewRepository.find({ - where: { - mainGroupByFieldMetadataId: IsNull(), - workspaceId, - }, - select: ['id', 'workspaceId'], - }); - - this.logger.log( - `Found ${viewsToBackfill.length} views with null mainGroupByFieldMetadataId`, - ); - - let backfilledCount = 0; - let inconsistentViewsCount = 0; - - for (const view of viewsToBackfill) { - const nonDeletedViewGroups = await this.viewGroupRepository.find({ - where: { - viewId: view.id, - deletedAt: IsNull(), - workspaceId, - }, - select: ['id', 'fieldMetadataId'], - }); - - if (nonDeletedViewGroups.length === 0) { - continue; - } - - const uniqueFieldMetadataIds = [ - ...new Set(nonDeletedViewGroups.map((vg) => vg.fieldMetadataId)), - ]; - - if (uniqueFieldMetadataIds.length === 1) { - const fieldMetadataId = uniqueFieldMetadataIds[0]; - - if (options.dryRun) { - this.logger.log( - `[DRY RUN] Would backfill view ${view.id} (workspace ${view.workspaceId}) with fieldMetadataId ${fieldMetadataId}`, - ); - } else { - await this.viewRepository.update( - { id: view.id, workspaceId }, - { mainGroupByFieldMetadataId: fieldMetadataId }, - ); - this.logger.log( - `Backfilled view ${view.id} (workspace ${view.workspaceId}) with fieldMetadataId ${fieldMetadataId}`, - ); - } - backfilledCount++; - } else { - this.logger.error( - `Inconsistency detected for view ${view.id} (workspace ${view.workspaceId}): found ${uniqueFieldMetadataIds.length} different fieldMetadataIds`, - ); - - const fieldMetadataIdCounts = new Map(); - - for (const vg of nonDeletedViewGroups) { - const count = fieldMetadataIdCounts.get(vg.fieldMetadataId) || 0; - - fieldMetadataIdCounts.set(vg.fieldMetadataId, count + 1); - } - - let mostNumerousFieldMetadataId = ''; - let maxCount = 0; - - for (const [ - fieldMetadataId, - count, - ] of fieldMetadataIdCounts.entries()) { - if (count > maxCount) { - maxCount = count; - mostNumerousFieldMetadataId = fieldMetadataId; - } - } - - if (options.dryRun) { - this.logger.log( - `[DRY RUN] Would backfill view ${view.id} (workspace ${view.workspaceId}) with fieldMetadataId ${mostNumerousFieldMetadataId} (most numerous, found ${maxCount} occurrences)`, - ); - } else { - await this.viewRepository.update( - { id: view.id }, - { mainGroupByFieldMetadataId: mostNumerousFieldMetadataId }, - ); - this.logger.log( - `Backfilled view ${view.id} (workspace ${view.workspaceId}) with fieldMetadataId ${mostNumerousFieldMetadataId} (most numerous, found ${maxCount} occurrences)`, - ); - } - backfilledCount++; - inconsistentViewsCount++; - } - } - - this.logger.log( - `${options.dryRun ? '[DRY RUN] Would have ' : ''}Backfilled ${backfilledCount} views${inconsistentViewsCount > 0 ? ` (${inconsistentViewsCount} with inconsistencies)` : ''}`, - ); - } - - private async cleanupInconsistentViewGroups( - workspaceId: string, - options: MigrationCommandOptions, - ): Promise { - this.logger.log('Starting cleanup of inconsistent viewGroups...'); - - const viewsWithMainGroupBy = await this.viewRepository.find({ - where: { - mainGroupByFieldMetadataId: Not(IsNull()), - workspaceId, - }, - select: ['id', 'mainGroupByFieldMetadataId'], - }); - - this.logger.log( - `Found ${viewsWithMainGroupBy.length} views with mainGroupByFieldMetadataId set`, - ); - - let totalDeletedCount = 0; - - for (const view of viewsWithMainGroupBy) { - if (!isDefined(view.mainGroupByFieldMetadataId)) { - continue; - } - - const inconsistentViewGroups = await this.viewGroupRepository.find({ - where: { - viewId: view.id, - fieldMetadataId: Not(view.mainGroupByFieldMetadataId), - workspaceId, - }, - select: ['id'], - }); - - if (inconsistentViewGroups.length === 0) { - continue; - } - - const viewGroupIds = inconsistentViewGroups.map((vg) => vg.id); - - if (options.dryRun) { - this.logger.log( - `[DRY RUN] Would delete ${inconsistentViewGroups.length} viewGroups from view ${view.id}`, - ); - } else { - await this.viewGroupRepository.delete({ - id: In(viewGroupIds), - workspaceId, - }); - this.logger.log( - `Deleted ${inconsistentViewGroups.length} viewGroups from view ${view.id}`, - ); - } - totalDeletedCount += inconsistentViewGroups.length; - } - - this.logger.log( - `${options.dryRun ? '[DRY RUN] Would have ' : ''}Deleted ${totalDeletedCount} inconsistent viewGroups`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-upgrade-version-command.module.ts index 1e6e964f71..e529ee3210 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-upgrade-version-command.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-upgrade-version-command.module.ts @@ -2,7 +2,6 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { BackfillPageLayoutUniversalIdentifiersCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-backfill-page-layout-universal-identifiers.command'; -import { BackfillViewMainGroupByFieldMetadataIdCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-backfill-view-main-group-by-field-metadata-id.command'; import { CleanEmptyStringNullInTextFieldsCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-clean-empty-string-null-in-text-fields.command'; import { DeduplicateRoleTargetsCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-deduplicate-role-targets.command'; import { MigrateStandardInvalidEntitiesCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-migrate-standard-invalid-entities.command'; @@ -59,7 +58,6 @@ import { TimelineActivityWorkspaceEntity } from 'src/modules/timeline/standard-o ], providers: [ CleanEmptyStringNullInTextFieldsCommand, - BackfillViewMainGroupByFieldMetadataIdCommand, BackfillPageLayoutUniversalIdentifiersCommand, DeduplicateRoleTargetsCommand, RenameIndexNameCommand, @@ -69,7 +67,6 @@ import { TimelineActivityWorkspaceEntity } from 'src/modules/timeline/standard-o ], exports: [ CleanEmptyStringNullInTextFieldsCommand, - BackfillViewMainGroupByFieldMetadataIdCommand, BackfillPageLayoutUniversalIdentifiersCommand, DeduplicateRoleTargetsCommand, RenameIndexNameCommand, diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts index 8ff4a33b88..1c3c25683f 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts @@ -10,7 +10,6 @@ import { type VersionCommands, } from 'src/database/commands/command-runners/upgrade.command-runner'; import { BackfillPageLayoutUniversalIdentifiersCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-backfill-page-layout-universal-identifiers.command'; -import { BackfillViewMainGroupByFieldMetadataIdCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-backfill-view-main-group-by-field-metadata-id.command'; import { CleanEmptyStringNullInTextFieldsCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-clean-empty-string-null-in-text-fields.command'; import { DeduplicateRoleTargetsCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-deduplicate-role-targets.command'; import { MigrateStandardInvalidEntitiesCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-migrate-standard-invalid-entities.command'; @@ -43,7 +42,6 @@ export class UpgradeCommand extends UpgradeCommandRunner { protected readonly updateRoleTargetsUniqueConstraintMigrationCommand: UpdateRoleTargetsUniqueConstraintMigrationCommand, protected readonly backfillPageLayoutUniversalIdentifiersCommand: BackfillPageLayoutUniversalIdentifiersCommand, protected readonly migrateStandardInvalidEntitiesCommand: MigrateStandardInvalidEntitiesCommand, - protected readonly backfillViewMainGroupByFieldMetadataIdCommand: BackfillViewMainGroupByFieldMetadataIdCommand, protected readonly cleanEmptyStringNullInTextFieldsCommand: CleanEmptyStringNullInTextFieldsCommand, protected readonly renameIndexNameCommand: RenameIndexNameCommand, @@ -66,7 +64,6 @@ export class UpgradeCommand extends UpgradeCommandRunner { this.updateRoleTargetsUniqueConstraintMigrationCommand, this.backfillPageLayoutUniversalIdentifiersCommand, this.migrateStandardInvalidEntitiesCommand, - this.backfillViewMainGroupByFieldMetadataIdCommand, this.cleanEmptyStringNullInTextFieldsCommand, this.renameIndexNameCommand, ]; diff --git a/packages/twenty-server/src/database/typeorm/core/migrations/common/1765808791153-remove-field-metadata-id-in-view-group.ts b/packages/twenty-server/src/database/typeorm/core/migrations/common/1765808791153-remove-field-metadata-id-in-view-group.ts new file mode 100644 index 0000000000..4171dc5111 --- /dev/null +++ b/packages/twenty-server/src/database/typeorm/core/migrations/common/1765808791153-remove-field-metadata-id-in-view-group.ts @@ -0,0 +1,25 @@ +import { type MigrationInterface, type QueryRunner } from 'typeorm'; + +export class RemoveFieldMetadataIdInViewGroup1765808791153 + implements MigrationInterface +{ + name = 'RemoveFieldMetadataIdInViewGroup1765808791153'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "core"."viewGroup" DROP CONSTRAINT "FK_b3aa7ec58cdd9e83729f2232591"`, + ); + await queryRunner.query( + `ALTER TABLE "core"."viewGroup" DROP COLUMN "fieldMetadataId"`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "core"."viewGroup" ADD "fieldMetadataId" uuid`, + ); + await queryRunner.query( + `ALTER TABLE "core"."viewGroup" ADD CONSTRAINT "FK_b3aa7ec58cdd9e83729f2232591" FOREIGN KEY ("fieldMetadataId") REFERENCES "core"."fieldMetadata"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, + ); + } +} diff --git a/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-many-query-runner/utils/__tests__/get-conflicting-fields.util.spec.ts b/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-many-query-runner/utils/__tests__/get-conflicting-fields.util.spec.ts index 4140dbe79c..4cd15e3c93 100644 --- a/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-many-query-runner/utils/__tests__/get-conflicting-fields.util.spec.ts +++ b/packages/twenty-server/src/engine/api/common/common-query-runners/common-create-many-query-runner/utils/__tests__/get-conflicting-fields.util.spec.ts @@ -26,7 +26,6 @@ describe('getConflictingFields', () => { universalIdentifier: overrides.id, viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonObjectMetadata.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonObjectMetadata.ts index 72fbebd9cb..ac15fa640f 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonObjectMetadata.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/__mocks__/mockPersonObjectMetadata.ts @@ -26,7 +26,6 @@ const mockFieldMetadatas: FlatFieldMetadata[] = [ universalIdentifier: 'name-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -48,7 +47,6 @@ const mockFieldMetadatas: FlatFieldMetadata[] = [ universalIdentifier: 'emails-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -71,7 +69,6 @@ const mockFieldMetadatas: FlatFieldMetadata[] = [ universalIdentifier: 'linkedinLink-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -90,7 +87,6 @@ const mockFieldMetadatas: FlatFieldMetadata[] = [ universalIdentifier: 'jobTitle-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, diff --git a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/utils/__tests__/build-columns-to-select.spec.ts b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/utils/__tests__/build-columns-to-select.spec.ts index 96002fb057..2e38db16db 100644 --- a/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/utils/__tests__/build-columns-to-select.spec.ts +++ b/packages/twenty-server/src/engine/api/graphql/graphql-query-runner/utils/__tests__/build-columns-to-select.spec.ts @@ -32,7 +32,6 @@ describe('buildColumnsToSelect', () => { universalIdentifier: overrides.id, viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, diff --git a/packages/twenty-server/src/engine/api/rest/core/rest-to-common-args-handlers/utils/__tests__/get-all-selectable-fields.util.spec.ts b/packages/twenty-server/src/engine/api/rest/core/rest-to-common-args-handlers/utils/__tests__/get-all-selectable-fields.util.spec.ts index 3f49092f82..80d6b7ef99 100644 --- a/packages/twenty-server/src/engine/api/rest/core/rest-to-common-args-handlers/utils/__tests__/get-all-selectable-fields.util.spec.ts +++ b/packages/twenty-server/src/engine/api/rest/core/rest-to-common-args-handlers/utils/__tests__/get-all-selectable-fields.util.spec.ts @@ -23,7 +23,6 @@ describe('getAllSelectableFields', () => { universalIdentifier: overrides.id, viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, diff --git a/packages/twenty-server/src/engine/api/utils/__tests__/compute-cursor-arg-filter.utils.spec.ts b/packages/twenty-server/src/engine/api/utils/__tests__/compute-cursor-arg-filter.utils.spec.ts index 998a43baa5..25c55c774f 100644 --- a/packages/twenty-server/src/engine/api/utils/__tests__/compute-cursor-arg-filter.utils.spec.ts +++ b/packages/twenty-server/src/engine/api/utils/__tests__/compute-cursor-arg-filter.utils.spec.ts @@ -27,7 +27,6 @@ describe('computeCursorArgFilter', () => { universalIdentifier: overrides.id, viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts index 7aa0bc81db..39b101b3ab 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.entity.ts @@ -30,7 +30,6 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat import { FieldPermissionEntity } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.entity'; import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; import { ViewFilterEntity } from 'src/engine/metadata-modules/view-filter/entities/view-filter.entity'; -import { ViewGroupEntity } from 'src/engine/metadata-modules/view-group/entities/view-group.entity'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; @Entity('fieldMetadata') @@ -201,9 +200,6 @@ export class FieldMetadataEntity< @OneToMany(() => ViewFilterEntity, (viewFilter) => viewFilter.fieldMetadata) viewFilters: Relation; - @OneToMany(() => ViewGroupEntity, (viewGroup) => viewGroup.fieldMetadata) - viewGroups: Relation; - @OneToMany( () => ViewEntity, (view) => view.kanbanAggregateOperationFieldMetadata, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts index fdfbca445d..4d8e03355a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type.ts @@ -15,7 +15,6 @@ export const FIELD_METADATA_RELATION_PROPERTIES = [ 'kanbanAggregateOperationViews', 'calendarViews', 'mainGroupByFieldMetadataViews', - 'viewGroups', ] as const satisfies (keyof FieldMetadataEntity)[]; export type FieldMetadataEntityRelationProperties = diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-enum-flat-field-metadata-is-nullable-update.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-enum-flat-field-metadata-is-nullable-update.util.ts index 48bdbe7028..e3b28c4b83 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-enum-flat-field-metadata-is-nullable-update.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/recompute-view-groups-on-enum-flat-field-metadata-is-nullable-update.util.ts @@ -79,7 +79,6 @@ export const recomputeViewGroupsOnEnumFlatFieldMetadataIsNullableUpdate = ({ deletedAt: null, viewId, applicationId: toFlatFieldMetadata.applicationId, - fieldMetadataId: fromFlatFieldMetadata.id, }); } else if (isDefined(emptyValueFlatViewGroup)) { sideEffectResult.flatViewGroupsToDelete.push(emptyValueFlatViewGroup); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts index 3d6c17d55e..a45e8ce2b1 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/constants/flat-view-group-editable-properties.constant.ts @@ -4,5 +4,4 @@ export const FLAT_VIEW_GROUP_EDITABLE_PROPERTIES = [ 'isVisible', 'fieldValue', 'position', - 'fieldMetadataId', ] as const satisfies (keyof FlatViewGroup)[]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts index b28955cd27..71f1ec3b88 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/compute-flat-view-groups-on-view-create.util.ts @@ -58,7 +58,6 @@ export const computeFlatViewGroupsOnViewCreate = ({ flatViewGroups.push({ id: emptyGroupId, - fieldMetadataId: mainGroupByFieldMetadata.id, viewId: flatViewToCreateId, workspaceId: mainGroupByFieldMetadata.workspaceId, createdAt, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts index 3369037b32..67fd4323ac 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-view-group/utils/from-create-view-group-input-to-flat-view-group-to-create.util.ts @@ -8,12 +8,10 @@ export const fromCreateViewGroupInputToFlatViewGroupToCreate = ({ createViewGroupInput: rawCreateViewGroupInput, workspaceId, workspaceCustomApplicationId, - mainGroupByFieldMetadataId, }: { createViewGroupInput: CreateViewGroupInput; workspaceId: string; workspaceCustomApplicationId: string; - mainGroupByFieldMetadataId: string; }): FlatViewGroup => { const { viewId, ...createViewGroupInput } = trimAndRemoveDuplicatedWhitespacesFromObjectStringProperties( @@ -26,7 +24,6 @@ export const fromCreateViewGroupInputToFlatViewGroupToCreate = ({ return { id: viewGroupId, - fieldMetadataId: mainGroupByFieldMetadataId, // Mandatory because non-nullable until we completely remove it viewId, workspaceId, createdAt: createdAt, diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts index c002df713d..2f1456526b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/entities/view-group.entity.ts @@ -14,7 +14,6 @@ import { import { SyncableEntity } from 'src/engine/workspace-manager/workspace-sync/interfaces/syncable-entity.interface'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; @Entity({ name: 'viewGroup', schema: 'core' }) @@ -29,15 +28,6 @@ export class ViewGroupEntity @PrimaryGeneratedColumn('uuid') id: string; - @Column({ nullable: false, type: 'uuid' }) - fieldMetadataId: string; - - @ManyToOne(() => FieldMetadataEntity, { - onDelete: 'CASCADE', - }) - @JoinColumn({ name: 'fieldMetadataId' }) - fieldMetadata: Relation; - @Column({ nullable: false, default: true }) isVisible: boolean; diff --git a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts index c0e68199fc..182a6f997d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/view-group/services/view-group.service.ts @@ -101,7 +101,6 @@ export class ViewGroupService { createViewGroupInput, workspaceId, workspaceCustomApplicationId: workspaceCustomFlatApplication.id, - mainGroupByFieldMetadataId, }); }, ); diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/compute-relation-connect-query-configs.util.spec.ts b/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/compute-relation-connect-query-configs.util.spec.ts index 0de37cf278..80dea8d160 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/compute-relation-connect-query-configs.util.spec.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/compute-relation-connect-query-configs.util.spec.ts @@ -23,7 +23,6 @@ describe('computeRelationConnectQueryConfigs', () => { universalIdentifier: 'person-id-field-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -41,7 +40,6 @@ describe('computeRelationConnectQueryConfigs', () => { universalIdentifier: 'person-name-field-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -59,7 +57,6 @@ describe('computeRelationConnectQueryConfigs', () => { universalIdentifier: 'person-company-1-field-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -83,7 +80,6 @@ describe('computeRelationConnectQueryConfigs', () => { universalIdentifier: 'person-company-2-field-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -110,7 +106,6 @@ describe('computeRelationConnectQueryConfigs', () => { universalIdentifier: 'company-id-field-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -128,7 +123,6 @@ describe('computeRelationConnectQueryConfigs', () => { universalIdentifier: 'company-name-field-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -146,7 +140,6 @@ describe('computeRelationConnectQueryConfigs', () => { universalIdentifier: 'company-description-field-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -164,7 +157,6 @@ describe('computeRelationConnectQueryConfigs', () => { universalIdentifier: 'company-domain-name-field-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, @@ -182,7 +174,6 @@ describe('computeRelationConnectQueryConfigs', () => { universalIdentifier: 'company-address-field-id', viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], applicationId: null, diff --git a/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-field-metadata-id-to-column-names-map.util.spec.ts b/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-field-metadata-id-to-column-names-map.util.spec.ts index 35ba0ae57c..d40ea7500a 100644 --- a/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-field-metadata-id-to-column-names-map.util.spec.ts +++ b/packages/twenty-server/src/engine/twenty-orm/utils/__tests__/get-field-metadata-id-to-column-names-map.util.spec.ts @@ -60,7 +60,6 @@ describe('getFieldMetadataIdToColumnNamesMap', () => { universalIdentifier: id, viewFieldIds: [], viewFilterIds: [], - viewGroupIds: [], kanbanAggregateOperationViewIds: [], calendarViewIds: [], mainGroupByFieldMetadataViewIds: [], diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/compute-standard-opportunity-view-groups.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/compute-standard-opportunity-view-groups.util.ts index 32f3262f5e..e242b1f66d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/compute-standard-opportunity-view-groups.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/compute-standard-opportunity-view-groups.util.ts @@ -14,7 +14,6 @@ export const computeStandardOpportunityViewGroups = ( context: { viewName: 'byStage', viewGroupName: 'new', - fieldName: 'stage', isVisible: true, fieldValue: 'NEW', position: 0, @@ -26,7 +25,6 @@ export const computeStandardOpportunityViewGroups = ( context: { viewName: 'byStage', viewGroupName: 'screening', - fieldName: 'stage', isVisible: true, fieldValue: 'SCREENING', position: 1, @@ -38,7 +36,6 @@ export const computeStandardOpportunityViewGroups = ( context: { viewName: 'byStage', viewGroupName: 'meeting', - fieldName: 'stage', isVisible: true, fieldValue: 'MEETING', position: 2, @@ -50,7 +47,6 @@ export const computeStandardOpportunityViewGroups = ( context: { viewName: 'byStage', viewGroupName: 'proposal', - fieldName: 'stage', isVisible: true, fieldValue: 'PROPOSAL', position: 3, @@ -62,7 +58,6 @@ export const computeStandardOpportunityViewGroups = ( context: { viewName: 'byStage', viewGroupName: 'customer', - fieldName: 'stage', isVisible: true, fieldValue: 'CUSTOMER', position: 4, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/compute-standard-task-view-groups.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/compute-standard-task-view-groups.util.ts index f26b3f4558..9bfd163ced 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/compute-standard-task-view-groups.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/compute-standard-task-view-groups.util.ts @@ -14,7 +14,6 @@ export const computeStandardTaskViewGroups = ( context: { viewName: 'assignedToMe', viewGroupName: 'todo', - fieldName: 'status', isVisible: true, fieldValue: 'TODO', position: 0, @@ -26,7 +25,6 @@ export const computeStandardTaskViewGroups = ( context: { viewName: 'assignedToMe', viewGroupName: 'inProgress', - fieldName: 'status', isVisible: true, fieldValue: 'IN_PROGRESS', position: 1, @@ -38,7 +36,6 @@ export const computeStandardTaskViewGroups = ( context: { viewName: 'assignedToMe', viewGroupName: 'done', - fieldName: 'status', isVisible: true, fieldValue: 'DONE', position: 2, @@ -50,7 +47,6 @@ export const computeStandardTaskViewGroups = ( context: { viewName: 'assignedToMe', viewGroupName: 'empty', - fieldName: 'status', isVisible: true, fieldValue: '', position: 3, @@ -62,7 +58,6 @@ export const computeStandardTaskViewGroups = ( context: { viewName: 'byStatus', viewGroupName: 'todo', - fieldName: 'status', isVisible: true, fieldValue: 'TODO', position: 0, @@ -74,7 +69,6 @@ export const computeStandardTaskViewGroups = ( context: { viewName: 'byStatus', viewGroupName: 'inProgress', - fieldName: 'status', isVisible: true, fieldValue: 'IN_PROGRESS', position: 1, @@ -86,7 +80,6 @@ export const computeStandardTaskViewGroups = ( context: { viewName: 'byStatus', viewGroupName: 'done', - fieldName: 'status', isVisible: true, fieldValue: 'DONE', position: 2, diff --git a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/create-standard-view-group-flat-metadata.util.ts b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/create-standard-view-group-flat-metadata.util.ts index f910b35dd0..62deb6dacb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/create-standard-view-group-flat-metadata.util.ts +++ b/packages/twenty-server/src/engine/workspace-manager/twenty-standard-application/utils/view-group/create-standard-view-group-flat-metadata.util.ts @@ -3,19 +3,17 @@ import { v4 } from 'uuid'; import { type FlatViewGroup } from 'src/engine/metadata-modules/flat-view-group/types/flat-view-group.type'; import { STANDARD_OBJECTS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-object.constant'; -import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.type'; import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-name.type'; import { type AllStandardObjectViewGroupName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-group-name.type'; import { type AllStandardObjectViewName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-view-name.type'; import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type'; -export type CreateStandardViewGroupOptions< +type CreateStandardViewGroupOptions< O extends AllStandardObjectName, V extends AllStandardObjectViewName, > = { viewName: V; viewGroupName: AllStandardObjectViewGroupName; - fieldName: AllStandardObjectFieldName; isVisible: boolean; fieldValue: string; position: number; @@ -35,14 +33,7 @@ export const createStandardViewGroupFlatMetadata = < >({ workspaceId, objectName, - context: { - viewName, - viewGroupName, - fieldName, - isVisible, - fieldValue, - position, - }, + context: { viewName, viewGroupName, isVisible, fieldValue, position }, standardObjectMetadataRelatedEntityIds, twentyStandardApplicationId, now, @@ -66,8 +57,6 @@ export const createStandardViewGroupFlatMetadata = < workspaceId, viewId: standardObjectMetadataRelatedEntityIds[objectName].views[viewName].id, - fieldMetadataId: - standardObjectMetadataRelatedEntityIds[objectName].fields[fieldName].id, isVisible, fieldValue, position, diff --git a/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts b/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts index 6e40266a42..2ac20d6839 100644 --- a/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts +++ b/packages/twenty-server/src/utils/__test__/get-field-metadata-entity.mock.ts @@ -24,7 +24,6 @@ export const getMockFieldMetadataEntity = < mainGroupByFieldMetadataViews: [], viewFilters: [], viewFields: [], - viewGroups: [], kanbanAggregateOperationViews: [], morphId: null, fieldPermissions: [],