diff --git a/server/apps/microservices/src/microservices.module.ts b/server/apps/microservices/src/microservices.module.ts index 146f48d153..8e88b3349a 100644 --- a/server/apps/microservices/src/microservices.module.ts +++ b/server/apps/microservices/src/microservices.module.ts @@ -1,5 +1,14 @@ import { immichAppConfig } from '@app/common/config'; -import { AssetEntity, ExifEntity, SmartInfoEntity, UserEntity, APIKeyEntity, InfraModule } from '@app/infra'; +import { + AssetEntity, + ExifEntity, + SmartInfoEntity, + UserEntity, + APIKeyEntity, + InfraModule, + UserTokenEntity, + AlbumEntity, +} from '@app/infra'; import { StorageModule } from '@app/storage'; import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @@ -23,7 +32,15 @@ import { DomainModule } from '@app/domain'; DomainModule.register({ imports: [InfraModule], }), - TypeOrmModule.forFeature([UserEntity, ExifEntity, AssetEntity, SmartInfoEntity, APIKeyEntity]), + TypeOrmModule.forFeature([ + UserEntity, + ExifEntity, + AssetEntity, + SmartInfoEntity, + APIKeyEntity, + UserTokenEntity, + AlbumEntity, + ]), StorageModule, CommunicationModule, ], diff --git a/server/apps/microservices/src/processors/user-deletion.processor.ts b/server/apps/microservices/src/processors/user-deletion.processor.ts index 6de6530304..b8579d81eb 100644 --- a/server/apps/microservices/src/processors/user-deletion.processor.ts +++ b/server/apps/microservices/src/processors/user-deletion.processor.ts @@ -1,5 +1,5 @@ import { APP_UPLOAD_LOCATION, userUtils } from '@app/common'; -import { APIKeyEntity, AssetEntity, UserEntity } from '@app/infra'; +import { AlbumEntity, APIKeyEntity, AssetEntity, UserEntity, UserTokenEntity } from '@app/infra'; import { QueueName, JobName } from '@app/domain'; import { IUserDeletionJob } from '@app/domain'; import { Process, Processor } from '@nestjs/bull'; @@ -23,6 +23,12 @@ export class UserDeletionProcessor { @InjectRepository(APIKeyEntity) private apiKeyRepository: Repository, + + @InjectRepository(UserTokenEntity) + private userTokenRepository: Repository, + + @InjectRepository(AlbumEntity) + private albumRepository: Repository, ) {} @Process(JobName.USER_DELETION) @@ -44,6 +50,16 @@ export class UserDeletionProcessor { fs.rmSync(userAssetDir, { recursive: true, force: true }); this.logger.warn(`Removing user from database: ${user.id}`); + const userTokens = await this.userTokenRepository.find({ + where: { user: { id: user.id } }, + relations: { user: true }, + withDeleted: true, + }); + await this.userTokenRepository.remove(userTokens); + + const albums = await this.albumRepository.find({ where: { ownerId: user.id } }); + await this.albumRepository.remove(albums); + await this.apiKeyRepository.delete({ userId: user.id }); await this.assetRepository.delete({ userId: user.id }); await this.userRepository.remove(user); diff --git a/server/libs/infra/src/db/migrations/1675701909594-AddAlbumUserForeignKeyConstraint.ts b/server/libs/infra/src/db/migrations/1675701909594-AddAlbumUserForeignKeyConstraint.ts index b2e7a6cb1e..0898accfb7 100644 --- a/server/libs/infra/src/db/migrations/1675701909594-AddAlbumUserForeignKeyConstraint.ts +++ b/server/libs/infra/src/db/migrations/1675701909594-AddAlbumUserForeignKeyConstraint.ts @@ -4,6 +4,7 @@ export class AddAlbumUserForeignKeyConstraint1675701909594 implements MigrationI name = 'AddAlbumUserForeignKeyConstraint1675701909594'; public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DELETE FROM "albums" WHERE "ownerId"::uuid NOT IN (SELECT id FROM "users") `) await queryRunner.query(`ALTER TABLE "albums" ALTER COLUMN "ownerId" TYPE varchar(36)`); await queryRunner.query(`ALTER TABLE "albums" ALTER COLUMN "ownerId" TYPE uuid using "ownerId"::uuid`); await queryRunner.query(