feat: schema-builder and resolver-builder can handle relations (#2398)

* feat: wip add relation

* feat: add relation for custom and standards objects

* fix: use enum instead of magic string

* fix: remove dead code & fix tests

* fix: typo

* fix: BooleanFilter is missing

* fix: Malformed result error
This commit is contained in:
Jérémy M
2023-11-10 12:32:02 +01:00
committed by GitHub
parent edd152910d
commit 6a700ad1a5
71 changed files with 1842 additions and 1005 deletions

View File

@ -73,14 +73,32 @@ export class ObjectMetadataService extends TypeOrmQueryService<ObjectMetadata> {
public async getObjectMetadataFromWorkspaceId(workspaceId: string) {
return this.objectMetadataRepository.find({
where: { workspaceId },
relations: ['fields'],
relations: [
'fields',
'fields.fromRelationMetadata',
'fields.fromRelationMetadata.fromObjectMetadata',
'fields.fromRelationMetadata.toObjectMetadata',
'fields.fromRelationMetadata.toObjectMetadata.fields',
'fields.toRelationMetadata',
'fields.toRelationMetadata.fromObjectMetadata',
'fields.toRelationMetadata.toObjectMetadata',
],
});
}
public async getObjectMetadataFromDataSourceId(dataSourceId: string) {
return this.objectMetadataRepository.find({
where: { dataSourceId },
relations: ['fields'],
relations: [
'fields',
'fields.fromRelationMetadata',
'fields.fromRelationMetadata.fromObjectMetadata',
'fields.fromRelationMetadata.toObjectMetadata',
'fields.fromRelationMetadata.toObjectMetadata.fields',
'fields.toRelationMetadata',
'fields.toRelationMetadata.fromObjectMetadata',
'fields.toRelationMetadata.toObjectMetadata',
],
});
}

View File

@ -9,16 +9,16 @@ import {
IsUUID,
} from 'class-validator';
import { RelationType } from 'src/metadata/relation-metadata/relation-metadata.entity';
import { RelationMetadataType } from 'src/metadata/relation-metadata/relation-metadata.entity';
import { BeforeCreateOneRelation } from 'src/metadata/relation-metadata/hooks/before-create-one-relation.hook';
@InputType()
@BeforeCreateOne(BeforeCreateOneRelation)
export class CreateRelationInput {
@IsEnum(RelationType)
@IsEnum(RelationMetadataType)
@IsNotEmpty()
@Field()
relationType: RelationType;
relationType: RelationMetadataType;
@IsUUID()
@IsNotEmpty()

View File

@ -17,10 +17,12 @@ import {
Relation,
} from '@ptc-org/nestjs-query-graphql';
import { RelationMetadataInterface } from 'src/tenant/schema-builder/interfaces/relation-metadata.interface';
import { FieldMetadata } from 'src/metadata/field-metadata/field-metadata.entity';
import { ObjectMetadata } from 'src/metadata/object-metadata/object-metadata.entity';
export enum RelationType {
export enum RelationMetadataType {
ONE_TO_ONE = 'ONE_TO_ONE',
ONE_TO_MANY = 'ONE_TO_MANY',
MANY_TO_MANY = 'MANY_TO_MANY',
@ -41,14 +43,14 @@ export enum RelationType {
})
@Relation('fromObjectMetadata', () => ObjectMetadata)
@Relation('toObjectMetadata', () => ObjectMetadata)
export class RelationMetadata {
export class RelationMetadata implements RelationMetadataInterface {
@IDField(() => ID)
@PrimaryGeneratedColumn('uuid')
id: string;
@Field()
@Column({ nullable: false })
relationType: RelationType;
relationType: RelationMetadataType;
@Field()
@Column({ nullable: false, type: 'uuid' })

View File

@ -10,7 +10,7 @@ import { Repository } from 'typeorm';
import {
RelationMetadata,
RelationType,
RelationMetadataType,
} from 'src/metadata/relation-metadata/relation-metadata.entity';
import { ObjectMetadataService } from 'src/metadata/object-metadata/services/object-metadata.service';
import { FieldMetadataService } from 'src/metadata/field-metadata/services/field-metadata.service';
@ -36,7 +36,7 @@ export class RelationMetadataService extends TypeOrmQueryService<RelationMetadat
override async createOne(
record: CreateRelationInput,
): Promise<RelationMetadata> {
if (record.relationType === RelationType.MANY_TO_MANY) {
if (record.relationType === RelationMetadataType.MANY_TO_MANY) {
throw new BadRequestException(
'Many to many relations are not supported yet',
);