From 2ed9e26a4fc6ece9b510538ac6c48a62eb8536d1 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Tue, 29 Jan 2019 17:34:43 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=AA=E3=83=97=E3=83=A9=E3=82=A4/=E3=83=A1?= =?UTF-8?q?=E3=83=B3=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=95=E3=82=8C=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=82=8C=E3=81=B0=E9=9D=9E=E3=83=95=E3=82=A9=E3=83=AD?= =?UTF-8?q?=E3=83=AF=E3=83=BC=E3=81=B8=E3=81=AE=E3=83=95=E3=82=A9=E3=83=AD?= =?UTF-8?q?=E3=83=AF=E3=83=BC=E9=99=90=E5=AE=9A=E3=81=A7=E3=82=82=E5=8F=82?= =?UTF-8?q?=E7=85=A7=E5=8F=AF=E8=83=BD=E3=81=AB=20(#4033)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 非メンション/リプライ投稿がmentionsにあるかどうかはvisibilityと関係ないので削除 * リプライ/メンションされていれば非フォロワーでも参照可能に --- src/models/note.ts | 6 +++ src/server/api/endpoints/notes/mentions.ts | 13 ++++- src/server/api/endpoints/notes/replies.ts | 13 ++++- test/api-visibility.ts | 61 +++++++--------------- 4 files changed, 48 insertions(+), 45 deletions(-) diff --git a/src/models/note.ts b/src/models/note.ts index 8ca65bb42..a872eb769 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -140,6 +140,12 @@ export const hideNote = async (packedNote: any, meId: mongo.ObjectID) => { hide = true; } else if (meId.equals(packedNote.userId)) { hide = false; + } else if (packedNote.reply && meId.equals(packedNote.reply.userId)) { + // 自分の投稿に対するリプライ + hide = false; + } else if (packedNote.mentions && packedNote.mentions.some((id: any) => meId.equals(id))) { + // 自分へのメンション + hide = false; } else { // フォロワーかどうか const following = await Following.findOne({ diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts index 874759060..e37d475df 100644 --- a/src/server/api/endpoints/notes/mentions.ts +++ b/src/server/api/endpoints/notes/mentions.ts @@ -53,14 +53,23 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => { const visibleQuery = [{ visibility: { $in: [ 'public', 'home' ] } }, { - // myself (for specified/private) + // myself (for followers/specified/private) userId: user._id }, { // to me (for specified) visibleUserIds: { $in: [ user._id ] } }, { visibility: 'followers', - userId: { $in: followings.map(f => f.id) } + $or: [{ + // フォロワーの投稿 + userId: { $in: followings.map(f => f.id) }, + }, { + // 自分の投稿へのリプライ + '_reply.userId': user._id, + }, { + // 自分へのメンションが含まれている + mentions: { $in: [ user._id ] } + }] }]; const query = { diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts index 112156403..199139c8e 100644 --- a/src/server/api/endpoints/notes/replies.ts +++ b/src/server/api/endpoints/notes/replies.ts @@ -51,14 +51,23 @@ export default define(meta, (ps, user) => new Promise(async (res, rej) => { }] : [{ visibility: { $in: [ 'public', 'home' ] } }, { - // myself (for specified/private) + // myself (for followers/specified/private) userId: user._id }, { // to me (for specified) visibleUserIds: { $in: [ user._id ] } }, { visibility: 'followers', - userId: { $in: followings.map(f => f.id) } + $or: [{ + // フォロワーの投稿 + userId: { $in: followings.map(f => f.id) }, + }, { + // 自分の投稿へのリプライ + '_reply.userId': user._id, + }, { + // 自分へのメンションが含まれている + mentions: { $in: [ user._id ] } + }] }]; const q = { diff --git a/test/api-visibility.ts b/test/api-visibility.ts index 56e72f7ca..8380d54f1 100644 --- a/test/api-visibility.ts +++ b/test/api-visibility.ts @@ -302,9 +302,9 @@ describe('API visibility', () => { expect(res.body).have.property('text').eql('x'); })); - it('[show] followers-replyを非フォロワーはリプライされていても見れない', async(async () => { + it('[show] followers-replyを非フォロワーでもリプライされていれば見れる', async(async () => { const res = await show(folR.id, target); - expect(res.body).have.property('isHidden').eql(true); + expect(res.body).have.property('text').eql('x'); })); it('[show] followers-replyをフォロワーが見れる', async(async () => { @@ -434,9 +434,9 @@ describe('API visibility', () => { expect(res.body).have.property('text').eql('@target x'); })); - it('[show] followers-mentionを非フォロワーはメンションされていても見れない', async(async () => { + it('[show] followers-mentionを非フォロワーでもメンションされていれば見れる', async(async () => { const res = await show(folM.id, target); - expect(res.body).have.property('isHidden').eql(true); + expect(res.body).have.property('text').eql('@target x'); })); it('[show] followers-mentionをフォロワーが見れる', async(async () => { @@ -531,62 +531,41 @@ describe('API visibility', () => { //#endregion //#region RTL - it('[RTL] followers-reply が 非フォロワー (リプライ先ではない) から見れない', async(async () => { + it('[replies] followers-reply が フォロワーから見れる', async(async () => { + const res = await request('/notes/replies', { noteId: tgt.id, limit: 100 }, follower); + expect(res).have.status(200); + const notes = res.body.filter((n: any) => n.id == folR.id); + expect(notes[0]).have.property('text').eql('x'); + })); + + it('[replies] followers-reply が 非フォロワー (リプライ先ではない) から見れない', async(async () => { const res = await request('/notes/replies', { noteId: tgt.id, limit: 100 }, other); expect(res).have.status(200); const notes = res.body.filter((n: any) => n.id == folR.id); expect(notes).length(0); })); - it('[RTL] followers-reply が 非フォロワー (リプライ先である) から見れない', async(async () => { + it('[replies] followers-reply が 非フォロワー (リプライ先である) から見れる', async(async () => { const res = await request('/notes/replies', { noteId: tgt.id, limit: 100 }, target); expect(res).have.status(200); const notes = res.body.filter((n: any) => n.id == folR.id); - expect(notes).length(0); + expect(notes[0]).have.property('text').eql('x'); })); //#endregion //#region MTL - it('[MTL] public-reply が 非フォロワー (リプライ先ではない) から見れる', async(async () => { - const res = await request('/notes/mentions', { noteId: tgt.id, limit: 100 }, other); - expect(res).have.status(200); - const notes = res.body.filter((n: any) => n.id == pubR.id); - expect(notes).length(0); - })); - - it('[MTL] followers-reply が 非フォロワー (リプライ先ではない) から見れない', async(async () => { - const res = await request('/notes/mentions', { noteId: tgt.id, limit: 100 }, other); + it('[mentions] followers-reply が 非フォロワー (リプライ先である) から見れる', async(async () => { + const res = await request('/notes/mentions', { limit: 100 }, target); expect(res).have.status(200); const notes = res.body.filter((n: any) => n.id == folR.id); - expect(notes).length(0); + expect(notes[0]).have.property('text').eql('x'); })); - it('[MTL] followers-reply が 非フォロワー (リプライ先である) から見れない', async(async () => { - const res = await request('/notes/mentions', { noteId: tgt.id, limit: 100 }, target); - expect(res).have.status(200); - const notes = res.body.filter((n: any) => n.id == folR.id); - expect(notes).length(0); - })); - - it('[MTL] public-mention が 非フォロワー (メンション先ではない) から見れる', async(async () => { - const res = await request('/notes/mentions', { noteId: tgt.id, limit: 100 }, other); - expect(res).have.status(200); - const notes = res.body.filter((n: any) => n.id == pubM.id); - expect(notes).length(0); - })); - - it('[MTL] followers-mention が 非フォロワー (メンション先ではない) から見れない', async(async () => { - const res = await request('/notes/mentions', { noteId: tgt.id, limit: 100 }, other); + it('[mentions] followers-mention が 非フォロワー (メンション先である) から見れる', async(async () => { + const res = await request('/notes/mentions', { limit: 100 }, target); expect(res).have.status(200); const notes = res.body.filter((n: any) => n.id == folM.id); - expect(notes).length(0); - })); - - it('[MTL] followers-reply が 非フォロワー (メンション先である) から見れない', async(async () => { - const res = await request('/notes/mentions', { noteId: tgt.id, limit: 100 }, target); - expect(res).have.status(200); - const notes = res.body.filter((n: any) => n.id == folM.id); - expect(notes).length(0); + expect(notes[0]).have.property('text').eql('@target x'); })); //#endregion });