summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints
diff options
context:
space:
mode:
authorxianon <xianon@hotmail.co.jp>2023-02-26 18:54:52 +0900
committerGitHub <noreply@github.com>2023-02-26 18:54:52 +0900
commit67ca7ee4ec8121ec84fa652104749e394896d35e (patch)
tree9b833535984a0d323b8519bbbe6efdc5e51bee15 /packages/backend/src/server/api/endpoints
parentupdate deps (diff)
downloadsharkey-67ca7ee4ec8121ec84fa652104749e394896d35e.tar.gz
sharkey-67ca7ee4ec8121ec84fa652104749e394896d35e.tar.bz2
sharkey-67ca7ee4ec8121ec84fa652104749e394896d35e.zip
ホームタイムラインの読み込みでクエリタイムアウトになるのを修正する (#10106)
Diffstat (limited to 'packages/backend/src/server/api/endpoints')
-rw-r--r--packages/backend/src/server/api/endpoints/notes/timeline.ts23
1 files changed, 13 insertions, 10 deletions
diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts
index d1c35e36e2..942c4cf51e 100644
--- a/packages/backend/src/server/api/endpoints/notes/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts
@@ -66,17 +66,9 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
})) !== 0;
//#region Construct query
- const followingQuery = this.followingsRepository.createQueryBuilder('following')
- .select('following.followeeId')
- .where('following.followerId = :followerId', { followerId: me.id });
-
const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'),
ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere('note.createdAt > :minDate', { minDate: new Date(Date.now() - (1000 * 60 * 60 * 24 * 30)) }) // 30日前まで
- .andWhere(new Brackets(qb => { qb
- .where('note.userId = :meId', { meId: me.id });
- if (hasFollowing) qb.orWhere(`note.userId IN (${ followingQuery.getQuery() })`);
- }))
.innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('user.avatar', 'avatar')
.leftJoinAndSelect('user.banner', 'banner')
@@ -87,8 +79,19 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
.leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
.leftJoinAndSelect('renote.user', 'renoteUser')
.leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
- .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
- .setParameters(followingQuery.getParameters());
+ .leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
+
+ if (hasFollowing) {
+ const followees = await this.followingsRepository.createQueryBuilder('following')
+ .select('following.followeeId')
+ .where('following.followerId = :followerId', { followerId: me.id })
+ .getMany();
+ const meOrFolloweeIds = [me.id, ...followees.map(f => f.followeeId)];
+
+ query.andWhere('note.userId IN (:...meOrFolloweeIds)', { meOrFolloweeIds: meOrFolloweeIds });
+ } else {
+ query.andWhere('note.userId = :meId', { meId: me.id });
+ }
this.queryService.generateChannelQuery(query, me);
this.queryService.generateRepliesQuery(query, me);