Update cleaning suspended workspace job (#9999)

- split workspace metadata deletion into multiple queries
- delete all subscriptions when workspace is deleted

---------

Co-authored-by: etiennejouan <jouan.etienne@gmail.com>
This commit is contained in:
Etienne
2025-02-04 15:49:22 +01:00
committed by GitHub
parent dfc1bb7c29
commit cc14c7e0d0
4 changed files with 22 additions and 3 deletions

View File

@ -106,7 +106,7 @@ export class BillingSubscriptionService {
return billingSubscriptionItem;
}
async deleteSubscription(workspaceId: string) {
async deleteSubscriptions(workspaceId: string) {
const subscriptionToCancel =
await this.getCurrentBillingSubscriptionOrThrow({
workspaceId,
@ -116,8 +116,8 @@ export class BillingSubscriptionService {
await this.stripeSubscriptionService.cancelSubscription(
subscriptionToCancel.stripeSubscriptionId,
);
await this.billingSubscriptionRepository.delete(subscriptionToCancel.id);
}
await this.billingSubscriptionRepository.delete({ workspaceId });
}
async handleUnpaidInvoices(data: Stripe.SetupIntentSucceededEvent.Data) {

View File

@ -184,7 +184,7 @@ export class WorkspaceService extends TypeOrmQueryService<Workspace> {
await this.userWorkspaceRepository.delete({ workspaceId: id });
if (this.billingService.isBillingEnabled()) {
await this.billingSubscriptionService.deleteSubscription(workspace.id);
await this.billingSubscriptionService.deleteSubscriptions(workspace.id);
}
await this.workspaceManagerService.delete(id);

View File

@ -4,8 +4,10 @@ import { TypeOrmModule } from '@nestjs/typeorm';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { ObjectMetadataModule } from 'src/engine/metadata-modules/object-metadata/object-metadata.module';
import { PermissionsModule } from 'src/engine/metadata-modules/permissions/permissions.module';
import { RelationMetadataEntity } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
import { RoleModule } from 'src/engine/metadata-modules/role/role.module';
import { UserRoleModule } from 'src/engine/metadata-modules/userRole/userRole.module';
import { WorkspaceMigrationModule } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.module';
@ -30,6 +32,10 @@ import { WorkspaceManagerService } from './workspace-manager.service';
TypeOrmModule.forFeature([UserWorkspace], 'core'),
RoleModule,
UserRoleModule,
TypeOrmModule.forFeature(
[FieldMetadataEntity, RelationMetadataEntity],
'metadata',
),
],
exports: [WorkspaceManagerService],
providers: [WorkspaceManagerService],

View File

@ -7,12 +7,14 @@ import { Repository } from 'typeorm';
import { UserWorkspace } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity';
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service';
import {
PermissionsException,
PermissionsExceptionCode,
} from 'src/engine/metadata-modules/permissions/permissions.exception';
import { PermissionsService } from 'src/engine/metadata-modules/permissions/permissions.service';
import { RelationMetadataEntity } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
import { RoleService } from 'src/engine/metadata-modules/role/role.service';
import { UserRoleService } from 'src/engine/metadata-modules/userRole/userRole.service';
import { WorkspaceMigrationService } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.service';
@ -36,6 +38,10 @@ export class WorkspaceManagerService {
private readonly dataSourceService: DataSourceService,
private readonly workspaceSyncMetadataService: WorkspaceSyncMetadataService,
private readonly permissionsService: PermissionsService,
@InjectRepository(FieldMetadataEntity, 'metadata')
private readonly fieldMetadataRepository: Repository<FieldMetadataEntity>,
@InjectRepository(RelationMetadataEntity, 'metadata')
private readonly relationMetadataRepository: Repository<RelationMetadataEntity>,
@InjectRepository(UserWorkspace, 'core')
private readonly userWorkspaceRepository: Repository<UserWorkspace>,
private readonly roleService: RoleService,
@ -184,6 +190,13 @@ export class WorkspaceManagerService {
*/
public async delete(workspaceId: string): Promise<void> {
// Delete data from metadata tables
await this.relationMetadataRepository.delete({
workspaceId,
});
await this.fieldMetadataRepository.delete({
workspaceId,
});
await this.objectMetadataService.deleteObjectsMetadata(workspaceId);
await this.workspaceMigrationService.deleteAllWithinWorkspace(workspaceId);
await this.dataSourceService.delete(workspaceId);