RelationFieldMetadataType to MorphOrRelationFieldMetadataType and so on (#14160)

This commit is contained in:
Paul Rastoin
2025-08-29 17:25:12 +02:00
committed by GitHub
parent a2296c02ec
commit 7df9094939
25 changed files with 110 additions and 106 deletions
@@ -14,7 +14,7 @@ import {
InputTypeDefinitionKind,
} from 'src/engine/api/graphql/workspace-schema-builder/factories/input-type-definition.factory';
import { computeCompositePropertyTarget } from 'src/engine/api/graphql/workspace-schema-builder/utils/compute-composite-property-target.util';
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
import { pascalCase } from 'src/utils/pascal-case';
import { InputTypeFactory } from './input-type.factory';
@@ -57,7 +57,7 @@ export class CompositeInputTypeDefinitionFactory {
for (const property of compositeType.properties) {
// Relation fields are not supported in composite types
if (isRelationFieldMetadataType(property.type)) {
if (isMorphOrRelationFieldMetadataType(property.type)) {
this.logger.error(
'Relation fields are not supported in composite types',
{ compositeType, property },
@@ -12,7 +12,7 @@ import {
} from 'src/engine/api/graphql/workspace-schema-builder/factories/object-type-definition.factory';
import { OutputTypeFactory } from 'src/engine/api/graphql/workspace-schema-builder/factories/output-type.factory';
import { computeCompositePropertyTarget } from 'src/engine/api/graphql/workspace-schema-builder/utils/compute-composite-property-target.util';
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
import { pascalCase } from 'src/utils/pascal-case';
@Injectable()
@@ -52,7 +52,7 @@ export class CompositeObjectTypeDefinitionFactory {
for (const property of compositeType.properties) {
// Relation fields are not supported in composite types
if (isRelationFieldMetadataType(property.type)) {
if (isMorphOrRelationFieldMetadataType(property.type)) {
this.logger.error(
'Relation fields are not supported in composite types',
{ compositeType, property },
@@ -1,10 +1,10 @@
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
export const objectContainsRelationField = (
objectMetadata: ObjectMetadataEntity,
): boolean => {
return objectMetadata.fields.some((field) =>
isRelationFieldMetadataType(field.type),
isMorphOrRelationFieldMetadataType(field.type),
);
};
@@ -46,8 +46,8 @@ import { fromFieldMetadataEntityToFieldMetadataDto } from 'src/engine/metadata-m
import { fromObjectMetadataEntityToObjectMetadataDto } from 'src/engine/metadata-modules/field-metadata/utils/from-object-metadata-entity-to-object-metadata-dto.util';
import { PermissionFlagType } from 'src/engine/metadata-modules/permissions/constants/permission-flag-type.constants';
import { PermissionsGraphqlApiExceptionFilter } from 'src/engine/metadata-modules/permissions/utils/permissions-graphql-api-exception.filter';
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
import { isMorphRelationFieldMetadataType } from 'src/engine/utils/is-morph-relation-field-metadata-type.util';
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
@UseGuards(WorkspaceAuthGuard)
@UsePipes(ResolverValidationPipe)
@@ -174,7 +174,7 @@ export class FieldMetadataResolver {
@Parent() fieldMetadata: FieldMetadataEntity<FieldMetadataType.RELATION>,
@Context() context: { loaders: IDataloaders },
): Promise<RelationDTO | null | undefined> {
if (!isRelationFieldMetadataType(fieldMetadata.type)) {
if (!isMorphOrRelationFieldMetadataType(fieldMetadata.type)) {
return null;
}
@@ -0,0 +1,9 @@
import { FieldMetadataType } from 'twenty-shared/types';
export const MORPH_OR_RELATION_FIELD_TYPES = [
FieldMetadataType.RELATION,
FieldMetadataType.MORPH_RELATION,
] as const;
export type MorphOrRelationFieldMetadataType =
(typeof MORPH_OR_RELATION_FIELD_TYPES)[number];
@@ -1,8 +0,0 @@
import { FieldMetadataType } from 'twenty-shared/types';
export const RELATION_FIELD_TYPES = [
FieldMetadataType.RELATION,
FieldMetadataType.MORPH_RELATION,
] as const;
export type RelationFieldMetadataType = (typeof RELATION_FIELD_TYPES)[number];
@@ -11,7 +11,7 @@ import { ValidateOneFieldMetadataArgs } from 'src/engine/metadata-modules/flat-f
import { type FlatFieldMetadataTypeValidator } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-type-validator.type';
import { FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type';
import { validateEnumSelectFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-enum-flat-field-metadata.util';
import { validateRelationOrMorphRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-relation-or-morph-relation-flat-field-metadata.util';
import { validateMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-or-relation-flat-field-metadata.util';
@Injectable()
export class FlatFieldMetadataTypeValidatorService {
constructor(private readonly featureFlagService: FeatureFlagService) {}
@@ -70,7 +70,7 @@ export class FlatFieldMetadataTypeValidatorService {
];
}
return validateRelationOrMorphRelationFlatFieldMetadata({
return validateMorphOrRelationFlatFieldMetadata({
existingFlatObjectMetadataMaps,
flatFieldMetadataToValidate,
workspaceId,
@@ -123,7 +123,7 @@ export class FlatFieldMetadataTypeValidatorService {
workspaceId,
otherFlatObjectMetadataMapsToValidate,
}) =>
validateRelationOrMorphRelationFlatFieldMetadata({
validateMorphOrRelationFlatFieldMetadata({
existingFlatObjectMetadataMaps,
flatFieldMetadataToValidate,
workspaceId,
@@ -13,7 +13,7 @@ import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-m
import { compareTwoFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/compare-two-flat-field-metadata.util';
import { isFlatFieldMetadataNameSyncedWithLabel } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-name-synced-with-label.util';
import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
import { isRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-relation-flat-field-metadata.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { validateFlatFieldMetadataNameAvailability } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util';
import { validateFlatFieldMetadataName } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name.util';
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
@@ -209,7 +209,7 @@ export class FlatFieldMetadataValidatorService {
}
const isRelationFieldAndRelationTargetObjectMetadataHasBeenDeleted =
isRelationFlatFieldMetadata(flatFieldMetadataToDelete) &&
isMorphOrRelationFlatFieldMetadata(flatFieldMetadataToDelete) &&
!isDefined(
existingFlatObjectMetadataMaps.byId[
flatFieldMetadataToDelete.relationTargetObjectMetadataId
@@ -10,7 +10,7 @@ import { type FlatFieldMetadataRelationPropertiesToCompare } from 'src/engine/me
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataJsonbProperty } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-jsonb-property.util';
import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util';
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
import { type UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { transformMetadataForComparison } from 'src/engine/workspace-manager/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
@@ -39,12 +39,12 @@ export const compareTwoFlatFieldMetadata = ({
}
// Remove below assertion when we authorize relation edition, see https://github.com/twentyhq/twenty/commit/39f6f3c4bb101272a9014e142a842d0801a3c33b
const isRelationFieldType =
const isMorphOrRelationFieldType =
isDefined(fieldMetadata.type) &&
isRelationFieldMetadataType(fieldMetadata.type);
isMorphOrRelationFieldMetadataType(fieldMetadata.type);
if (
isRelationFieldType &&
isMorphOrRelationFieldType &&
!FLAT_FIELD_METADATA_RELATION_PROPERTIES_TO_COMPARE.includes(
property as FlatFieldMetadataRelationPropertiesToCompare,
)
@@ -1,7 +1,7 @@
import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { type RelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
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';
@@ -18,7 +18,7 @@ export type FindFlatFieldMetadatasRelatedToMorphRelationOrThrowArgs = {
export const findFlatFieldMetadatasRelatedToMorphRelationOrThrow = ({
flatObjectMetadataMaps,
flatFieldMetadata: morphRelationFlatFieldMetadata,
}: FindFlatFieldMetadatasRelatedToMorphRelationOrThrowArgs): FlatFieldMetadata<RelationFieldMetadataType>[] => {
}: FindFlatFieldMetadatasRelatedToMorphRelationOrThrowArgs): FlatFieldMetadata<MorphOrRelationFieldMetadataType>[] => {
const flatObjectMetadataWithFlatFieldMaps =
flatObjectMetadataMaps.byId[
morphRelationFlatFieldMetadata.objectMetadataId
@@ -1,18 +1,18 @@
import { isDefined } from 'twenty-shared/utils';
import { 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 RelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
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';
export type GetRelationFlatFieldMetadatasUtilArgs = {
flatObjectMetadataMaps: FlatObjectMetadataMaps;
flatFieldMetadata: FlatFieldMetadata<RelationFieldMetadataType>;
flatFieldMetadata: FlatFieldMetadata<MorphOrRelationFieldMetadataType>;
};
export const findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow = ({
@@ -7,9 +7,10 @@ import {
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
import { type FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { generateRelationOrMorphRelationFlatFieldMetadataPair } from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-relation-or-morph-relation-flat-field-metadata-pair.util';
import { generateMorphOrRelationFlatFieldMetadataPair } from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util';
import { validateMorphRelationCreationPayload } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-morph-relation-creation-payload.util';
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -28,7 +29,9 @@ export const fromMorphRelationCreateFieldInputToFlatFieldMetadatas = async ({
sourceFlatObjectMetadata,
workspaceId,
}: FromMorphRelationCreateFieldInputToFlatFieldMetadatasArgs): Promise<
FieldInputTranspilationResult<FlatFieldMetadata[]>
FieldInputTranspilationResult<
FlatFieldMetadata<MorphOrRelationFieldMetadataType>[]
>
> => {
const rawMorphCreationPayload =
createFieldInput.morphRelationsCreationPayload;
@@ -70,7 +73,7 @@ export const fromMorphRelationCreateFieldInputToFlatFieldMetadatas = async ({
targetFlatObjectMetadata.nameSingular,
});
return generateRelationOrMorphRelationFlatFieldMetadataPair({
return generateMorphOrRelationFlatFieldMetadataPair({
createFieldInput: {
...createFieldInput,
relationCreationPayload,
@@ -4,11 +4,10 @@ import { isDefined } from 'twenty-shared/utils';
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { type RelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
import { computeRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-relation-field-join-column-name.util';
import { type FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { generateRelationOrMorphRelationFlatFieldMetadataPair } from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-relation-or-morph-relation-flat-field-metadata-pair.util';
import { generateMorphOrRelationFlatFieldMetadataPair } from 'src/engine/metadata-modules/flat-field-metadata/utils/generate-morph-or-relation-flat-field-metadata-pair.util';
import { validateRelationCreationPayload } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-relation-creation-payload.util';
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -27,7 +26,7 @@ export const fromRelationCreateFieldInputToFlatFieldMetadatas = async ({
createFieldInput,
workspaceId,
}: FromRelationCreateFieldInputToFlatFieldMetadataArgs): Promise<
FieldInputTranspilationResult<FlatFieldMetadata<RelationFieldMetadataType>[]>
FieldInputTranspilationResult<FlatFieldMetadata<FieldMetadataType.RELATION>[]>
> => {
const rawCreationPayload = createFieldInput.relationCreationPayload;
@@ -54,23 +53,22 @@ export const fromRelationCreateFieldInputToFlatFieldMetadatas = async ({
const { relationCreationPayload, targetFlatObjectMetadata } =
relationValidationResult.result;
const flatFieldMetadatas =
generateRelationOrMorphRelationFlatFieldMetadataPair({
createFieldInput: {
...createFieldInput,
relationCreationPayload,
},
sourceFlatObjectMetadataJoinColumnName:
computeRelationFieldJoinColumnName({
name: createFieldInput.name,
}),
sourceFlatObjectMetadata,
targetFlatObjectMetadata,
workspaceId,
});
const flatFieldMetadatas = generateMorphOrRelationFlatFieldMetadataPair({
createFieldInput: {
...createFieldInput,
relationCreationPayload,
},
sourceFlatObjectMetadataJoinColumnName: computeRelationFieldJoinColumnName({
name: createFieldInput.name,
}),
sourceFlatObjectMetadata,
targetFlatObjectMetadata,
workspaceId,
});
return {
status: 'success',
result: flatFieldMetadatas,
result:
flatFieldMetadatas as FlatFieldMetadata<FieldMetadataType.RELATION>[],
};
};
@@ -2,7 +2,7 @@ import { FieldMetadataType, RelationType } from 'twenty-shared/types';
import { v4 } from 'uuid';
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
import { type RelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
import { computeRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-relation-field-join-column-name.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { getDefaultFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/get-default-flat-field-metadata-from-create-field-input.util';
@@ -31,23 +31,23 @@ const computeFieldMetadataRelationSettingsForRelationType = ({
};
};
type GenerateRelationOrMorphRelationFlatFieldMetadataPairArgs = {
type GenerateMorphOrRelationFlatFieldMetadataPairArgs = {
targetFlatObjectMetadata: FlatObjectMetadata;
sourceFlatObjectMetadata: FlatObjectMetadata;
sourceFlatObjectMetadataJoinColumnName: string;
createFieldInput: Omit<CreateFieldInput, 'workspaceId'> &
Required<
Pick<CreateFieldInput, 'relationCreationPayload' | 'type' | 'name'>
> & { type: RelationFieldMetadataType };
> & { type: MorphOrRelationFieldMetadataType };
workspaceId: string;
};
export const generateRelationOrMorphRelationFlatFieldMetadataPair = ({
export const generateMorphOrRelationFlatFieldMetadataPair = ({
createFieldInput,
sourceFlatObjectMetadata,
targetFlatObjectMetadata,
workspaceId,
sourceFlatObjectMetadataJoinColumnName,
}: GenerateRelationOrMorphRelationFlatFieldMetadataPairArgs): FlatFieldMetadata<RelationFieldMetadataType>[] => {
}: GenerateMorphOrRelationFlatFieldMetadataPairArgs): FlatFieldMetadata<MorphOrRelationFieldMetadataType>[] => {
const { relationCreationPayload } = createFieldInput;
const sourceFlatFieldMetadataSettings =
@@ -58,7 +58,7 @@ export const generateRelationOrMorphRelationFlatFieldMetadataPair = ({
const targetRelationTargetFieldMetadataId = v4();
const sourceRelationTargetFieldMetadataId = v4();
const sourceFlatFieldMetadata: Omit<
FlatFieldMetadata<RelationFieldMetadataType>,
FlatFieldMetadata<MorphOrRelationFieldMetadataType>,
'flatRelationTargetFieldMetadata'
> = {
...getDefaultFlatFieldMetadata({
@@ -120,5 +120,5 @@ export const generateRelationOrMorphRelationFlatFieldMetadataPair = ({
flatRelationTargetFieldMetadata: targetFlatFieldMetadata,
},
targetFlatFieldMetadata,
] satisfies FlatFieldMetadata<RelationFieldMetadataType>[];
] satisfies FlatFieldMetadata<MorphOrRelationFieldMetadataType>[];
};
@@ -1,13 +1,13 @@
import {
RELATION_FIELD_TYPES,
type RelationFieldMetadataType,
} from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
MORPH_OR_RELATION_FIELD_TYPES,
type MorphOrRelationFieldMetadataType,
} from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataEntityOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util';
export const isRelationFlatFieldMetadata = (
export const isMorphOrRelationFlatFieldMetadata = (
flatFieldMetadata: FlatFieldMetadata,
): flatFieldMetadata is FlatFieldMetadata<RelationFieldMetadataType> =>
): flatFieldMetadata is FlatFieldMetadata<MorphOrRelationFieldMetadataType> =>
isFlatFieldMetadataEntityOfTypes(flatFieldMetadata, [
...RELATION_FIELD_TYPES,
...MORPH_OR_RELATION_FIELD_TYPES,
]);
@@ -7,7 +7,7 @@ import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-me
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
const getReservedCompositeFieldNames = (
flatObjectMetadata: FlatObjectMetadata,
@@ -47,7 +47,8 @@ export const validateFlatFieldMetadataNameAvailability = ({
flatObjectMetadata.flatFieldMetadatas.some(
(field) =>
field.name === name ||
(isRelationFieldMetadataType(field.type) && `${field.name}Id` === name),
(isMorphOrRelationFieldMetadataType(field.type) &&
`${field.name}Id` === name),
)
) {
errors.push({
@@ -2,15 +2,15 @@ import { t } from '@lingui/core/macro';
import { isDefined, isValidUuid } from 'twenty-shared/utils';
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { type RelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
import { type ValidateOneFieldMetadataArgs } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service';
import { type FlatFieldMetadataValidationError } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-validation-error.type';
export const validateRelationOrMorphRelationFlatFieldMetadata = async ({
export const validateMorphOrRelationFlatFieldMetadata = async ({
existingFlatObjectMetadataMaps,
flatFieldMetadataToValidate,
otherFlatObjectMetadataMapsToValidate,
}: ValidateOneFieldMetadataArgs<RelationFieldMetadataType>): Promise<
}: ValidateOneFieldMetadataArgs<MorphOrRelationFieldMetadataType>): Promise<
FlatFieldMetadataValidationError[]
> => {
const { relationTargetFieldMetadataId, relationTargetObjectMetadataId } =
@@ -5,7 +5,7 @@ import { isDefined } from 'twenty-shared/utils';
import { FlatFieldMetadataValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service';
import { FailedFlatFieldMetadataValidation } from 'src/engine/metadata-modules/flat-field-metadata/types/failed-flat-field-metadata-validation.type';
import { isRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-relation-flat-field-metadata.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
import { addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util';
import { addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.util';
@@ -14,7 +14,7 @@ import { FailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/
import { FlatObjectMetadataValidationError } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata-validation-error.type';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { areFlatObjectMetadataNamesSyncedWithLabels } from 'src/engine/metadata-modules/flat-object-metadata/utils/are-flat-object-metadata-names-synced-with-labels.util';
import { computeRelationTargetFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/compute-relation-target-flat-object-metadata-maps.util';
import { computeMorphOrRelationTargetFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/compute-morph-or-relation-target-flat-object-metadata-maps.util';
import { getDefaultFailedFlatObjectMetadataValidation } from 'src/engine/metadata-modules/flat-object-metadata/utils/get-default-failed-flat-object-metadata-validation.type';
import { validateFlatObjectMetadataIdentifiers } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-identifiers.util';
import { validateFlatObjectMetadataLabel } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-label.util';
@@ -201,9 +201,9 @@ export class FlatObjectMetadataValidatorService {
for (const flatFieldMetadataToValidate of flatObjectMetadataToValidate.flatFieldMetadatas) {
const relationTargetFlatObjectMetadataMaps =
isRelationFlatFieldMetadata(flatFieldMetadataToValidate) &&
isMorphOrRelationFlatFieldMetadata(flatFieldMetadataToValidate) &&
isDefined(otherFlatObjectMetadataMapsToValidate)
? computeRelationTargetFlatObjectMetadataMaps({
? computeMorphOrRelationTargetFlatObjectMetadataMaps({
flatFieldMetadata: flatFieldMetadataToValidate,
flatObjectMetadataMaps: otherFlatObjectMetadataMapsToValidate,
})
@@ -1,16 +1,16 @@
import { isDefined } from 'twenty-shared/utils';
import { type RelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { findRelationFlatFieldMetadataTargetFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata.util';
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
import { getSubFlatObjectMetadataMapsOutOfFlatFieldMetadatas } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/get-sub-flat-object-metadata-maps-out-of-flat-field-metadatas.util';
export const computeRelationTargetFlatObjectMetadataMaps = ({
export const computeMorphOrRelationTargetFlatObjectMetadataMaps = ({
flatFieldMetadata,
flatObjectMetadataMaps,
}: {
flatFieldMetadata: FlatFieldMetadata<RelationFieldMetadataType>;
flatFieldMetadata: FlatFieldMetadata<MorphOrRelationFieldMetadataType>;
flatObjectMetadataMaps: FlatObjectMetadataMaps;
}): FlatObjectMetadataMaps | undefined => {
const relationTargetFlatFieldMetadata =
@@ -0,0 +1,13 @@
import { type FieldMetadataType } from 'twenty-shared/types';
import {
MORPH_OR_RELATION_FIELD_TYPES,
type MorphOrRelationFieldMetadataType,
} from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
export const isMorphOrRelationFieldMetadataType = (
type: FieldMetadataType,
): type is MorphOrRelationFieldMetadataType => {
return MORPH_OR_RELATION_FIELD_TYPES.includes(
type as MorphOrRelationFieldMetadataType,
);
};
@@ -1,11 +0,0 @@
import { type FieldMetadataType } from 'twenty-shared/types';
import {
RELATION_FIELD_TYPES,
type RelationFieldMetadataType,
} from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
export const isRelationFieldMetadataType = (
type: FieldMetadataType,
): type is RelationFieldMetadataType => {
return RELATION_FIELD_TYPES.includes(type as RelationFieldMetadataType);
};
@@ -22,7 +22,7 @@ import { isFunctionDefaultValue } from 'src/engine/metadata-modules/field-metada
import { serializeFunctionDefaultValue } from 'src/engine/metadata-modules/field-metadata/utils/serialize-function-default-value.util';
import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util';
import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util';
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
@Injectable()
export class DatabaseStructureService {
@@ -207,7 +207,7 @@ export class DatabaseStructureService {
return false;
}
if (isRelationFieldMetadataType(type)) {
if (isMorphOrRelationFieldMetadataType(type)) {
return false;
}
@@ -22,7 +22,7 @@ import { serializeDefaultValue } from 'src/engine/metadata-modules/field-metadat
import { validateDefaultValueForType } from 'src/engine/metadata-modules/field-metadata/utils/validate-default-value-for-type.util';
import { validateOptionsForType } from 'src/engine/metadata-modules/field-metadata/utils/validate-options-for-type.util';
import { customNamePrefix } from 'src/engine/utils/compute-table-name.util';
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
import { DatabaseStructureService } from 'src/engine/workspace-manager/workspace-health/services/database-structure.service';
import { validName } from 'src/engine/workspace-manager/workspace-health/utils/valid-name.util';
@@ -42,7 +42,7 @@ export class FieldMetadataHealthService {
for (const fieldMetadata of fieldMetadataCollection) {
// Relation metadata are checked in another service
if (isRelationFieldMetadataType(fieldMetadata.type)) {
if (isMorphOrRelationFieldMetadataType(fieldMetadata.type)) {
continue;
}
@@ -4,12 +4,12 @@ import { FromTo } from 'twenty-shared/types';
import { FlatFieldMetadataValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-validator.service';
import { compareTwoFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/compare-two-flat-field-metadata.util';
import { isRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-relation-flat-field-metadata.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
import { addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util';
import { deleteFieldFromFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-maps-or-throw.util';
import { replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util';
import { computeRelationTargetFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/compute-relation-target-flat-object-metadata-maps.util';
import { computeMorphOrRelationTargetFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/compute-morph-or-relation-target-flat-object-metadata-maps.util';
import { WorkspaceMigrationV2BuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-migration-builder-v2.service';
import { ValidateAndBuildMetadataResult } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/validate-and-build-metadata-result.type';
import { type WorkspaceMigrationFieldActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
@@ -115,14 +115,13 @@ export class WorkspaceMigrationV2FieldActionsBuilderService {
}
for (const flatFieldMetadataToCreate of createdFlatFieldMetadatas) {
const relationTargetFlatObjectMetadataMaps = isRelationFlatFieldMetadata(
flatFieldMetadataToCreate,
)
? computeRelationTargetFlatObjectMetadataMaps({
flatFieldMetadata: flatFieldMetadataToCreate,
flatObjectMetadataMaps: toFlatObjectMetadataMaps,
})
: undefined;
const relationTargetFlatObjectMetadataMaps =
isMorphOrRelationFlatFieldMetadata(flatFieldMetadataToCreate)
? computeMorphOrRelationTargetFlatObjectMetadataMaps({
flatFieldMetadata: flatFieldMetadataToCreate,
flatObjectMetadataMaps: toFlatObjectMetadataMaps,
})
: undefined;
const validationErrors =
await this.flatFieldMetadataValidatorService.validateFlatFieldMetadataCreation(
@@ -13,14 +13,14 @@ import { FlatFieldMetadataPropertiesToCompare } from 'src/engine/metadata-module
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util';
import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util';
import { isRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-relation-flat-field-metadata.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { findFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util';
import { findFlatObjectMetadataWithFlatFieldMapsInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-with-flat-field-maps-in-flat-object-metadata-maps-or-throw.util';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { fromFlatObjectMetadataWithFlatFieldMapsToFlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadata-with-flat-field-maps-to-flat-object-metadatas.util';
import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util';
import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service';
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
import { isMorphOrRelationFieldMetadataType } from 'src/engine/utils/is-morph-or-relation-field-metadata-type.util';
import { FlatFieldMetadataPropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-field-metadata-property-update.type';
import { type UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { serializeDefaultValueV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/utils/serialize-default-value-v2.util';
@@ -154,7 +154,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
const compositeType = getCompositeTypeOrThrow(flatFieldMetadata.type);
for (const property of compositeType.properties) {
if (isRelationFieldMetadataType(property.type)) {
if (isMorphOrRelationFieldMetadataType(property.type)) {
throw new WorkspaceMigrationRunnerException(
'Relation field metadata in composite type is not supported yet',
WorkspaceMigrationRunnerExceptionCode.NOT_SUPPORTED,
@@ -179,7 +179,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
});
}
} else {
if (isRelationFlatFieldMetadata(flatFieldMetadata)) {
if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadata)) {
throw new WorkspaceMigrationRunnerException(
'Relation field metadata name update is not supported yet',
WorkspaceMigrationRunnerExceptionCode.NOT_SUPPORTED,
@@ -226,7 +226,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
const compositeType = getCompositeTypeOrThrow(flatFieldMetadata.type);
for (const property of compositeType.properties) {
if (isRelationFieldMetadataType(property.type)) {
if (isMorphOrRelationFieldMetadataType(property.type)) {
throw new WorkspaceMigrationRunnerException(
'Relation field metadata in composite type is not supported yet',
WorkspaceMigrationRunnerExceptionCode.NOT_SUPPORTED,