diff --git a/src/notes/notes.service.ts b/src/notes/notes.service.ts index 257f73dbd..ed85fb941 100644 --- a/src/notes/notes.service.ts +++ b/src/notes/notes.service.ts @@ -5,6 +5,7 @@ */ import { Optional } from '@mrdrogdrog/optional'; import { forwardRef, Inject, Injectable } from '@nestjs/common'; +import { EventEmitter2 } from '@nestjs/event-emitter'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; @@ -15,6 +16,7 @@ import { ForbiddenIdError, NotInDBError, } from '../errors/errors'; +import { NoteEvent } from '../events'; import { Group } from '../groups/group.entity'; import { GroupsService } from '../groups/groups.service'; import { HistoryEntry } from '../history/history-entry.entity'; @@ -51,6 +53,7 @@ export class NotesService { @Inject(forwardRef(() => AliasService)) private aliasService: AliasService, private realtimeNoteService: RealtimeNoteService, private realtimeNoteStore: RealtimeNoteStore, + private eventEmitter: EventEmitter2, ) { this.logger.setContext(NotesService.name); } @@ -260,10 +263,7 @@ export class NotesService { * @throws {NotInDBError} there is no note with this id or alias */ async deleteNote(note: Note): Promise { - const realtimeNote = this.realtimeNoteStore.find(note.id); - if (realtimeNote) { - realtimeNote.announceNoteDeletion(); - } + this.eventEmitter.emit(NoteEvent.DELETION, note.id); return await this.noteRepository.remove(note); } diff --git a/src/permissions/permissions.module.ts b/src/permissions/permissions.module.ts index 3eed6cbfc..8192ffe23 100644 --- a/src/permissions/permissions.module.ts +++ b/src/permissions/permissions.module.ts @@ -3,13 +3,12 @@ * * SPDX-License-Identifier: AGPL-3.0-only */ -import { forwardRef, Module } from '@nestjs/common'; +import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { GroupsModule } from '../groups/groups.module'; import { LoggerModule } from '../logger/logger.module'; import { Note } from '../notes/note.entity'; -import { RealtimeNoteModule } from '../realtime/realtime-note/realtime-note.module'; import { UsersModule } from '../users/users.module'; import { PermissionsService } from './permissions.service'; @@ -19,7 +18,6 @@ import { PermissionsService } from './permissions.service'; UsersModule, GroupsModule, LoggerModule, - forwardRef(() => RealtimeNoteModule), ], exports: [PermissionsService], providers: [PermissionsService], diff --git a/src/permissions/permissions.service.ts b/src/permissions/permissions.service.ts index 095fc8b22..b383bcadd 100644 --- a/src/permissions/permissions.service.ts +++ b/src/permissions/permissions.service.ts @@ -4,6 +4,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ import { Inject, Injectable } from '@nestjs/common'; +import { EventEmitter2 } from '@nestjs/event-emitter'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; @@ -13,14 +14,13 @@ import { } from '../config/guest_access.enum'; import noteConfiguration, { NoteConfig } from '../config/note.config'; import { PermissionsUpdateInconsistentError } from '../errors/errors'; +import { NoteEvent } from '../events'; import { Group } from '../groups/group.entity'; import { GroupsService } from '../groups/groups.service'; import { SpecialGroup } from '../groups/groups.special'; import { ConsoleLoggerService } from '../logger/console-logger.service'; import { NotePermissionsUpdateDto } from '../notes/note-permissions.dto'; import { Note } from '../notes/note.entity'; -import { RealtimeNoteStore } from '../realtime/realtime-note/realtime-note-store'; -import { RealtimeNoteService } from '../realtime/realtime-note/realtime-note.service'; import { User } from '../users/user.entity'; import { UsersService } from '../users/users.service'; import { checkArrayForDuplicates } from '../utils/arrayDuplicatCheck'; @@ -36,8 +36,7 @@ export class PermissionsService { private readonly logger: ConsoleLoggerService, @Inject(noteConfiguration.KEY) private noteConfig: NoteConfig, - private realtimeNoteService: RealtimeNoteService, - private realtimeNoteStore: RealtimeNoteStore, + private eventEmitter: EventEmitter2, ) {} /** @@ -155,10 +154,7 @@ export class PermissionsService { } private notifyOthers(noteId: Note['id']): void { - const realtimeNote = this.realtimeNoteStore.find(noteId); - if (realtimeNote) { - realtimeNote.announcePermissionChange(); - } + this.eventEmitter.emit(NoteEvent.PERMISSION_CHANGE, noteId); } /** diff --git a/src/realtime/realtime-note/realtime-note.service.ts b/src/realtime/realtime-note/realtime-note.service.ts index bef57e6f8..6836814cc 100644 --- a/src/realtime/realtime-note/realtime-note.service.ts +++ b/src/realtime/realtime-note/realtime-note.service.ts @@ -5,9 +5,11 @@ */ import { Optional } from '@mrdrogdrog/optional'; import { BeforeApplicationShutdown, Inject, Injectable } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; import { SchedulerRegistry } from '@nestjs/schedule'; import appConfiguration, { AppConfig } from '../../config/app.config'; +import { NoteEvent } from '../../events'; import { ConsoleLoggerService } from '../../logger/console-logger.service'; import { Note } from '../../notes/note.entity'; import { RevisionsService } from '../../revisions/revisions.service'; @@ -101,4 +103,20 @@ export class RealtimeNoteService implements BeforeApplicationShutdown { }); }); } + + @OnEvent(NoteEvent.PERMISSION_CHANGE) + public handleNotePermissionChanged(noteId: Note['id']): void { + const realtimeNote = this.realtimeNoteStore.find(noteId); + if (realtimeNote) { + realtimeNote.announcePermissionChange(); + } + } + + @OnEvent(NoteEvent.DELETION) + public handleNoteDeleted(noteId: Note['id']): void { + const realtimeNote = this.realtimeNoteStore.find(noteId); + if (realtimeNote) { + realtimeNote.announceNoteDeletion(); + } + } }