summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints/notes/timeline.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-11-16 10:20:57 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-11-16 10:20:57 +0900
commit9d78a1a8b3c17e7f91b85e68d03502c068dd6c97 (patch)
treed8ccfeedc0f964a8636fcb76e5cb903448306ca1 /packages/backend/src/server/api/endpoints/notes/timeline.ts
parentUpdate CHANGELOG.md (diff)
downloadsharkey-9d78a1a8b3c17e7f91b85e68d03502c068dd6c97.tar.gz
sharkey-9d78a1a8b3c17e7f91b85e68d03502c068dd6c97.tar.bz2
sharkey-9d78a1a8b3c17e7f91b85e68d03502c068dd6c97.zip
enhance(backend): make ftt db fallback configurable
Diffstat (limited to 'packages/backend/src/server/api/endpoints/notes/timeline.ts')
-rw-r--r--packages/backend/src/server/api/endpoints/notes/timeline.ts124
1 files changed, 64 insertions, 60 deletions
diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts
index 5016bd3acb..8037d4862f 100644
--- a/packages/backend/src/server/api/endpoints/notes/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts
@@ -76,65 +76,78 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
const serverSettings = await this.metaService.fetch();
- if (serverSettings.enableFanoutTimeline) {
- const [
- followings,
- userIdsWhoMeMuting,
- userIdsWhoMeMutingRenotes,
- userIdsWhoBlockingMe,
- ] = await Promise.all([
- this.cacheService.userFollowingsCache.fetch(me.id),
- this.cacheService.userMutingsCache.fetch(me.id),
- this.cacheService.renoteMutingsCache.fetch(me.id),
- this.cacheService.userBlockedCache.fetch(me.id),
- ]);
+ if (!serverSettings.enableFanoutTimeline) {
+ return await this.getFromDb({
+ untilId,
+ sinceId,
+ limit: ps.limit,
+ includeMyRenotes: ps.includeMyRenotes,
+ includeRenotedMyNotes: ps.includeRenotedMyNotes,
+ includeLocalRenotes: ps.includeLocalRenotes,
+ withFiles: ps.withFiles,
+ withRenotes: ps.withRenotes,
+ }, me);
+ }
- let noteIds = await this.funoutTimelineService.get(ps.withFiles ? `homeTimelineWithFiles:${me.id}` : `homeTimeline:${me.id}`, untilId, sinceId);
- noteIds = noteIds.slice(0, ps.limit);
+ const [
+ followings,
+ userIdsWhoMeMuting,
+ userIdsWhoMeMutingRenotes,
+ userIdsWhoBlockingMe,
+ ] = await Promise.all([
+ this.cacheService.userFollowingsCache.fetch(me.id),
+ this.cacheService.userMutingsCache.fetch(me.id),
+ this.cacheService.renoteMutingsCache.fetch(me.id),
+ this.cacheService.userBlockedCache.fetch(me.id),
+ ]);
- let redisTimeline: MiNote[] = [];
+ let noteIds = await this.funoutTimelineService.get(ps.withFiles ? `homeTimelineWithFiles:${me.id}` : `homeTimeline:${me.id}`, untilId, sinceId);
+ noteIds = noteIds.slice(0, ps.limit);
- if (noteIds.length > 0) {
- 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');
+ let redisTimeline: MiNote[] = [];
- redisTimeline = await query.getMany();
+ if (noteIds.length > 0) {
+ 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');
- redisTimeline = redisTimeline.filter(note => {
- if (note.userId === me.id) {
- return true;
- }
- if (isUserRelated(note, userIdsWhoBlockingMe)) return false;
- if (isUserRelated(note, userIdsWhoMeMuting)) return false;
- if (note.renoteId) {
- if (note.text == null && note.fileIds.length === 0 && !note.hasPoll) {
- if (isUserRelated(note, userIdsWhoMeMutingRenotes)) return false;
- if (ps.withRenotes === false) return false;
- }
- }
- if (note.reply && note.reply.visibility === 'followers') {
- if (!Object.hasOwn(followings, note.reply.userId)) return false;
- }
+ redisTimeline = await query.getMany();
+ redisTimeline = redisTimeline.filter(note => {
+ if (note.userId === me.id) {
return true;
- });
+ }
+ if (isUserRelated(note, userIdsWhoBlockingMe)) return false;
+ if (isUserRelated(note, userIdsWhoMeMuting)) return false;
+ if (note.renoteId) {
+ if (note.text == null && note.fileIds.length === 0 && !note.hasPoll) {
+ if (isUserRelated(note, userIdsWhoMeMutingRenotes)) return false;
+ if (ps.withRenotes === false) return false;
+ }
+ }
+ if (note.reply && note.reply.visibility === 'followers') {
+ if (!Object.hasOwn(followings, note.reply.userId)) return false;
+ }
- redisTimeline.sort((a, b) => a.id > b.id ? -1 : 1);
- }
+ return true;
+ });
+
+ redisTimeline.sort((a, b) => a.id > b.id ? -1 : 1);
+ }
- if (redisTimeline.length > 0) {
- process.nextTick(() => {
- this.activeUsersChart.read(me);
- });
+ if (redisTimeline.length > 0) {
+ process.nextTick(() => {
+ this.activeUsersChart.read(me);
+ });
- return await this.noteEntityService.packMany(redisTimeline, me);
- } else { // fallback to db
+ return await this.noteEntityService.packMany(redisTimeline, me);
+ } else {
+ if (serverSettings.enableFanoutTimelineDbFallback) { // fallback to db
return await this.getFromDb({
untilId,
sinceId,
@@ -145,18 +158,9 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
withFiles: ps.withFiles,
withRenotes: ps.withRenotes,
}, me);
+ } else {
+ return [];
}
- } else {
- return await this.getFromDb({
- untilId,
- sinceId,
- limit: ps.limit,
- includeMyRenotes: ps.includeMyRenotes,
- includeRenotedMyNotes: ps.includeRenotedMyNotes,
- includeLocalRenotes: ps.includeLocalRenotes,
- withFiles: ps.withFiles,
- withRenotes: ps.withRenotes,
- }, me);
}
});
}