diff --git a/packages/backend/src/server/api/endpoints/clips/notes.ts b/packages/backend/src/server/api/endpoints/clips/notes.ts index a238d7d002..fbdd8b45b8 100644 --- a/packages/backend/src/server/api/endpoints/clips/notes.ts +++ b/packages/backend/src/server/api/endpoints/clips/notes.ts @@ -93,6 +93,7 @@ export default class extends Endpoint { // eslint- this.queryService.generateVisibilityQuery(query, me); this.queryService.generateBlockedHostQueryForNote(query); + this.queryService.generateExcludedRepliesQueryForNotes(query, me); // this.queryService.generateSuspendedUserQueryForNote(query); // To avoid problems with removing notes, ignoring suspended user for now if (me) { this.queryService.generateMutedUserQueryForNotes(query, me); diff --git a/packages/backend/src/server/api/endpoints/notes.ts b/packages/backend/src/server/api/endpoints/notes.ts index 38ec1427db..53e666e1d1 100644 --- a/packages/backend/src/server/api/endpoints/notes.ts +++ b/packages/backend/src/server/api/endpoints/notes.ts @@ -92,7 +92,6 @@ export default class extends Endpoint { // eslint- .limit(ps.limit); this.queryService.generateVisibilityQuery(query, me); - this.queryService.generateBlockedHostQueryForNote(query); if (me) { this.queryService.generateSilencedUserQueryForNotes(query, me); this.queryService.generateMutedUserQueryForNotes(query, me); @@ -101,10 +100,14 @@ export default class extends Endpoint { // eslint- if (ps.local) { query.andWhere('note.userHost IS NULL'); + } else { + this.queryService.generateBlockedHostQueryForNote(query); } - if (ps.reply !== undefined) { - query.andWhere(ps.reply ? 'note.replyId IS NOT NULL' : 'note.replyId IS NULL'); + if (ps.reply) { + this.queryService.generateExcludedRepliesQueryForNotes(query, me); + } else if (ps.reply === false) { + query.andWhere('note.replyId IS NULL'); } if (ps.renote !== undefined) { diff --git a/packages/backend/src/server/api/endpoints/notes/featured.ts b/packages/backend/src/server/api/endpoints/notes/featured.ts index abb7941d47..ac6dfe8da6 100644 --- a/packages/backend/src/server/api/endpoints/notes/featured.ts +++ b/packages/backend/src/server/api/endpoints/notes/featured.ts @@ -102,14 +102,6 @@ export default class extends Endpoint { // eslint- return []; } - const [ - userIdsWhoMeMuting, - userIdsWhoBlockingMe, - ] = me ? await Promise.all([ - this.cacheService.userMutingsCache.fetch(me.id), - this.cacheService.userBlockedCache.fetch(me.id), - ]) : [new Set(), new Set()]; - const query = this.notesRepository.createQueryBuilder('note') .where('note.id IN (:...noteIds)', { noteIds: noteIds }) .innerJoinAndSelect('note.user', 'user') @@ -120,16 +112,17 @@ export default class extends Endpoint { // eslint- .leftJoinAndSelect('note.channel', 'channel') .andWhere('user.isExplorable = TRUE'); + this.queryService.generateVisibilityQuery(query, me); this.queryService.generateBlockedHostQueryForNote(query); this.queryService.generateSuspendedUserQueryForNote(query); this.queryService.generateSilencedUserQueryForNotes(query, me); + if (me) { + this.queryService.generateMutedUserQueryForNotes(query, me); + this.queryService.generateBlockedUserQueryForNotes(query, me); + this.queryService.generateMutedNoteThreadQuery(query, me); + } - const notes = (await query.getMany()).filter(note => { - if (me && isUserRelated(note, userIdsWhoBlockingMe)) return false; - if (me && isUserRelated(note, userIdsWhoMeMuting)) return false; - - return true; - }); + const notes = await query.getMany(); notes.sort((a, b) => a.id > b.id ? -1 : 1); diff --git a/packages/backend/src/server/api/endpoints/notes/following.ts b/packages/backend/src/server/api/endpoints/notes/following.ts index 6a1a99f73f..8c2938b3bd 100644 --- a/packages/backend/src/server/api/endpoints/notes/following.ts +++ b/packages/backend/src/server/api/endpoints/notes/following.ts @@ -151,11 +151,12 @@ export default class extends Endpoint { // eslint- query.andWhere('"user"."isSuspended" = false'); this.queryService.generateBlockedHostQueryForNote(query); this.queryService.generateSilencedUserQueryForNotes(query, me, ps.list !== 'followers'); + this.queryService.generateSuspendedUserQueryForNote(query); // Respect blocks, mutes, and privacy this.queryService.generateVisibilityQuery(query, me); this.queryService.generateBlockedUserQueryForNotes(query, me); - this.queryService.generateMutedUserQueryForNotes(query, me); + this.queryService.generateMutedUserQueryForNotes(query, me, ps.list !== 'followers'); // Support pagination this.queryService diff --git a/packages/backend/src/server/api/endpoints/notes/mentions.ts b/packages/backend/src/server/api/endpoints/notes/mentions.ts index 9e19d1676c..05d0a5aebd 100644 --- a/packages/backend/src/server/api/endpoints/notes/mentions.ts +++ b/packages/backend/src/server/api/endpoints/notes/mentions.ts @@ -87,6 +87,7 @@ export default class extends Endpoint { // eslint- this.queryService.generateVisibilityQuery(qb, me); this.queryService.generateBlockedHostQueryForNote(qb); this.queryService.generateSuspendedUserQueryForNote(qb); + this.queryService.generateSilencedUserQueryForNotes(qb, me); this.queryService.generateMutedUserQueryForNotes(qb, me); this.queryService.generateMutedNoteThreadQuery(qb, me); this.queryService.generateBlockedUserQueryForNotes(qb, me); diff --git a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts index 6f96821a63..6e5fdaa281 100644 --- a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts +++ b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts @@ -137,10 +137,13 @@ export default class extends Endpoint { // eslint- //#region block/mute/vis this.queryService.generateVisibilityQuery(query, me); + this.queryService.generateSilencedUserQueryForNotes(query, me); + this.queryService.generateSuspendedUserQueryForNote(query); this.queryService.generateBlockedHostQueryForNote(query); if (me) { this.queryService.generateBlockedUserQueryForNotes(query, me); this.queryService.generateMutedUserQueryForNotes(query, me); + this.queryService.generateMutedNoteThreadQuery(query, me); } //#endregion diff --git a/packages/backend/src/server/api/endpoints/notes/renotes.ts b/packages/backend/src/server/api/endpoints/notes/renotes.ts index 71c40421b9..cc38e9a405 100644 --- a/packages/backend/src/server/api/endpoints/notes/renotes.ts +++ b/packages/backend/src/server/api/endpoints/notes/renotes.ts @@ -97,6 +97,7 @@ export default class extends Endpoint { // eslint- if (me) { this.queryService.generateMutedUserQueryForNotes(query, me); this.queryService.generateBlockedUserQueryForNotes(query, me); + this.queryService.generateMutedNoteThreadQuery(query, me); } const renotes = await query.limit(ps.limit).getMany(); diff --git a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts index 5ef54856da..fa962feca7 100644 --- a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts +++ b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts @@ -98,7 +98,7 @@ export default class extends Endpoint { // eslint- this.queryService.generateSilencedUserQueryForNotes(query, me); if (me) this.queryService.generateMutedUserQueryForNotes(query, me); if (me) this.queryService.generateBlockedUserQueryForNotes(query, me); - if (me) this.queryService.generateMutedUserRenotesQueryForNotes(query, me); + if (me) this.queryService.generateMutedNoteThreadQuery(query, me); if (!this.serverSettings.enableBotTrending) query.andWhere('user.isBot = FALSE'); @@ -123,19 +123,24 @@ export default class extends Endpoint { // eslint- throw e; } - if (ps.reply != null) { + if (ps.reply === false) { + query.andWhere('note.replyId IS NULL'); + } else { if (ps.reply) { query.andWhere('note.replyId IS NOT NULL'); - } else { - query.andWhere('note.replyId IS NULL'); } + this.queryService.generateExcludedRepliesQueryForNotes(query, me); } - if (ps.renote != null) { + if (ps.renote === false) { + this.queryService.andIsNotRenote(query, 'note'); + } else { if (ps.renote) { this.queryService.andIsRenote(query, 'note'); - } else { - this.queryService.andIsNotRenote(query, 'note'); + } + + if (me) { + this.queryService.generateMutedUserRenotesQueryForNotes(query, me); } } diff --git a/packages/backend/src/server/api/endpoints/users/featured-notes.ts b/packages/backend/src/server/api/endpoints/users/featured-notes.ts index f77e81708a..cf328ad71c 100644 --- a/packages/backend/src/server/api/endpoints/users/featured-notes.ts +++ b/packages/backend/src/server/api/endpoints/users/featured-notes.ts @@ -78,12 +78,6 @@ export default class extends Endpoint { // eslint- return []; } - const [ - userIdsWhoMeMuting, - ] = me ? await Promise.all([ - this.cacheService.userMutingsCache.fetch(me.id), - ]) : [new Set()]; - const query = this.notesRepository.createQueryBuilder('note') .where('note.id IN (:...noteIds)', { noteIds: noteIds }) .innerJoinAndSelect('note.user', 'user') @@ -96,13 +90,14 @@ export default class extends Endpoint { // eslint- this.queryService.generateBlockedHostQueryForNote(query); this.queryService.generateSuspendedUserQueryForNote(query); this.queryService.generateSilencedUserQueryForNotes(query, me, true); + this.queryService.generateExcludedRepliesQueryForNotes(query, me); + if (me) { + this.queryService.generateBlockedUserQueryForNotes(query, me); + this.queryService.generateMutedNoteThreadQuery(query, me); + this.queryService.generateMutedUserQueryForNotes(query, me, true); + } - const notes = (await query.getMany()).filter(note => { - if (me && isUserRelated(note, userIdsWhoBlockingMe, false)) return false; - if (me && isUserRelated(note, userIdsWhoMeMuting, true)) return false; - - return true; - }); + const notes = await query.getMany(); notes.sort((a, b) => a.id > b.id ? -1 : 1); diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts index d0363c83f8..2822b52ec8 100644 --- a/packages/backend/src/server/api/endpoints/users/notes.ts +++ b/packages/backend/src/server/api/endpoints/users/notes.ts @@ -215,13 +215,13 @@ export default class extends Endpoint { // eslint- query.andWhere('note.channelId IS NULL'); } - this.queryService.generateVisibilityQuery(query, me); this.queryService.generateBlockedHostQueryForNote(query, true); this.queryService.generateSuspendedUserQueryForNote(query, true); this.queryService.generateSilencedUserQueryForNotes(query, me, true); if (me) { this.queryService.generateMutedUserQueryForNotes(query, me, true); this.queryService.generateBlockedUserQueryForNotes(query, me); + this.queryService.generateMutedNoteThreadQuery(query, me); } if (ps.withFiles) { @@ -239,13 +239,15 @@ export default class extends Endpoint { // eslint- if (!ps.withRepliesToOthers && !ps.withRepliesToSelf) { query.andWhere('reply.id IS NULL'); } else if (!ps.withRepliesToOthers) { - query.andWhere('(reply.id IS NULL OR reply."userId" = note."userId")'); + this.queryService.generateExcludedRepliesQueryForNotes(query, me); } else if (!ps.withRepliesToSelf) { query.andWhere('(reply.id IS NULL OR reply."userId" != note."userId")'); } if (!ps.withNonPublic) { query.andWhere('note.visibility = \'public\''); + } else { + this.queryService.generateVisibilityQuery(query, me); } if (!ps.withBots) { diff --git a/packages/backend/src/server/api/endpoints/users/reactions.ts b/packages/backend/src/server/api/endpoints/users/reactions.ts index 16e19fc1b5..8409631c8e 100644 --- a/packages/backend/src/server/api/endpoints/users/reactions.ts +++ b/packages/backend/src/server/api/endpoints/users/reactions.ts @@ -100,8 +100,6 @@ export default class extends Endpoint { // eslint- } } - const userIdsWhoMeMuting = me ? await this.cacheService.userMutingsCache.fetch(me.id) : new Set(); - const query = this.queryService.makePaginationQuery(this.noteReactionsRepository.createQueryBuilder('reaction'), ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate) .andWhere('reaction.userId = :userId', { userId: ps.userId }) @@ -117,20 +115,12 @@ export default class extends Endpoint { // eslint- this.queryService.generateSuspendedUserQueryForNote(query); this.queryService.generateSilencedUserQueryForNotes(query, me, true); if (me) { - this.queryService.generateMutedUserQueryForNotes(query, me); + this.queryService.generateMutedUserQueryForNotes(query, me, true); this.queryService.generateBlockedUserQueryForNotes(query, me); this.queryService.generateMutedUserRenotesQueryForNotes(query, me); } - const reactions = (await query - .limit(ps.limit) - .getMany()).filter(reaction => { - if (reaction.note?.userId === ps.userId) return true; // we can see reactions to note of requesting user - if (me && isUserRelated(reaction.note, userIdsWhoBlockingMe)) return false; - if (me && isUserRelated(reaction.note, userIdsWhoMeMuting)) return false; - - return true; - }); + const reactions = await query.limit(ps.limit).getMany(); return await this.noteReactionEntityService.packMany(reactions, me, { withNote: true }); });