diff --git a/server/src/repositories/event.repository.ts b/server/src/repositories/event.repository.ts index 0b18fae08..420be0e1b 100644 --- a/server/src/repositories/event.repository.ts +++ b/server/src/repositories/event.repository.ts @@ -94,6 +94,9 @@ type EventMap = { // user events UserSignup: [{ notify: boolean; id: string; password?: string }]; UserCreate: [UserEvent]; + /** user is soft deleted */ + UserTrash: [UserEvent]; + /** user is permanently deleted */ UserDelete: [UserEvent]; UserRestore: [UserEvent]; diff --git a/server/src/services/job.service.ts b/server/src/services/job.service.ts index 98713a71f..658e5dbd7 100644 --- a/server/src/services/job.service.ts +++ b/server/src/services/job.service.ts @@ -421,11 +421,6 @@ export class JobService extends BaseService { } break; } - - case JobName.UserDelete: { - this.eventRepository.clientBroadcast('on_user_delete', item.data.id); - break; - } } } } diff --git a/server/src/services/notification.service.ts b/server/src/services/notification.service.ts index 07c1f0aff..51cd51811 100644 --- a/server/src/services/notification.service.ts +++ b/server/src/services/notification.service.ts @@ -202,6 +202,11 @@ export class NotificationService extends BaseService { } } + @OnEvent({ name: 'UserDelete' }) + onUserDelete({ id }: ArgOf<'UserDelete'>) { + this.eventRepository.clientBroadcast('on_user_delete', id); + } + @OnEvent({ name: 'AlbumUpdate' }) async onAlbumUpdate({ id, recipientId }: ArgOf<'AlbumUpdate'>) { await this.jobRepository.removeJob(JobName.NotifyAlbumUpdate, `${id}/${recipientId}`); diff --git a/server/src/services/telemetry.service.ts b/server/src/services/telemetry.service.ts index 5c5b01727..7c4fe4321 100644 --- a/server/src/services/telemetry.service.ts +++ b/server/src/services/telemetry.service.ts @@ -16,8 +16,8 @@ export class TelemetryService extends BaseService { this.telemetryRepository.api.addToGauge(`immich.users.total`, 1); } - @OnEvent({ name: 'UserDelete' }) - onUserDelete() { + @OnEvent({ name: 'UserTrash' }) + onUserTrash() { this.telemetryRepository.api.addToGauge(`immich.users.total`, -1); } diff --git a/server/src/services/user-admin.service.ts b/server/src/services/user-admin.service.ts index 046ea6b45..58b4221cc 100644 --- a/server/src/services/user-admin.service.ts +++ b/server/src/services/user-admin.service.ts @@ -104,7 +104,7 @@ export class UserAdminService extends BaseService { const status = force ? UserStatus.Removing : UserStatus.Deleted; const user = await this.userRepository.update(id, { status, deletedAt: new Date() }); - await this.eventRepository.emit('UserDelete', user); + await this.eventRepository.emit('UserTrash', user); if (force) { await this.jobRepository.queue({ name: JobName.UserDelete, data: { id: user.id, force } }); diff --git a/server/src/services/user.service.ts b/server/src/services/user.service.ts index 6849b17ac..9fb1f45e5 100644 --- a/server/src/services/user.service.ts +++ b/server/src/services/user.service.ts @@ -228,17 +228,17 @@ export class UserService extends BaseService { } @OnJob({ name: JobName.UserDelete, queue: QueueName.BackgroundTask }) - async handleUserDelete({ id, force }: JobOf): Promise { + async handleUserDelete({ id, force }: JobOf) { const config = await this.getConfig({ withCache: false }); const user = await this.userRepository.get(id, { withDeleted: true }); if (!user) { - return JobStatus.Failed; + return; } // just for extra protection here if (!force && !this.isReadyForDeletion(user, config.user.deleteDelay)) { this.logger.warn(`Skipped user that was not ready for deletion: id=${id}`); - return JobStatus.Skipped; + return; } this.logger.log(`Deleting user: ${user.id}`); @@ -260,7 +260,7 @@ export class UserService extends BaseService { await this.albumRepository.deleteAll(user.id); await this.userRepository.delete(user, true); - return JobStatus.Success; + await this.eventRepository.emit('UserDelete', user); } private isReadyForDeletion(user: { id: string; deletedAt?: Date | null }, deleteDelay: number): boolean {