diff --git a/server/src/core/workspace/services/workspace.service.ts b/server/src/core/workspace/services/workspace.service.ts index 84484ed83..17c2fb7c3 100644 --- a/server/src/core/workspace/services/workspace.service.ts +++ b/server/src/core/workspace/services/workspace.service.ts @@ -161,6 +161,8 @@ export class WorkspaceService { this.delete({ where: { id: workspaceId } }), ]); + await this.tenantInitialisationService.delete(workspaceId); + return workspace; } } diff --git a/server/src/metadata/data-source-metadata/data-source-metadata.service.ts b/server/src/metadata/data-source-metadata/data-source-metadata.service.ts index e99813058..6698a2bf6 100644 --- a/server/src/metadata/data-source-metadata/data-source-metadata.service.ts +++ b/server/src/metadata/data-source-metadata/data-source-metadata.service.ts @@ -41,4 +41,8 @@ export class DataSourceMetadataService { order: { createdAt: 'DESC' }, }); } + + async delete(workspaceId: string) { + await this.dataSourceMetadataRepository.delete({ workspaceId }); + } } diff --git a/server/src/metadata/data-source/data-source.service.ts b/server/src/metadata/data-source/data-source.service.ts index f53e3703d..1cee57c26 100644 --- a/server/src/metadata/data-source/data-source.service.ts +++ b/server/src/metadata/data-source/data-source.service.ts @@ -121,6 +121,20 @@ export class DataSourceService implements OnModuleInit, OnModuleDestroy { return `workspace_${uuidToBase36(workspaceId)}`; } + public async deleteWorkspaceSchema(workspaceId: string) { + const schemaName = this.getSchemaName(workspaceId); + const queryRunner = this.mainDataSource.createQueryRunner(); + const schemaAlreadyExists = await queryRunner.hasSchema(schemaName); + + if (!schemaAlreadyExists) { + throw new Error(`Schema ${schemaName} does not exist`); + } + + await queryRunner.dropSchema(schemaName, true, true); + + await queryRunner.release(); + } + async onModuleInit() { // Init main data source "default" schema await this.mainDataSource.initialize(); 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 6ff25823b..9b61da3b0 100644 --- a/server/src/metadata/object-metadata/services/object-metadata.service.ts +++ b/server/src/metadata/object-metadata/services/object-metadata.service.ts @@ -120,4 +120,8 @@ export class ObjectMetadataService extends TypeOrmQueryService { })), ); } + + public async deleteObjectsAndFieldsMetadata(workspaceId: string) { + await this.objectMetadataRepository.delete({ workspaceId }); + } } diff --git a/server/src/metadata/tenant-initialisation/tenant-initialisation.service.ts b/server/src/metadata/tenant-initialisation/tenant-initialisation.service.ts index 48438670a..c291f6f4a 100644 --- a/server/src/metadata/tenant-initialisation/tenant-initialisation.service.ts +++ b/server/src/metadata/tenant-initialisation/tenant-initialisation.service.ts @@ -75,4 +75,15 @@ export class TenantInitialisationService { standardObjectsPrefillData(workspaceDataSource, dataSourceMetadata.schema); } + + public async delete(workspaceId: string): Promise { + // Delete data from metadata tables + await this.objectMetadataService.deleteObjectsAndFieldsMetadata( + workspaceId, + ); + await this.tenantMigrationService.delete(workspaceId); + await this.dataSourceMetadataService.delete(workspaceId); + // Delete schema + await this.dataSourceService.deleteWorkspaceSchema(workspaceId); + } } diff --git a/server/src/metadata/tenant-migration/tenant-migration.service.ts b/server/src/metadata/tenant-migration/tenant-migration.service.ts index 37ff0a194..aa8af710a 100644 --- a/server/src/metadata/tenant-migration/tenant-migration.service.ts +++ b/server/src/metadata/tenant-migration/tenant-migration.service.ts @@ -103,4 +103,8 @@ export class TenantMigrationService { isCustom: true, }); } + + public async delete(workspaceId: string) { + await this.tenantMigrationRepository.delete({ workspaceId }); + } }