From c06a8a9213782e3fb503f55b60118d5cb44452a9 Mon Sep 17 00:00:00 2001 From: Weiko Date: Mon, 16 Oct 2023 22:04:17 +0200 Subject: [PATCH] Add soft delete to metadata (#2072) --- .../field-metadata/dtos/create-field.input.ts | 5 ---- .../field-metadata/dtos/update-field.input.ts | 5 ---- .../field-metadata/field-metadata.entity.ts | 7 ++++-- .../services/field-metadata.service.ts | 2 +- server/src/metadata/metadata.datasource.ts | 4 ++++ ...71445015-removeFieldMetadataPlaceholder.ts | 19 +++++++++++++++ .../migrations/1697474804403-addSoftDelete.ts | 23 +++++++++++++++++++ .../object-metadata.auto-resolver-opts.ts | 1 - .../object-metadata/object-metadata.entity.ts | 4 ++++ .../services/object-metadata.service.ts | 2 +- 10 files changed, 57 insertions(+), 15 deletions(-) create mode 100644 server/src/metadata/migrations/1697471445015-removeFieldMetadataPlaceholder.ts create mode 100644 server/src/metadata/migrations/1697474804403-addSoftDelete.ts diff --git a/server/src/metadata/field-metadata/dtos/create-field.input.ts b/server/src/metadata/field-metadata/dtos/create-field.input.ts index ddca1427c..6631f6a92 100644 --- a/server/src/metadata/field-metadata/dtos/create-field.input.ts +++ b/server/src/metadata/field-metadata/dtos/create-field.input.ts @@ -58,9 +58,4 @@ export class CreateFieldInput { @IsOptional() @Field({ nullable: true }) icon?: string; - - @IsString() - @IsOptional() - @Field({ nullable: true }) - placeholder?: string; } diff --git a/server/src/metadata/field-metadata/dtos/update-field.input.ts b/server/src/metadata/field-metadata/dtos/update-field.input.ts index 2c9a912ac..d48d6f313 100644 --- a/server/src/metadata/field-metadata/dtos/update-field.input.ts +++ b/server/src/metadata/field-metadata/dtos/update-field.input.ts @@ -34,11 +34,6 @@ export class UpdateFieldInput { @Field({ nullable: true }) icon?: string; - @IsString() - @IsOptional() - @Field({ nullable: true }) - placeholder?: string; - @IsBoolean() @IsOptional() @Field({ nullable: true }) diff --git a/server/src/metadata/field-metadata/field-metadata.entity.ts b/server/src/metadata/field-metadata/field-metadata.entity.ts index afeda82d1..7f5c603c9 100644 --- a/server/src/metadata/field-metadata/field-metadata.entity.ts +++ b/server/src/metadata/field-metadata/field-metadata.entity.ts @@ -3,6 +3,7 @@ import { Field, ID, ObjectType } from '@nestjs/graphql'; import { Column, CreateDateColumn, + DeleteDateColumn, Entity, JoinColumn, ManyToOne, @@ -76,8 +77,7 @@ export class FieldMetadata { @Column({ nullable: true, name: 'icon' }) icon: string; - @Field({ nullable: true }) - @Column({ nullable: true, name: 'placeholder' }) + @Field({ nullable: true, deprecationReason: 'Use label name instead' }) placeholder: string; @Column('text', { nullable: true, array: true }) @@ -109,4 +109,7 @@ export class FieldMetadata { @Field() @UpdateDateColumn({ name: 'updated_at' }) updatedAt: Date; + + @DeleteDateColumn({ name: 'deleted_at' }) + deletedAt?: Date; } diff --git a/server/src/metadata/field-metadata/services/field-metadata.service.ts b/server/src/metadata/field-metadata/services/field-metadata.service.ts index c7a2aadf9..061022505 100644 --- a/server/src/metadata/field-metadata/services/field-metadata.service.ts +++ b/server/src/metadata/field-metadata/services/field-metadata.service.ts @@ -28,7 +28,7 @@ export class FieldMetadataService extends TypeOrmQueryService { private readonly tenantMigrationService: TenantMigrationService, private readonly migrationRunnerService: MigrationRunnerService, ) { - super(fieldMetadataRepository); + super(fieldMetadataRepository, { useSoftDelete: true }); } override async createOne(record: FieldMetadata): Promise { diff --git a/server/src/metadata/metadata.datasource.ts b/server/src/metadata/metadata.datasource.ts index 8ac654f5d..a80ab8725 100644 --- a/server/src/metadata/metadata.datasource.ts +++ b/server/src/metadata/metadata.datasource.ts @@ -8,6 +8,8 @@ import { InitMetadataTables1695214465080 } from './migrations/1695214465080-Init import { AlterFieldMetadataTable1695717691800 } from './migrations/1695717691800-alter-field-metadata-table'; import { AddTargetColumnMap1696409050890 } from './migrations/1696409050890-add-target-column-map'; import { MetadataNameLabelRefactoring1697126636202 } from './migrations/1697126636202-MetadataNameLabelRefactoring'; +import { RemoveFieldMetadataPlaceholder1697471445015 } from './migrations/1697471445015-removeFieldMetadataPlaceholder'; +import { AddSoftDelete1697474804403 } from './migrations/1697474804403-addSoftDelete'; config(); @@ -27,6 +29,8 @@ export const typeORMMetadataModuleOptions: TypeOrmModuleOptions = { AlterFieldMetadataTable1695717691800, AddTargetColumnMap1696409050890, MetadataNameLabelRefactoring1697126636202, + RemoveFieldMetadataPlaceholder1697471445015, + AddSoftDelete1697474804403, ], }; diff --git a/server/src/metadata/migrations/1697471445015-removeFieldMetadataPlaceholder.ts b/server/src/metadata/migrations/1697471445015-removeFieldMetadataPlaceholder.ts new file mode 100644 index 000000000..b1235e2e5 --- /dev/null +++ b/server/src/metadata/migrations/1697471445015-removeFieldMetadataPlaceholder.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class RemoveFieldMetadataPlaceholder1697471445015 + implements MigrationInterface +{ + name = 'RemoveFieldMetadataPlaceholder1697471445015'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "metadata"."field_metadata" DROP COLUMN "placeholder"`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "metadata"."field_metadata" ADD "placeholder" character varying`, + ); + } +} diff --git a/server/src/metadata/migrations/1697474804403-addSoftDelete.ts b/server/src/metadata/migrations/1697474804403-addSoftDelete.ts new file mode 100644 index 000000000..675525c67 --- /dev/null +++ b/server/src/metadata/migrations/1697474804403-addSoftDelete.ts @@ -0,0 +1,23 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddSoftDelete1697474804403 implements MigrationInterface { + name = 'AddSoftDelete1697474804403'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "metadata"."object_metadata" ADD "deleted_at" TIMESTAMP`, + ); + await queryRunner.query( + `ALTER TABLE "metadata"."field_metadata" ADD "deleted_at" TIMESTAMP`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "metadata"."field_metadata" DROP COLUMN "deleted_at"`, + ); + await queryRunner.query( + `ALTER TABLE "metadata"."object_metadata" DROP COLUMN "deleted_at"`, + ); + } +} diff --git a/server/src/metadata/object-metadata/object-metadata.auto-resolver-opts.ts b/server/src/metadata/object-metadata/object-metadata.auto-resolver-opts.ts index a11fab7e3..863badd96 100644 --- a/server/src/metadata/object-metadata/object-metadata.auto-resolver-opts.ts +++ b/server/src/metadata/object-metadata/object-metadata.auto-resolver-opts.ts @@ -38,7 +38,6 @@ export const objectMetadataAutoResolverOpts: AutoResolverOpts< update: { many: { disabled: true }, }, - delete: { disabled: true }, guards: [JwtAuthGuard], }, ]; diff --git a/server/src/metadata/object-metadata/object-metadata.entity.ts b/server/src/metadata/object-metadata/object-metadata.entity.ts index f4d209c5b..a26c3ab9e 100644 --- a/server/src/metadata/object-metadata/object-metadata.entity.ts +++ b/server/src/metadata/object-metadata/object-metadata.entity.ts @@ -3,6 +3,7 @@ import { ObjectType, ID, Field } from '@nestjs/graphql'; import { Column, CreateDateColumn, + DeleteDateColumn, Entity, OneToMany, PrimaryGeneratedColumn, @@ -92,4 +93,7 @@ export class ObjectMetadata { @Field() @UpdateDateColumn({ name: 'updated_at' }) updatedAt: Date; + + @DeleteDateColumn({ name: 'deleted_at' }) + deletedAt?: Date; } diff --git a/server/src/metadata/object-metadata/services/object-metadata.service.ts b/server/src/metadata/object-metadata/services/object-metadata.service.ts index a007e1754..f88ef5d36 100644 --- a/server/src/metadata/object-metadata/services/object-metadata.service.ts +++ b/server/src/metadata/object-metadata/services/object-metadata.service.ts @@ -18,7 +18,7 @@ export class ObjectMetadataService extends TypeOrmQueryService { private readonly tenantMigrationService: TenantMigrationService, private readonly migrationRunnerService: MigrationRunnerService, ) { - super(objectMetadataRepository); + super(objectMetadataRepository, { useSoftDelete: true }); } override async createOne(record: ObjectMetadata): Promise {