2c09096edd
* Refactor backend folder structure Co-authored-by: Charles Bochet <charles@twenty.com> * fix tests * fix * move yoga hooks --------- Co-authored-by: Charles Bochet <charles@twenty.com>
109 lines
2.7 KiB
TypeScript
109 lines
2.7 KiB
TypeScript
import { FieldMetadataType } from 'src/engine-metadata/field-metadata/field-metadata.entity';
|
|
import { RelationMetadataType } from 'src/engine-metadata/relation-metadata/relation-metadata.entity';
|
|
|
|
const DEFAULT_DEPTH_VALUE = 2;
|
|
|
|
export const mapFieldMetadataToGraphqlQuery = (
|
|
objectMetadataItems,
|
|
field,
|
|
maxDepthForRelations = DEFAULT_DEPTH_VALUE,
|
|
): string | undefined => {
|
|
if (maxDepthForRelations <= 0) {
|
|
return '';
|
|
}
|
|
|
|
const fieldType = field.type;
|
|
|
|
const fieldIsSimpleValue = [
|
|
FieldMetadataType.UUID,
|
|
FieldMetadataType.TEXT,
|
|
FieldMetadataType.PHONE,
|
|
FieldMetadataType.DATE_TIME,
|
|
FieldMetadataType.EMAIL,
|
|
FieldMetadataType.NUMBER,
|
|
FieldMetadataType.BOOLEAN,
|
|
FieldMetadataType.POSITION,
|
|
].includes(fieldType);
|
|
|
|
if (fieldIsSimpleValue) {
|
|
return field.name;
|
|
} else if (
|
|
fieldType === FieldMetadataType.RELATION &&
|
|
field.toRelationMetadata?.relationType === RelationMetadataType.ONE_TO_MANY
|
|
) {
|
|
const relationMetadataItem = objectMetadataItems.find(
|
|
(objectMetadataItem) =>
|
|
objectMetadataItem.id ===
|
|
(field.toRelationMetadata as any)?.fromObjectMetadataId,
|
|
);
|
|
|
|
return `${field.name}
|
|
{
|
|
id
|
|
${(relationMetadataItem?.fields ?? [])
|
|
.filter((field) => field.type !== FieldMetadataType.RELATION)
|
|
.map((field) =>
|
|
mapFieldMetadataToGraphqlQuery(
|
|
objectMetadataItems,
|
|
field,
|
|
maxDepthForRelations - 1,
|
|
),
|
|
)
|
|
.join('\n')}
|
|
}`;
|
|
} else if (
|
|
fieldType === FieldMetadataType.RELATION &&
|
|
field.fromRelationMetadata?.relationType ===
|
|
RelationMetadataType.ONE_TO_MANY
|
|
) {
|
|
const relationMetadataItem = objectMetadataItems.find(
|
|
(objectMetadataItem) =>
|
|
objectMetadataItem.id ===
|
|
(field.fromRelationMetadata as any)?.toObjectMetadataId,
|
|
);
|
|
|
|
return `${field.name}
|
|
{
|
|
edges {
|
|
node {
|
|
id
|
|
${(relationMetadataItem?.fields ?? [])
|
|
.filter((field) => field.type !== FieldMetadataType.RELATION)
|
|
.map((field) =>
|
|
mapFieldMetadataToGraphqlQuery(
|
|
objectMetadataItems,
|
|
field,
|
|
maxDepthForRelations - 1,
|
|
),
|
|
)
|
|
.join('\n')}
|
|
}
|
|
}
|
|
}`;
|
|
} else if (fieldType === FieldMetadataType.LINK) {
|
|
return `
|
|
${field.name}
|
|
{
|
|
label
|
|
url
|
|
}
|
|
`;
|
|
} else if (fieldType === FieldMetadataType.CURRENCY) {
|
|
return `
|
|
${field.name}
|
|
{
|
|
amountMicros
|
|
currencyCode
|
|
}
|
|
`;
|
|
} else if (fieldType === FieldMetadataType.FULL_NAME) {
|
|
return `
|
|
${field.name}
|
|
{
|
|
firstName
|
|
lastName
|
|
}
|
|
`;
|
|
}
|
|
};
|