Rename enum types when tables are renamed (#8794)

## Context
Enum are named after this pattern
`${schema}_${tableName}_${columnName}_enum` however now that we allowed
table name update, we need to make sure their enums are renamed as well.
This commit is contained in:
Weiko
2024-11-28 15:39:20 +01:00
committed by GitHub
parent fbe042db3b
commit 75f5afb968
5 changed files with 185 additions and 5 deletions

View File

@ -443,14 +443,17 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
objectMetadataForUpdate.workspaceId,
);
await this.objectMetadataMigrationService.recomputeEnumNames(
objectMetadataForUpdate,
objectMetadataForUpdate.workspaceId,
);
const recomputedIndexes =
await this.indexMetadataService.recomputeIndexMetadataForObject(
objectMetadataForUpdate.workspaceId,
objectMetadataForUpdate,
);
// TODO: recompute foreign keys indexes as well (in the related object and not objectMetadataForUpdate)
await this.indexMetadataService.createIndexRecomputeMigrations(
objectMetadataForUpdate.workspaceId,
objectMetadataForUpdate,

View File

@ -1,9 +1,12 @@
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { In, Repository } from 'typeorm';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import {
FieldMetadataEntity,
FieldMetadataType,
} from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { computeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { buildMigrationsForCustomObjectRelations } from 'src/engine/metadata-modules/object-metadata/utils/build-migrations-for-custom-object-relations.util';
@ -264,4 +267,43 @@ export class ObjectMetadataMigrationService {
],
);
}
public async recomputeEnumNames(
updatedObjectMetadata: ObjectMetadataEntity,
workspaceId: string,
) {
const fieldMetadataToUpdate = await this.fieldMetadataRepository.find({
where: {
objectMetadataId: updatedObjectMetadata.id,
workspaceId,
type: In([
FieldMetadataType.SELECT,
FieldMetadataType.MULTI_SELECT,
FieldMetadataType.RATING,
FieldMetadataType.ACTOR,
]),
},
});
for (const fieldMetadata of fieldMetadataToUpdate) {
await this.workspaceMigrationService.createCustomMigration(
generateMigrationName(`update-${fieldMetadata.name}-enum-name`),
workspaceId,
[
{
name: computeTableName(
updatedObjectMetadata.nameSingular,
updatedObjectMetadata.isCustom,
),
action: WorkspaceMigrationTableActionType.ALTER,
columns: this.workspaceMigrationFactory.createColumnActions(
WorkspaceMigrationColumnActionType.ALTER,
fieldMetadata,
fieldMetadata,
),
},
],
);
}
}
}

View File

@ -12,4 +12,5 @@ export enum WorkspaceMigrationExceptionCode {
INVALID_ACTION = 'INVALID_ACTION',
INVALID_FIELD_METADATA = 'INVALID_FIELD_METADATA',
INVALID_COMPOSITE_TYPE = 'INVALID_COMPOSITE_TYPE',
ENUM_TYPE_NAME_NOT_FOUND = 'ENUM_TYPE_NAME_NOT_FOUND',
}