-
Notifications
You must be signed in to change notification settings - Fork 5.7k
Expand file tree
/
Copy pathbuild-columns-to-select.ts
More file actions
103 lines (86 loc) · 3.42 KB
/
build-columns-to-select.ts
File metadata and controls
103 lines (86 loc) · 3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
export const buildColumnsToSelect = ({
select,
relations,
flatObjectMetadata,
flatObjectMetadataMaps,
flatFieldMetadataMaps,
}: {
select: Record<string, unknown>;
relations: Record<string, unknown>;
flatObjectMetadata: FlatObjectMetadata;
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>;
}) => {
const requiredRelationColumns = getRequiredRelationColumns(
relations,
flatObjectMetadata,
flatObjectMetadataMaps,
flatFieldMetadataMaps,
);
const fieldsToSelect: Record<string, boolean> = Object.entries(select)
.filter(
([_columnName, value]) => value === true && typeof value !== 'object',
)
.reduce((acc, [columnName]) => ({ ...acc, [columnName]: true }), {});
for (const columnName of requiredRelationColumns) {
fieldsToSelect[columnName] = true;
}
return { ...fieldsToSelect, id: true };
};
const getRequiredRelationColumns = (
relations: Record<string, unknown>,
flatObjectMetadata: FlatObjectMetadata,
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>,
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>,
): string[] => {
const requiredColumns: string[] = [];
for (const fieldId of flatObjectMetadata.fieldIds) {
const fieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: fieldId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (isFlatFieldMetadataOfType(fieldMetadata, FieldMetadataType.RELATION)) {
const relationValue = relations[fieldMetadata.name];
if (
!isDefined(relationValue) ||
!isDefined(fieldMetadata?.settings?.joinColumnName) ||
fieldMetadata.settings?.relationType !== RelationType.MANY_TO_ONE
) {
continue;
}
requiredColumns.push(fieldMetadata.settings.joinColumnName);
}
if (
isFlatFieldMetadataOfType(fieldMetadata, FieldMetadataType.MORPH_RELATION)
) {
const targetObjectMetadata = fieldMetadata.relationTargetObjectMetadataId
? flatObjectMetadataMaps.byId[
fieldMetadata.relationTargetObjectMetadataId
]
: undefined;
if (
!fieldMetadata.settings?.relationType ||
!isDefined(targetObjectMetadata)
) {
continue;
}
const relationValue = relations[fieldMetadata.name];
if (
!isDefined(relationValue) ||
!isDefined(fieldMetadata?.settings?.joinColumnName)
) {
continue;
}
requiredColumns.push(fieldMetadata.settings.joinColumnName);
}
}
return requiredColumns;
};