Add Relation Metadata (#2388)

* Add Relation Metadata

* remove logs

* fix migrations

* add one-to-many relation inside entities

* fix relation

* use enum for tenant migration column action type
This commit is contained in:
Weiko
2023-11-08 09:39:44 +01:00
committed by GitHub
parent 4ca4f17897
commit cafffd973f
21 changed files with 631 additions and 130 deletions

View File

@ -6,6 +6,7 @@ import {
Entity,
JoinColumn,
ManyToOne,
OneToOne,
PrimaryGeneratedColumn,
Unique,
UpdateDateColumn,
@ -15,11 +16,13 @@ import {
BeforeCreateOne,
IDField,
QueryOptions,
Relation,
} from '@ptc-org/nestjs-query-graphql';
import { FieldMetadataInterface } from 'src/tenant/schema-builder/interfaces/field-metadata.interface';
import { ObjectMetadata } from 'src/metadata/object-metadata/object-metadata.entity';
import { RelationMetadata } from 'src/metadata/relation-metadata/relation-metadata.entity';
import { BeforeCreateOneField } from './hooks/before-create-one-field.hook';
import { FieldMetadataTargetColumnMap } from './interfaces/field-metadata-target-column-map.interface';
@ -35,6 +38,7 @@ export enum FieldMetadataType {
ENUM = 'ENUM',
URL = 'URL',
MONEY = 'MONEY',
RELATION = 'RELATION',
}
registerEnumType(FieldMetadataType, {
@ -61,6 +65,8 @@ registerEnumType(FieldMetadataType, {
'objectId',
'workspaceId',
])
@Relation('toRelationMetadata', () => RelationMetadata, { nullable: true })
@Relation('fromRelationMetadata', () => RelationMetadata, { nullable: true })
export class FieldMetadata implements FieldMetadataInterface {
@IDField(() => ID)
@PrimaryGeneratedColumn('uuid')
@ -119,6 +125,12 @@ export class FieldMetadata implements FieldMetadataInterface {
@JoinColumn({ name: 'object_id' })
object: ObjectMetadata;
@OneToOne(() => RelationMetadata, (relation) => relation.fromFieldMetadata)
fromRelationMetadata: RelationMetadata;
@OneToOne(() => RelationMetadata, (relation) => relation.toFieldMetadata)
toRelationMetadata: RelationMetadata;
@Field()
@CreateDateColumn({ name: 'created_at' })
createdAt: Date;

View File

@ -53,6 +53,8 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadata> {
throw new BadRequestException("Active fields can't be deleted");
}
// TODO: delete associated relation-metadata and field-metadata from the relation
return super.deleteOne(id, opts);
}

View File

@ -7,7 +7,10 @@ import {
FieldMetadata,
FieldMetadataType,
} from 'src/metadata/field-metadata/field-metadata.entity';
import { TenantMigrationColumnAction } from 'src/metadata/tenant-migration/tenant-migration.entity';
import {
TenantMigrationColumnAction,
TenantMigrationColumnActionType,
} from 'src/metadata/tenant-migration/tenant-migration.entity';
/**
* Generate a column name from a field name removing unsupported characters.
@ -61,68 +64,68 @@ export function convertFieldMetadataToColumnActions(
case FieldMetadataType.TEXT:
return [
{
name: fieldMetadata.targetColumnMap.value,
action: 'create',
type: 'text',
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.value,
columnType: 'text',
},
];
case FieldMetadataType.PHONE:
case FieldMetadataType.EMAIL:
return [
{
name: fieldMetadata.targetColumnMap.value,
action: 'create',
type: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.value,
columnType: 'varchar',
},
];
case FieldMetadataType.NUMBER:
return [
{
name: fieldMetadata.targetColumnMap.value,
action: 'create',
type: 'integer',
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.value,
columnType: 'integer',
},
];
case FieldMetadataType.BOOLEAN:
return [
{
name: fieldMetadata.targetColumnMap.value,
action: 'create',
type: 'boolean',
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.value,
columnType: 'boolean',
},
];
case FieldMetadataType.DATE:
return [
{
name: fieldMetadata.targetColumnMap.value,
action: 'create',
type: 'timestamp',
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.value,
columnType: 'timestamp',
},
];
case FieldMetadataType.URL:
return [
{
name: fieldMetadata.targetColumnMap.text,
action: 'create',
type: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.text,
columnType: 'varchar',
},
{
name: fieldMetadata.targetColumnMap.link,
action: 'create',
type: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.link,
columnType: 'varchar',
},
];
case FieldMetadataType.MONEY:
return [
{
name: fieldMetadata.targetColumnMap.amount,
action: 'create',
type: 'integer',
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.amount,
columnType: 'integer',
},
{
name: fieldMetadata.targetColumnMap.currency,
action: 'create',
type: 'varchar',
action: TenantMigrationColumnActionType.CREATE,
columnName: fieldMetadata.targetColumnMap.currency,
columnType: 'varchar',
},
];
default: