better handling the function argument without touching it (#11614)

leave intact the `input` argument to avoid side effects on the parent
caller

---------

Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
This commit is contained in:
Guillim
2025-04-17 10:54:56 +02:00
committed by GitHub
parent d89474d43b
commit 9e9ba73a43

View File

@ -16,7 +16,10 @@ import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/
import { IndexMetadataService } from 'src/engine/metadata-modules/index-metadata/index-metadata.service'; import { IndexMetadataService } from 'src/engine/metadata-modules/index-metadata/index-metadata.service';
import { DeleteOneObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/delete-object.input'; import { DeleteOneObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/delete-object.input';
import { ObjectMetadataDTO } from 'src/engine/metadata-modules/object-metadata/dtos/object-metadata.dto'; import { ObjectMetadataDTO } from 'src/engine/metadata-modules/object-metadata/dtos/object-metadata.dto';
import { UpdateOneObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/update-object.input'; import {
UpdateObjectPayload,
UpdateOneObjectInput,
} from 'src/engine/metadata-modules/object-metadata/dtos/update-object.input';
import { import {
ObjectMetadataException, ObjectMetadataException,
ObjectMetadataExceptionCode, ObjectMetadataExceptionCode,
@ -219,22 +222,22 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
input: UpdateOneObjectInput, input: UpdateOneObjectInput,
workspaceId: string, workspaceId: string,
): Promise<ObjectMetadataEntity> { ): Promise<ObjectMetadataEntity> {
const { update } = input; const inputId = input.id;
if (isDefined(update.labelSingular)) { const inputPayload = {
update.labelSingular = capitalize(update.labelSingular); ...input.update,
} ...(isDefined(input.update.labelSingular)
? { labelSingular: capitalize(input.update.labelSingular) }
: {}),
...(isDefined(input.update.labelPlural)
? { labelPlural: capitalize(input.update.labelPlural) }
: {}),
};
if (isDefined(update.labelPlural)) { validateObjectMetadataInputNamesOrThrow(inputPayload);
update.labelPlural = capitalize(update.labelPlural);
}
input.update = update;
validateObjectMetadataInputNamesOrThrow(input.update);
const existingObjectMetadata = await this.objectMetadataRepository.findOne({ const existingObjectMetadata = await this.objectMetadataRepository.findOne({
where: { id: input.id, workspaceId: workspaceId }, where: { id: inputId, workspaceId: workspaceId },
}); });
if (!existingObjectMetadata) { if (!existingObjectMetadata) {
@ -246,7 +249,7 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
const existingObjectMetadataCombinedWithUpdateInput = { const existingObjectMetadataCombinedWithUpdateInput = {
...existingObjectMetadata, ...existingObjectMetadata,
...input.update, ...inputPayload,
}; };
await this.validatesNoOtherObjectWithSameNameExistsOrThrows({ await this.validatesNoOtherObjectWithSameNameExistsOrThrows({
@ -271,8 +274,8 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
} }
if ( if (
isDefined(input.update.nameSingular) || isDefined(inputPayload.nameSingular) ||
isDefined(input.update.namePlural) isDefined(inputPayload.namePlural)
) { ) {
validateLowerCasedAndTrimmedStringsAreDifferentOrThrow({ validateLowerCasedAndTrimmedStringsAreDifferentOrThrow({
inputs: [ inputs: [
@ -284,35 +287,35 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
}); });
} }
const updatedObject = await super.updateOne(input.id, input.update); const updatedObject = await super.updateOne(inputId, inputPayload);
await this.handleObjectNameAndLabelUpdates( await this.handleObjectNameAndLabelUpdates(
existingObjectMetadata, existingObjectMetadata,
existingObjectMetadataCombinedWithUpdateInput, existingObjectMetadataCombinedWithUpdateInput,
input, inputPayload,
); );
if (input.update.isActive !== undefined) { if (inputPayload.isActive !== undefined) {
await this.objectMetadataRelationService.updateObjectRelationshipsActivationStatus( await this.objectMetadataRelationService.updateObjectRelationshipsActivationStatus(
input.id, inputId,
input.update.isActive, inputPayload.isActive,
); );
} }
await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations( await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations(
workspaceId, workspaceId,
); );
if (input.update.labelIdentifierFieldMetadataId) { if (inputPayload.labelIdentifierFieldMetadataId) {
const labelIdentifierFieldMetadata = const labelIdentifierFieldMetadata =
await this.fieldMetadataRepository.findOneByOrFail({ await this.fieldMetadataRepository.findOneByOrFail({
id: input.update.labelIdentifierFieldMetadataId, id: inputPayload.labelIdentifierFieldMetadataId,
objectMetadataId: input.id, objectMetadataId: inputId,
workspaceId: workspaceId, workspaceId: workspaceId,
}); });
if (isSearchableFieldType(labelIdentifierFieldMetadata.type)) { if (isSearchableFieldType(labelIdentifierFieldMetadata.type)) {
await this.searchVectorService.updateSearchVector( await this.searchVectorService.updateSearchVector(
input.id, inputId,
[ [
{ {
name: labelIdentifierFieldMetadata.name, name: labelIdentifierFieldMetadata.name,
@ -473,7 +476,7 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
private async handleObjectNameAndLabelUpdates( private async handleObjectNameAndLabelUpdates(
existingObjectMetadata: ObjectMetadataEntity, existingObjectMetadata: ObjectMetadataEntity,
objectMetadataForUpdate: ObjectMetadataEntity, objectMetadataForUpdate: ObjectMetadataEntity,
input: UpdateOneObjectInput, inputPayload: UpdateObjectPayload,
) { ) {
const newTargetTableName = computeObjectTargetTable( const newTargetTableName = computeObjectTargetTable(
objectMetadataForUpdate, objectMetadataForUpdate,
@ -520,9 +523,9 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadataEnt
); );
if ( if (
(input.update.labelPlural || input.update.icon) && (inputPayload.labelPlural || inputPayload.icon) &&
(input.update.labelPlural !== existingObjectMetadata.labelPlural || (inputPayload.labelPlural !== existingObjectMetadata.labelPlural ||
input.update.icon !== existingObjectMetadata.icon) inputPayload.icon !== existingObjectMetadata.icon)
) { ) {
await this.objectMetadataRelatedRecordsService.updateObjectViews( await this.objectMetadataRelatedRecordsService.updateObjectViews(
objectMetadataForUpdate, objectMetadataForUpdate,