@@ -1,7 +1,7 @@
 | 
			
		||||
import { Inject, Injectable } from '@nestjs/common';
 | 
			
		||||
import Redis from 'ioredis';
 | 
			
		||||
import { Endpoint } from '@/server/api/endpoint-base.js';
 | 
			
		||||
import type { ChannelsRepository, NotesRepository } from '@/models/index.js';
 | 
			
		||||
import type { ChannelsRepository, Note, NotesRepository } from '@/models/index.js';
 | 
			
		||||
import { QueryService } from '@/core/QueryService.js';
 | 
			
		||||
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
 | 
			
		||||
import ActiveUsersChart from '@/core/chart/charts/active-users.js';
 | 
			
		||||
@@ -73,6 +73,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
 | 
			
		||||
				throw new ApiError(meta.errors.noSuchChannel);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			let timeline: Note[] = [];
 | 
			
		||||
 | 
			
		||||
			const noteIdsRes = await this.redisClient.xrevrange(
 | 
			
		||||
				`channelTimeline:${channel.id}`,
 | 
			
		||||
				ps.untilId ? this.idService.parse(ps.untilId).date.getTime() : '+',
 | 
			
		||||
@@ -80,35 +82,52 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
 | 
			
		||||
				'COUNT', ps.limit + 1); // untilIdに指定したものも含まれるため+1
 | 
			
		||||
 | 
			
		||||
			if (noteIdsRes.length === 0) {
 | 
			
		||||
				return [];
 | 
			
		||||
				//#region Construct query
 | 
			
		||||
				const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
 | 
			
		||||
					.andWhere('note.channelId = :channelId', { channelId: channel.id })
 | 
			
		||||
					.innerJoinAndSelect('note.user', 'user')
 | 
			
		||||
					.leftJoinAndSelect('note.reply', 'reply')
 | 
			
		||||
					.leftJoinAndSelect('note.renote', 'renote')
 | 
			
		||||
					.leftJoinAndSelect('reply.user', 'replyUser')
 | 
			
		||||
					.leftJoinAndSelect('renote.user', 'renoteUser')
 | 
			
		||||
					.leftJoinAndSelect('note.channel', 'channel');
 | 
			
		||||
 | 
			
		||||
				if (me) {
 | 
			
		||||
					this.queryService.generateMutedUserQuery(query, me);
 | 
			
		||||
					this.queryService.generateMutedNoteQuery(query, me);
 | 
			
		||||
					this.queryService.generateBlockedUserQuery(query, me);
 | 
			
		||||
				}
 | 
			
		||||
				//#endregion
 | 
			
		||||
 | 
			
		||||
				timeline = await query.take(ps.limit).getMany();
 | 
			
		||||
			} else {
 | 
			
		||||
				const noteIds = noteIdsRes.map(x => x[1][1]).filter(x => x !== ps.untilId);
 | 
			
		||||
 | 
			
		||||
				if (noteIds.length === 0) {
 | 
			
		||||
					return [];
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				//#region Construct query
 | 
			
		||||
				const query = this.notesRepository.createQueryBuilder('note')
 | 
			
		||||
					.where('note.id IN (:...noteIds)', { noteIds: noteIds })
 | 
			
		||||
					.innerJoinAndSelect('note.user', 'user')
 | 
			
		||||
					.leftJoinAndSelect('note.reply', 'reply')
 | 
			
		||||
					.leftJoinAndSelect('note.renote', 'renote')
 | 
			
		||||
					.leftJoinAndSelect('reply.user', 'replyUser')
 | 
			
		||||
					.leftJoinAndSelect('renote.user', 'renoteUser')
 | 
			
		||||
					.leftJoinAndSelect('note.channel', 'channel');
 | 
			
		||||
 | 
			
		||||
				if (me) {
 | 
			
		||||
					this.queryService.generateMutedUserQuery(query, me);
 | 
			
		||||
					this.queryService.generateMutedNoteQuery(query, me);
 | 
			
		||||
					this.queryService.generateBlockedUserQuery(query, me);
 | 
			
		||||
				}
 | 
			
		||||
				//#endregion
 | 
			
		||||
 | 
			
		||||
				timeline = await query.getMany();
 | 
			
		||||
				timeline.sort((a, b) => a.id > b.id ? -1 : 1);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			const noteIds = noteIdsRes.map(x => x[1][1]).filter(x => x !== ps.untilId);
 | 
			
		||||
 | 
			
		||||
			if (noteIds.length === 0) {
 | 
			
		||||
				return [];
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			//#region Construct query
 | 
			
		||||
			const query = this.notesRepository.createQueryBuilder('note')
 | 
			
		||||
				.where('note.id IN (:...noteIds)', { noteIds: noteIds })
 | 
			
		||||
				.innerJoinAndSelect('note.user', 'user')
 | 
			
		||||
				.leftJoinAndSelect('note.reply', 'reply')
 | 
			
		||||
				.leftJoinAndSelect('note.renote', 'renote')
 | 
			
		||||
				.leftJoinAndSelect('reply.user', 'replyUser')
 | 
			
		||||
				.leftJoinAndSelect('renote.user', 'renoteUser')
 | 
			
		||||
				.leftJoinAndSelect('note.channel', 'channel');
 | 
			
		||||
 | 
			
		||||
			if (me) {
 | 
			
		||||
				this.queryService.generateMutedUserQuery(query, me);
 | 
			
		||||
				this.queryService.generateMutedNoteQuery(query, me);
 | 
			
		||||
				this.queryService.generateBlockedUserQuery(query, me);
 | 
			
		||||
			}
 | 
			
		||||
			//#endregion
 | 
			
		||||
 | 
			
		||||
			const timeline = await query.getMany();
 | 
			
		||||
			timeline.sort((a, b) => a.id > b.id ? -1 : 1);
 | 
			
		||||
 | 
			
		||||
			if (me) this.activeUsersChart.read(me);
 | 
			
		||||
 | 
			
		||||
			return await this.noteEntityService.packMany(timeline, me);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user