summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorおさむのひと <46447427+samunohito@users.noreply.github.com>2023-10-29 14:16:36 +0900
committerGitHub <noreply@github.com>2023-10-29 14:16:36 +0900
commita161a9c1e701f578aeec017e468cfd87bba65877 (patch)
tree196cad8c33348fb931910e385ef98361ea03d347
parentMkCodeのパースエンジンをShikiに変更 (#12102) (diff)
downloadsharkey-a161a9c1e701f578aeec017e468cfd87bba65877.tar.gz
sharkey-a161a9c1e701f578aeec017e468cfd87bba65877.tar.bz2
sharkey-a161a9c1e701f578aeec017e468cfd87bba65877.zip
Fix: notes/timelineにフォローしているチャンネルのノートを含める (#12179)
* notes/timelineにフォローしているチャンネルのノートを含める * fix CHANGELOG.md --------- Co-authored-by: osamu <46447427+sam-osamu@users.noreply.github.com>
-rw-r--r--CHANGELOG.md1
-rw-r--r--packages/backend/src/server/api/endpoints/notes/timeline.ts41
2 files changed, 36 insertions, 6 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b909b26cae..420bc87cae 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -46,6 +46,7 @@
- Fix: RedisへのTLキャッシュが有効の場合にHTL/LTL/STLが空になることがある問題を修正
- Fix: STLでフォローしていないチャンネルが取得される問題を修正
- Fix: `hashtags/trend`にてRedisからトレンドの情報が取得できない際にInternal Server Errorになる問題を修正
+- Fix: HTLをリロードまたは遡行したとき、フォローしているチャンネルのノートが含まれない問題を修正 #11765
## 2023.10.2
diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts
index ac88c1f82b..e048bc4dd2 100644
--- a/packages/backend/src/server/api/endpoints/notes/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts
@@ -5,7 +5,7 @@
import { Brackets } from 'typeorm';
import { Inject, Injectable } from '@nestjs/common';
-import type { MiNote, NotesRepository } from '@/models/_.js';
+import type { MiNote, NotesRepository, ChannelFollowingsRepository } from '@/models/_.js';
import { Endpoint } from '@/server/api/endpoint-base.js';
import { QueryService } from '@/core/QueryService.js';
import ActiveUsersChart from '@/core/chart/charts/active-users.js';
@@ -58,6 +58,9 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
@Inject(DI.notesRepository)
private notesRepository: NotesRepository,
+ @Inject(DI.channelFollowingsRepository)
+ private channelFollowingsRepository: ChannelFollowingsRepository,
+
private noteEntityService: NoteEntityService,
private activeUsersChart: ActiveUsersChart,
private idService: IdService,
@@ -160,22 +163,48 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
private async getFromDb(ps: { untilId: string | null; sinceId: string | null; limit: number; includeMyRenotes: boolean; includeRenotedMyNotes: boolean; includeLocalRenotes: boolean; withFiles: boolean; withRenotes: boolean; }, me: MiLocalUser) {
const followees = await this.userFollowingService.getFollowees(me.id);
+ const followingChannels = await this.channelFollowingsRepository.find({
+ where: {
+ followerId: me.id,
+ },
+ });
//#region Construct query
const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId)
- .andWhere('note.channelId IS NULL')
.innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('note.reply', 'reply')
.leftJoinAndSelect('note.renote', 'renote')
.leftJoinAndSelect('reply.user', 'replyUser')
.leftJoinAndSelect('renote.user', 'renoteUser');
- if (followees.length > 0) {
+ if (followees.length > 0 && followingChannels.length > 0) {
+ // ユーザー・チャンネルともにフォローあり
const meOrFolloweeIds = [me.id, ...followees.map(f => f.followeeId)];
-
- query.andWhere('note.userId IN (:...meOrFolloweeIds)', { meOrFolloweeIds: meOrFolloweeIds });
+ const followingChannelIds = followingChannels.map(x => x.followeeId);
+ query.andWhere(new Brackets(qb => {
+ qb
+ .where('note.userId IN (:...meOrFolloweeIds)', { meOrFolloweeIds: meOrFolloweeIds })
+ .orWhere('note.channelId IN (:...followingChannelIds)', { followingChannelIds });
+ }));
+ } else if (followees.length > 0) {
+ // ユーザーフォローのみ(チャンネルフォローなし)
+ const meOrFolloweeIds = [me.id, ...followees.map(f => f.followeeId)];
+ query
+ .andWhere('note.channelId IS NULL')
+ .andWhere('note.userId IN (:...meOrFolloweeIds)', { meOrFolloweeIds: meOrFolloweeIds });
+ } else if (followingChannels.length > 0) {
+ // チャンネルフォローのみ(ユーザーフォローなし)
+ const followingChannelIds = followingChannels.map(x => x.followeeId);
+ query.andWhere(new Brackets(qb => {
+ qb
+ .where('note.channelId IN (:...followingChannelIds)', { followingChannelIds })
+ .orWhere('note.userId = :meId', { meId: me.id });
+ }));
} else {
- query.andWhere('note.userId = :meId', { meId: me.id });
+ // フォローなし
+ query
+ .andWhere('note.channelId IS NULL')
+ .andWhere('note.userId = :meId', { meId: me.id });
}
query.andWhere(new Brackets(qb => {