74 lines
2.4 KiB
TypeScript
74 lines
2.4 KiB
TypeScript
/*
|
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
import { Inject, Injectable } from '@nestjs/common';
|
|
import { In } from 'typeorm';
|
|
import { DI } from '@/di-symbols.js';
|
|
import type { UserProfilesRepository, NotesRepository } from '@/models/_.js';
|
|
import type Logger from '@/logger.js';
|
|
import { bindThis } from '@/decorators.js';
|
|
import { NoteDeleteService } from '@/core/NoteDeleteService.js';
|
|
import { IdService } from '@/core/IdService.js';
|
|
import { QueueLoggerService } from '../QueueLoggerService.js';
|
|
import type * as Bull from 'bullmq';
|
|
|
|
@Injectable()
|
|
export class AutoDeleteNotesProcessorService {
|
|
private logger: Logger;
|
|
|
|
constructor(
|
|
@Inject(DI.userProfilesRepository)
|
|
private userProfilesRepository: UserProfilesRepository,
|
|
@Inject(DI.notesRepository)
|
|
private notesRepository: NotesRepository,
|
|
@Inject(DI.userNotePiningsRepository)
|
|
private userNotePiningsRepository: UserNotePiningsRepository,
|
|
|
|
private idService: IdService,
|
|
private noteDeleteService: NoteDeleteService,
|
|
private queueLoggerService: QueueLoggerService,
|
|
) {
|
|
this.logger = this.queueLoggerService.logger.createSubLogger('auto-delete-notes');
|
|
}
|
|
|
|
@bindThis
|
|
public async process(): Promise<void> {
|
|
this.logger.info('Auto deleting old notes...');
|
|
|
|
const users = await this.userProfilesRepository.createQueryBuilder('user_profile')
|
|
.innerJoinAndSelect('user_profile.user', 'user')
|
|
.where('user.host IS NULL')
|
|
.andWhere('user_profile.autoDeleteNotes')
|
|
.getMany();
|
|
|
|
for (const user of users) {
|
|
this.logger.info(`Deleting old notes of user @${user.user.username} (id ${user.user.id})`);
|
|
const untilTime = Date.now() - (user.autoDeleteNotesMinutes * 1000 * 60);
|
|
const untilId = this.idService.gen(untilTime);
|
|
|
|
const pins = await this.userNotePiningsRepository.createQueryBuilder('user_note_pining')
|
|
.where('"userId" = :userId', { userId: user.user.id })
|
|
.getMany();
|
|
|
|
const pinnedNoteIds = pins.map((p) => p.noteId);
|
|
|
|
const notes = await this.notesRepository.createQueryBuilder('note')
|
|
.where('note."userId" = :userId', { userId: user.user.id })
|
|
.andWhere('note.id < :untilId', { untilId })
|
|
.getMany();
|
|
|
|
for (const note of notes) {
|
|
if (pinnedNoteIds.includes(note.id)) {
|
|
continue;
|
|
}
|
|
|
|
await this.noteDeleteService.delete(user, note);
|
|
}
|
|
}
|
|
|
|
this.logger.succ('Done with note auto-delete');
|
|
}
|
|
}
|