ObjectMetadataServiceV2.deleteOne (#13871)

# Introduction
- Implementing the delete one for the new object metadata service v2.
- Handling relation fields and fields in the first place to finally
remove the object
- puting back updatedAt and createdAt in flat metadatas
- duplicate criteria addition for flat object
- removing datasource id from object metadata dto
This commit is contained in:
Paul Rastoin
2025-08-13 11:20:17 +02:00
committed by GitHub
parent 98e1a325a8
commit e8e81957a6
44 changed files with 863 additions and 473 deletions
@@ -10,6 +10,7 @@ import {
FieldMetadataExceptionCode,
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { getRelationFlatFieldMetadatasOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/get-relation-flat-field-metadatas-or-throw.util';
import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
import { type 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';
@@ -45,41 +46,16 @@ export const fromDeleteFieldInputToFlatFieldMetadatasToDelete = ({
isFlatFieldMetadataEntityOfType(
flatFieldMetadataToDelete,
FieldMetadataType.RELATION,
)
) {
const { relationTargetFieldMetadataId, relationTargetObjectMetadataId } =
flatFieldMetadataToDelete;
const relatedFlatObjectMetadata =
existingFlatObjectMetadataMaps.byId[relationTargetObjectMetadataId];
if (!isDefined(relatedFlatObjectMetadata)) {
throw new FieldMetadataException(
`Deleted field metadata relation object metadata target not found`,
FieldMetadataExceptionCode.OBJECT_METADATA_NOT_FOUND,
);
}
const relatedFlatFieldMetadata =
relatedFlatObjectMetadata.fieldsById[relationTargetFieldMetadataId];
if (!isDefined(relatedFlatFieldMetadata)) {
throw new FieldMetadataException(
`Deleted field metadata relation field metadata target not found`,
FieldMetadataExceptionCode.FIELD_METADATA_NOT_FOUND,
);
}
return [flatFieldMetadataToDelete, relatedFlatFieldMetadata];
}
if (
) ||
isFlatFieldMetadataEntityOfType(
flatFieldMetadataToDelete,
FieldMetadataType.MORPH_RELATION,
)
) {
// TODO prastoin
return [flatFieldMetadataToDelete];
return getRelationFlatFieldMetadatasOrThrow({
existingFlatObjectMetadataMaps,
flatFieldMetadata: flatFieldMetadataToDelete,
});
}
return [flatFieldMetadataToDelete];
@@ -0,0 +1,30 @@
import { type FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
export const fromFlatFieldMetadataToFieldMetadataDto = (
flatFieldMetadata: FlatFieldMetadata,
): FieldMetadataDTO => {
const {
createdAt,
updatedAt,
description,
icon,
standardOverrides,
isNullable,
isUnique,
settings,
...rest
} = flatFieldMetadata;
return {
...rest,
createdAt: new Date(createdAt),
updatedAt: new Date(updatedAt),
description: description ?? undefined,
icon: icon ?? undefined,
standardOverrides: standardOverrides ?? undefined,
isNullable: isNullable ?? false,
isUnique: isUnique ?? false,
settings: settings ?? undefined,
};
};
@@ -19,6 +19,8 @@ export const getDefaultFlatFieldMetadata = ({
['defaultValue', 'settings'],
);
const createdAt = new Date();
return {
description: createFieldInput.description ?? null,
id: fieldMetadataId,
@@ -48,5 +50,7 @@ export const getDefaultFlatFieldMetadata = ({
options: null,
defaultValue: defaultValue ?? null,
settings: settings ?? null,
createdAt,
updatedAt: createdAt,
} as const satisfies FlatFieldMetadata;
};
@@ -0,0 +1,45 @@
import { type FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import {
FieldMetadataException,
FieldMetadataExceptionCode,
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
type GetRelationFlatFieldMetadatasUtilArgs = {
existingFlatObjectMetadataMaps: FlatObjectMetadataMaps;
flatFieldMetadata: FlatFieldMetadata<
FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION
>;
};
// TODO prastoin handle morph relation
export const getRelationFlatFieldMetadatasOrThrow = ({
existingFlatObjectMetadataMaps,
flatFieldMetadata,
}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata[] => {
const { relationTargetFieldMetadataId, relationTargetObjectMetadataId } =
flatFieldMetadata;
const relatedFlatObjectMetadata =
existingFlatObjectMetadataMaps.byId[relationTargetObjectMetadataId];
if (!isDefined(relatedFlatObjectMetadata)) {
throw new FieldMetadataException(
`Deleted field metadata relation object metadata target not found`,
FieldMetadataExceptionCode.OBJECT_METADATA_NOT_FOUND,
);
}
const relatedFlatFieldMetadata =
relatedFlatObjectMetadata.fieldsById[relationTargetFieldMetadataId];
if (!isDefined(relatedFlatFieldMetadata)) {
throw new FieldMetadataException(
`Deleted field metadata relation field metadata target not found`,
FieldMetadataExceptionCode.FIELD_METADATA_NOT_FOUND,
);
}
return [flatFieldMetadata, relatedFlatFieldMetadata];
};