期限切れミュートを掃除する機能を実装

This commit is contained in:
samunohito 2024-06-12 06:53:26 +09:00
parent fa8d905484
commit ae485ed568
2 changed files with 47 additions and 4 deletions

View file

@ -5,8 +5,9 @@
import { Inject, Injectable } from '@nestjs/common';
import Redis from 'ioredis';
import { In } from 'typeorm';
import { DI } from '@/di-symbols.js';
import type { ChannelMutingRepository, ChannelsRepository, MiChannel, MiUser } from '@/models/_.js';
import type { ChannelMutingRepository, ChannelsRepository, MiChannel, MiChannelMuting, MiUser } from '@/models/_.js';
import { IdService } from '@/core/IdService.js';
import { GlobalEvents, GlobalEventService } from '@/core/GlobalEventService.js';
import { bindThis } from '@/decorators.js';
@ -64,7 +65,7 @@ export class ChannelMutingService {
.where('channel_muting.userId = :userId', { userId: params.requestUserId })
.andWhere(qb => {
qb.where('channel_muting.expiresAt IS NULL')
.orWhere('channel_muting.expiresAt > :now:', { now: new Date() });
.orWhere('channel_muting.expiresAt > :now', { now: new Date() });
});
if (opts?.joinUser) {
@ -78,6 +79,32 @@ export class ChannelMutingService {
return q.getMany();
}
/**
* .
*
* @param [opts]
* @param {(boolean|undefined)} [opts.joinUser=undefined] JOINするかどうか(falseまたは省略時はJOINしない).
* @param {(boolean|undefined)} [opts.joinChannel=undefined] JOINするかどうか(falseまたは省略時はJOINしない).
*/
public async findExpiredMutings(opts?: {
joinUser?: boolean;
joinChannel?: boolean;
}): Promise<MiChannelMuting[]> {
const now = new Date();
const q = this.channelMutingRepository.createQueryBuilder('channel_muting')
.where('channel_muting.expiresAt < :now', { now });
if (opts?.joinUser) {
q.innerJoinAndSelect('channel_muting.user', 'user');
}
if (opts?.joinChannel) {
q.leftJoinAndSelect('channel_muting.channel', 'channel');
}
return q.getMany();
}
/**
* .
* @param params
@ -136,6 +163,20 @@ export class ChannelMutingService {
});
}
/**
* .
*/
@bindThis
public async eraseExpiredMutings(): Promise<void> {
const expiredMutings = await this.findExpiredMutings();
await this.channelMutingRepository.delete({ id: In(expiredMutings.map(x => x.id)) });
const userIds = [...new Set(expiredMutings.map(x => x.userId))];
for (const userId of userIds) {
this.userMutingChannelsCache.refresh(userId).then();
}
}
@bindThis
private async onMessage(_: string, data: string): Promise<void> {
const obj = JSON.parse(data);