Refactor builder to embed Object validation create/delete/update (#13934)

# Introduction
Moving validation directly in the builder that has the perfect
granularity to do it.
When importing we won't have to infer and dispatch on the operation
nature ( update delete create ) and validate accordingly

## Objects
Only migrated object validation for the moment even though create object
involves a validate flat field metadata creation call too

## TODO
- improve `otherFlatObjectMetadataMapsToValidate` naming too vague

## Next
- handle fields validation within fields actions build
- Unit test coverage validation issue on builder and validate
- integration test plugging with new feature flag

## Manual tested
- Update
- Delete
- Create TODO
This commit is contained in:
Paul Rastoin
2025-08-18 11:16:16 +02:00
committed by GitHub
parent 18b2a68b69
commit 6629092645
51 changed files with 3800 additions and 617 deletions
@@ -8,22 +8,22 @@ import {
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;
export type GetRelationFlatFieldMetadatasUtilArgs = {
flatObjectMetadataMaps: FlatObjectMetadataMaps;
flatFieldMetadata: FlatFieldMetadata<
FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION
>;
};
// TODO prastoin handle morph relation
export const getRelationFlatFieldMetadatasOrThrow = ({
existingFlatObjectMetadataMaps,
export const findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow = ({
flatObjectMetadataMaps,
flatFieldMetadata,
}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata[] => {
}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata => {
const { relationTargetFieldMetadataId, relationTargetObjectMetadataId } =
flatFieldMetadata;
const relatedFlatObjectMetadata =
existingFlatObjectMetadataMaps.byId[relationTargetObjectMetadataId];
flatObjectMetadataMaps.byId[relationTargetObjectMetadataId];
if (!isDefined(relatedFlatObjectMetadata)) {
throw new FieldMetadataException(
@@ -41,5 +41,5 @@ export const getRelationFlatFieldMetadatasOrThrow = ({
);
}
return [flatFieldMetadata, relatedFlatFieldMetadata];
return relatedFlatFieldMetadata;
};
@@ -0,0 +1,15 @@
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import {
findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow,
type GetRelationFlatFieldMetadatasUtilArgs,
} from 'src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util';
export const findRelationFlatFieldMetadataTargetFlatFieldMetadata = (
args: GetRelationFlatFieldMetadatasUtilArgs,
): FlatFieldMetadata | undefined => {
try {
return findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow(args);
} catch {
return undefined;
}
};
@@ -10,7 +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 { findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-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';
@@ -52,10 +52,13 @@ export const fromDeleteFieldInputToFlatFieldMetadatasToDelete = ({
FieldMetadataType.MORPH_RELATION,
)
) {
return getRelationFlatFieldMetadatasOrThrow({
existingFlatObjectMetadataMaps,
flatFieldMetadata: flatFieldMetadataToDelete,
});
const relationTargetFlatFieldMetadata =
findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow({
flatObjectMetadataMaps: existingFlatObjectMetadataMaps,
flatFieldMetadata: flatFieldMetadataToDelete,
});
return [flatFieldMetadataToDelete, relationTargetFlatFieldMetadata];
}
return [flatFieldMetadataToDelete];