Skip to content

Commit

Permalink
fix(backend): Remove Meilisearch index when notes are deleted (#10988)
Browse files Browse the repository at this point in the history
* fix(backend): Include feature to delete Meilisearch index notes

* Update variable name
`cascadingNotesFilter` -> `federatedLocalCascadingNotes`

* tweak

---------

Co-authored-by: syuilo <[email protected]>
  • Loading branch information
caipira113 and syuilo authored Jul 8, 2023
1 parent 7ec07d5 commit 60366a4
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 3 deletions.
14 changes: 11 additions & 3 deletions packages/backend/src/core/NoteDeleteService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
import { MetaService } from '@/core/MetaService.js';
import { SearchService } from '@/core/SearchService.js';

@Injectable()
export class NoteDeleteService {
Expand All @@ -41,6 +42,7 @@ export class NoteDeleteService {
private apRendererService: ApRendererService,
private apDeliverManagerService: ApDeliverManagerService,
private metaService: MetaService,
private searchService: SearchService,
private notesChart: NotesChart,
private perUserNotesChart: PerUserNotesChart,
private instanceChart: InstanceChart,
Expand All @@ -53,6 +55,7 @@ export class NoteDeleteService {
*/
async delete(user: { id: User['id']; uri: User['uri']; host: User['host']; isBot: User['isBot']; }, note: Note, quiet = false) {
const deletedAt = new Date();
const cascadingNotes = await this.findCascadingNotes(note);

// この投稿を除く指定したユーザーによる指定したノートのリノートが存在しないとき
if (note.renoteId && (await this.noteEntityService.countSameRenotes(user.id, note.renoteId, note.id)) === 0) {
Expand Down Expand Up @@ -88,8 +91,8 @@ export class NoteDeleteService {
}

// also deliever delete activity to cascaded notes
const cascadingNotes = (await this.findCascadingNotes(note)).filter(note => !note.localOnly); // filter out local-only notes
for (const cascadingNote of cascadingNotes) {
const federatedLocalCascadingNotes = (cascadingNotes).filter(note => !note.localOnly && note.userHost == null); // filter out local-only notes
for (const cascadingNote of federatedLocalCascadingNotes) {
if (!cascadingNote.user) continue;
if (!this.userEntityService.isLocalUser(cascadingNote.user)) continue;
const content = this.apRendererService.addContext(this.apRendererService.renderDelete(this.apRendererService.renderTombstone(`${this.config.url}/notes/${cascadingNote.id}`), cascadingNote.user));
Expand All @@ -114,6 +117,11 @@ export class NoteDeleteService {
}
}

for (const cascadingNote of cascadingNotes) {
this.searchService.unindexNote(cascadingNote);
}
this.searchService.unindexNote(note);

await this.notesRepository.delete({
id: note.id,
userId: user.id,
Expand All @@ -140,7 +148,7 @@ export class NoteDeleteService {

const cascadingNotes: Note[] = await recursive(note.id);

return cascadingNotes.filter(note => note.userHost === null); // filter out non-local users
return cascadingNotes;
}

@bindThis
Expand Down
9 changes: 9 additions & 0 deletions packages/backend/src/core/SearchService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,15 @@ export class SearchService {
}
}

@bindThis
public async unindexNote(note: Note): Promise<void> {
if (!['home', 'public'].includes(note.visibility)) return;

if (this.meilisearch) {
this.meilisearchNoteIndex!.deleteDocument(note.id);
}
}

@bindThis
public async searchNote(q: string, me: User | null, opts: {
userId?: Note['userId'] | null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { bindThis } from '@/decorators.js';
import { QueueLoggerService } from '../QueueLoggerService.js';
import type * as Bull from 'bullmq';
import type { DbUserDeleteJobData } from '../types.js';
import { SearchService } from "@/core/SearchService.js";

@Injectable()
export class DeleteAccountProcessorService {
Expand All @@ -36,6 +37,7 @@ export class DeleteAccountProcessorService {
private driveService: DriveService,
private emailService: EmailService,
private queueLoggerService: QueueLoggerService,
private searchService: SearchService,
) {
this.logger = this.queueLoggerService.logger.createSubLogger('delete-account');
}
Expand Down Expand Up @@ -71,6 +73,10 @@ export class DeleteAccountProcessorService {
cursor = notes[notes.length - 1].id;

await this.notesRepository.delete(notes.map(note => note.id));

for (const note of notes) {
await this.searchService.unindexNote(note);
}
}

this.logger.succ('All of notes deleted');
Expand Down

0 comments on commit 60366a4

Please sign in to comment.