Fix unique standard field (#16371)

Fixes https://github.com/twentyhq/twenty/issues/15925

- update field metadata update logic
- uniformize the way index are named
- command to migrate v1-named unique index
- add integration testing

---------

Co-authored-by: prastoin <paul@twenty.com>
This commit is contained in:
Etienne
2025-12-08 19:05:28 +01:00
committed by GitHub
parent 950f452fef
commit 07cfaa78ef
23 changed files with 811 additions and 269 deletions
@@ -5,12 +5,11 @@ import { type WorkspaceSyncContext } from 'src/engine/workspace-manager/workspac
import { type IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity';
import { IndexType } from 'src/engine/metadata-modules/index-metadata/types/indexType.types';
import { generateDeterministicIndexName } from 'src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name';
import { generateDeterministicIndexNameV2 } from 'src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name-v2';
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { type BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-entity';
import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage';
import { computeTableName } from 'src/engine/utils/compute-table-name.util';
import { isGatedAndNotEnabled } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/is-gate-and-not-enabled.util';
@Injectable()
@@ -124,7 +123,18 @@ export class StandardIndexFactory {
const indexMetadata: PartialIndexMetadata = {
workspaceId: context.workspaceId,
objectMetadataId: customObjectMetadata.id,
name: `IDX_${generateDeterministicIndexName([computeTableName(customObjectName, true), ...workspaceIndexMetadataArgs.columns])}`,
name: generateDeterministicIndexNameV2({
flatObjectMetadata: {
nameSingular: customObjectName,
isCustom: true,
},
relatedFieldNames: workspaceIndexMetadataArgs.columns.map(
(column) => ({
name: column,
}),
),
isUnique: workspaceIndexMetadataArgs.isUnique,
}),
columns: workspaceIndexMetadataArgs.columns,
isCustom: false,
isUnique: workspaceIndexMetadataArgs.isUnique,