Fix flatFieldMetadata transpiler to fit real cache typing (#13529)

# Introduction
The cache is not accurately typed regarding the `fieldMetadataMaps` they
do not contain relations
In this way we:
- Created dedicated transpilation tools for cache manipulation
- Avoided recursivity in transpilation tools
- Fix and finalized the createMany fields metadata service v2
- Refactor the validator to handle validation :)

## What's next:
- Implem integration tests to make things run 🙃 
- migrate existing settings valdiation
- Finish the create object metadata service
- Handle update input transpilation and validation
This commit is contained in:
Paul Rastoin
2025-08-01 18:39:11 +02:00
committed by GitHub
parent dd47bfe6d5
commit b98d8c4d39
22 changed files with 384 additions and 124 deletions
@@ -13,10 +13,12 @@ import {
FieldMetadataExceptionCode,
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { FlatFieldMetadataValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service';
import { fromCreateFieldInputToFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-metadata.util';
import { FailedFlatFieldMetadataValidationExceptions } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type';
import { fromCreateFieldInputToFlatFieldAndItsFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/from-create-field-input-to-flat-field-and-its-flat-object-metadata.util';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { fromObjectMetadataMapsToFlatObjectMetadatas } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-maps-to-flat-object-metadatas.util';
import { mergeTwoFlatObjectMetadatas } from 'src/engine/metadata-modules/flat-object-metadata/utils/merge-two-flat-object-metadatas.util';
import { getFieldMetadataEntityFromCachedObjectMetadataMaps } from 'src/engine/metadata-modules/utils/get-field-metadata-entity-from-cached-object-metadata-maps.util';
import { WorkspaceMetadataCacheService } from 'src/engine/metadata-modules/workspace-metadata-cache/services/workspace-metadata-cache.service';
import { WorkspaceMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/workspace-migration-builder-v2.service';
import { WorkspaceMigrationRunnerV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/workspace-migration-runner-v2.service';
@@ -66,29 +68,34 @@ export class FieldMetadataServiceV2 extends TypeOrmQueryService<FieldMetadataEnt
const existingFlatObjectMetadatas =
fromObjectMetadataMapsToFlatObjectMetadatas(objectMetadataMaps);
const flatFieldToCreateAndItsFlatObjectMetadataArray = await Promise.all(
fieldMetadataInputs.map(
async (fieldMetadataInput) =>
await fromCreateFieldInputToFlatFieldAndItsFlatObjectMetadata({
existingFlatObjectMetadatas,
rawCreateFieldInput: fieldMetadataInput,
}),
),
);
let flatObjectMetadatasWithNewFields: FlatObjectMetadata[] = [];
for (const fieldMetadataInput of fieldMetadataInputs) {
const createdFlatFieldsMetadataAndParentFlatObjectMetadata =
await fromCreateFieldInputToFlatFieldMetadata({
existingFlatObjectMetadatas,
rawCreateFieldInput: fieldMetadataInput,
});
for (const flatFieldMetadataAndParentPair of flatFieldToCreateAndItsFlatObjectMetadataArray) {
const flatFieldMetadataValidationPromises =
flatFieldMetadataAndParentPair.flatMap<
Promise<FailedFlatFieldMetadataValidationExceptions[]>
>(({ flatFieldMetadata: flatFieldMetadataToValidate }) =>
this.flatFieldMetadataValidatorService.validateOneFlatFieldMetadata({
existingFlatObjectMetadatas,
flatFieldMetadataToValidate,
workspaceId,
}),
);
const createdFlatFieldMetadataValidationResult = (
await Promise.all(
createdFlatFieldsMetadataAndParentFlatObjectMetadata.map(
({ flatFieldMetadata: flatFieldMetadataToValidate }) =>
this.flatFieldMetadataValidatorService.validateOneFlatFieldMetadata(
{
existingFlatObjectMetadatas,
flatFieldMetadataToValidate,
workspaceId,
},
),
),
)
).filter(isDefined);
await Promise.all(flatFieldMetadataValidationPromises)
)
.flat()
.filter(isDefined);
if (createdFlatFieldMetadataValidationResult.length > 0) {
const errors = createdFlatFieldMetadataValidationResult.flat();
@@ -100,7 +107,7 @@ export class FieldMetadataServiceV2 extends TypeOrmQueryService<FieldMetadataEnt
}
const updatedFlatObjectMetadatas =
createdFlatFieldsMetadataAndParentFlatObjectMetadata.map<FlatObjectMetadata>(
flatFieldMetadataAndParentPair.map<FlatObjectMetadata>(
({ flatFieldMetadata, parentFlatObjectMetadata }) => {
return {
...parentFlatObjectMetadata,
@@ -129,11 +136,27 @@ export class FieldMetadataServiceV2 extends TypeOrmQueryService<FieldMetadataEnt
await this.workspaceMigrationRunnerV2Service.run(workspaceMigration);
// const recomputedCache =
// await this.workspaceMetadataCacheService.getExistingOrRecomputeMetadataMaps(
// { workspaceId },
// );
const recomputedCache =
await this.workspaceMetadataCacheService.getExistingOrRecomputeMetadataMaps(
{ workspaceId },
);
return []; //TODO to retrieve from cache or directly from find
return flatFieldToCreateAndItsFlatObjectMetadataArray.flatMap<FieldMetadataEntity>(
(createdFlatFieldAndItsParentFlatObject) => {
return createdFlatFieldAndItsParentFlatObject
.map(
({
flatFieldMetadata: { id: fieldMetadataId },
parentFlatObjectMetadata: { id: objectMetadataId },
}) =>
getFieldMetadataEntityFromCachedObjectMetadataMaps({
fieldMetadataId,
objectMetadataId,
objectMetadataMaps: recomputedCache.objectMetadataMaps,
}),
)
.filter(isDefined);
},
);
}
}