Filter hidden replies / mentions (#3981)

* Fix: 非公開投稿が返信一覧に出てくる

* Fix: 非公開投稿がメンション一覧に出てくる

* 非公開投稿は通知/メンション通知しない

* repliesにフォロワー限定がかからなかったのを修正

* Fix: ホームにフォロワー限定投稿が表示されない

* 認証必須エンドポイントで user == null にはならない

* mentionsにフォロワー限定がかからなかったのを修正
This commit is contained in:
MeiMei 2019-01-25 00:06:20 +09:00 committed by syuilo
parent d731c7da13
commit 5eca0a31f7
4 changed files with 56 additions and 8 deletions

View file

@ -1,6 +1,6 @@
import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id'; import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
import Note from '../../../../models/note'; import Note from '../../../../models/note';
import { getFriendIds } from '../../common/get-friends'; import { getFriendIds, getFriends } from '../../common/get-friends';
import { packMany } from '../../../../models/note'; import { packMany } from '../../../../models/note';
import define from '../../define'; import define from '../../define';
import read from '../../../../services/note/read'; import read from '../../../../services/note/read';
@ -47,8 +47,28 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
return rej('cannot set sinceId and untilId'); return rej('cannot set sinceId and untilId');
} }
// フォローを取得
const followings = await getFriends(user._id);
const visibleQuery = [{
visibility: { $in: [ 'public', 'home' ] }
}, {
// myself (for specified/private)
userId: user._id
}, {
// to me (for specified)
visibleUserIds: { $in: [ user._id ] }
}, {
visibility: 'followers',
userId: { $in: followings.map(f => f.id) }
}];
const query = { const query = {
deletedAt: null, $and: [{
deletedAt: null,
}, {
$or: visibleQuery,
}],
$or: [{ $or: [{
mentions: user._id mentions: user._id

View file

@ -2,6 +2,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id';
import Note, { packMany } from '../../../../models/note'; import Note, { packMany } from '../../../../models/note';
import define from '../../define'; import define from '../../define';
import Mute from '../../../../models/mute'; import Mute from '../../../../models/mute';
import { getFriends } from '../../common/get-friends';
export const meta = { export const meta = {
desc: { desc: {
@ -34,13 +35,35 @@ export const meta = {
}; };
export default define(meta, (ps, user) => new Promise(async (res, rej) => { export default define(meta, (ps, user) => new Promise(async (res, rej) => {
// ミュートしているユーザーを取得 const [followings, mutedUserIds] = await Promise.all([
const mutedUserIds = user ? (await Mute.find({ // フォローを取得
muterId: user._id // Fetch following
})).map(m => m.muteeId) : null; user ? getFriends(user._id) : [],
// ミュートしているユーザーを取得
user ? (await Mute.find({
muterId: user._id
})).map(m => m.muteeId) : null
]);
const visibleQuery = user == null ? [{
visibility: { $in: [ 'public', 'home' ] }
}] : [{
visibility: { $in: [ 'public', 'home' ] }
}, {
// myself (for specified/private)
userId: user._id
}, {
// to me (for specified)
visibleUserIds: { $in: [ user._id ] }
}, {
visibility: 'followers',
userId: { $in: followings.map(f => f.id) }
}];
const q = { const q = {
replyId: ps.noteId replyId: ps.noteId,
$or: visibleQuery
} as any; } as any;
if (mutedUserIds && mutedUserIds.length > 0) { if (mutedUserIds && mutedUserIds.length > 0) {

View file

@ -141,7 +141,7 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => {
const visibleQuery = user == null ? [{ const visibleQuery = user == null ? [{
visibility: { $in: [ 'public', 'home' ] } visibility: { $in: [ 'public', 'home' ] }
}] : [{ }] : [{
visibility: { $in: [ 'public', 'home' ] } visibility: { $in: [ 'public', 'home', 'followers' ] }
}, { }, {
// myself (for specified/private) // myself (for specified/private)
userId: user._id userId: user._id

View file

@ -19,6 +19,11 @@ export default class extends Channel {
switch (type) { switch (type) {
case 'notification': { case 'notification': {
if (mutedUserIds.includes(body.userId)) return; if (mutedUserIds.includes(body.userId)) return;
if (body.note && body.note.isHidden) return;
break;
}
case 'mention': {
if (body.isHidden) return;
break; break;
} }
} }