fix(metadata): resolve junction targets order-independently during mgration (#21193)

A junction relation points at a target field on the join object that
another action may create later (two junctions into the same join
reference each other). The builder validator now also looks up the
target in the to be created set, and the runner mints every field id up
front so the target resolves regardless of action order, the same way
relation pairs are already handled.

---------

Co-authored-by: Félix Malfait <felix@twenty.com>
This commit is contained in:
neo773
2026-06-05 23:02:25 +05:30
committed by GitHub
parent 20d9244639
commit bfb83e93b2
9 changed files with 328 additions and 33 deletions
@@ -14,6 +14,7 @@ import { type UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/wo
type ValidateJunctionTargetSettingsArgs = {
universalFlatFieldMetadata: UniversalFlatFieldMetadata<MorphOrRelationFieldMetadataType>;
flatFieldMetadataMaps: UniversalFlatEntityMaps<UniversalFlatFieldMetadata>;
remainingFlatFieldMetadataMaps?: UniversalFlatEntityMaps<UniversalFlatFieldMetadata>;
};
const createError = (
@@ -31,6 +32,7 @@ const createError = (
export const validateJunctionTargetSettings = ({
universalFlatFieldMetadata,
flatFieldMetadataMaps,
remainingFlatFieldMetadataMaps,
}: ValidateJunctionTargetSettingsArgs): FlatFieldMetadataValidationError[] => {
const { universalSettings } = universalFlatFieldMetadata;
@@ -58,10 +60,17 @@ export const validateJunctionTargetSettings = ({
];
}
const targetField = findFlatEntityByUniversalIdentifier({
universalIdentifier: junctionTargetFieldUniversalIdentifier,
flatEntityMaps: flatFieldMetadataMaps,
});
const targetField =
(isDefined(remainingFlatFieldMetadataMaps)
? findFlatEntityByUniversalIdentifier({
universalIdentifier: junctionTargetFieldUniversalIdentifier,
flatEntityMaps: remainingFlatFieldMetadataMaps,
})
: undefined) ??
findFlatEntityByUniversalIdentifier({
universalIdentifier: junctionTargetFieldUniversalIdentifier,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(targetField)) {
return [
@@ -243,6 +243,7 @@ export const validateMorphOrRelationFlatFieldMetadata = ({
...validateJunctionTargetSettings({
universalFlatFieldMetadata: universalFlatFieldMetadataToValidate,
flatFieldMetadataMaps,
remainingFlatFieldMetadataMaps: remainingFlatEntityMapsToValidate,
}),
);