morph backend CORE api (#13517)

# Morph Relation needs some work on the core API

Especially on the Morph types

<img width="682" height="394" alt="Screenshot 2025-07-31 at 12 19 40"
src="https://github.com/user-attachments/assets/8b185ae3-3fe7-4886-97b1-ec143bb1b0f4"
/>


## Focus Areas:
- GraphQL schema generation
- Query parsing and field selection
- Morph relation field support
- Input type definition preparation
This commit is contained in:
Guillim
2025-08-12 11:47:02 +02:00
committed by GitHub
parent 6cc947ea01
commit 63c8bb9530
32 changed files with 742 additions and 111 deletions
@@ -0,0 +1,32 @@
import { capitalize } from 'twenty-shared/utils';
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
type ComputeMorphRelationFieldNameArgs = {
fieldName: string;
relationDirection: RelationType;
targetObjectMetadata: Pick<
ObjectMetadataEntity,
'nameSingular' | 'namePlural'
>;
};
export const computeMorphRelationFieldName = ({
fieldName,
relationDirection,
targetObjectMetadata,
}: ComputeMorphRelationFieldNameArgs): string => {
if (relationDirection === RelationType.MANY_TO_ONE) {
return `${fieldName}${capitalize(targetObjectMetadata.nameSingular)}`;
}
if (relationDirection === RelationType.ONE_TO_MANY) {
return `${fieldName}${capitalize(targetObjectMetadata.namePlural)}`;
}
throw new Error(
`Invalid relation direction: ${relationDirection} for field ${fieldName}`,
);
};
@@ -20,7 +20,14 @@ export const generateObjectMetadataMaps = (
for (const fieldMetadata of objectMetadata.fields) {
if (
isFieldMetadataEntityOfType(fieldMetadata, FieldMetadataType.RELATION)
isFieldMetadataEntityOfType(
fieldMetadata,
FieldMetadataType.RELATION,
) ||
isFieldMetadataEntityOfType(
fieldMetadata,
FieldMetadataType.MORPH_RELATION,
)
) {
if (fieldMetadata.settings?.joinColumnName) {
fieldIdByJoinColumnNameMap[fieldMetadata.settings.joinColumnName] =