fix: multiple twenty orm issues & show an example of use (#5439)

This PR is fixing some issues and adding enhancement in TwentyORM:

- [x] Composite fields in nested relations are not formatted properly
- [x] Passing operators like `Any` in `where` condition is breaking the
query
- [x] Ability to auto load workspace-entities based on a regex path

I've also introduced an example of use for `CalendarEventService`:


https://github.com/twentyhq/twenty/pull/5439/files#diff-3a7dffc0dea57345d10e70c648e911f98fe237248bcea124dafa9c8deb1db748R15
This commit is contained in:
Jérémy M
2024-05-20 11:01:47 +02:00
committed by GitHub
parent 81e8f49033
commit 8b5f79ddbf
147 changed files with 1108 additions and 1101 deletions

View File

@ -3,6 +3,7 @@ import { Injectable } from '@nestjs/common';
import { ColumnType, EntitySchemaColumnOptions } from 'typeorm';
import { WorkspaceFieldMetadataArgs } from 'src/engine/twenty-orm/interfaces/workspace-field-metadata-args.interface';
import { WorkspaceRelationMetadataArgs } from 'src/engine/twenty-orm/interfaces/workspace-relation-metadata-args.interface';
import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util';
import { isEnumFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
@ -20,6 +21,7 @@ type EntitySchemaColumnMap = {
export class EntitySchemaColumnFactory {
create(
fieldMetadataArgsCollection: WorkspaceFieldMetadataArgs[],
relationMetadataArgsCollection: WorkspaceRelationMetadataArgs[],
): EntitySchemaColumnMap {
let entitySchemaColumnMap: EntitySchemaColumnMap = {};
@ -53,6 +55,16 @@ export class EntitySchemaColumnFactory {
default: defaultValue,
};
for (const relationMetadataArgs of relationMetadataArgsCollection) {
if (relationMetadataArgs.joinColumn) {
entitySchemaColumnMap[relationMetadataArgs.joinColumn] = {
name: relationMetadataArgs.joinColumn,
type: 'uuid',
nullable: relationMetadataArgs.isNullable,
};
}
}
if (isEnumFieldMetadataType(fieldMetadataArgs.type)) {
const values = fieldMetadataArgs.options?.map((option) => option.value);

View File

@ -15,11 +15,14 @@ type EntitySchemaRelationMap = {
@Injectable()
export class EntitySchemaRelationFactory {
create(
// eslint-disable-next-line @typescript-eslint/ban-types
target: Function,
relationMetadataArgsCollection: WorkspaceRelationMetadataArgs[],
): EntitySchemaRelationMap {
const entitySchemaRelationMap: EntitySchemaRelationMap = {};
for (const relationMetadataArgs of relationMetadataArgsCollection) {
const objectName = convertClassNameToObjectMetadataName(target.name);
const oppositeTarget = relationMetadataArgs.inverseSideTarget();
const oppositeObjectName = convertClassNameToObjectMetadataName(
oppositeTarget.name,
@ -30,7 +33,7 @@ export class EntitySchemaRelationFactory {
entitySchemaRelationMap[relationMetadataArgs.name] = {
type: relationType,
target: oppositeObjectName,
inverseSide: relationMetadataArgs.inverseSideFieldKey,
inverseSide: relationMetadataArgs.inverseSideFieldKey ?? objectName,
joinColumn: relationMetadataArgs.joinColumn
? {
name: relationMetadataArgs.joinColumn,

View File

@ -28,9 +28,11 @@ export class EntitySchemaFactory {
const columns = this.entitySchemaColumnFactory.create(
fieldMetadataArgsCollection,
relationMetadataArgsCollection,
);
const relations = this.entitySchemaRelationFactory.create(
target,
relationMetadataArgsCollection,
);