From 99511ee1b5831bacc807f3bd0fb7af7cb1ab28d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Wed, 1 Nov 2023 10:00:22 +0900 Subject: [PATCH] =?UTF-8?q?Add:=20#198=20`context`=E3=81=AEAPI=E3=81=AB?= =?UTF-8?q?=E3=81=A4=E3=81=84=E3=81=A6`with=5Freferences`=E5=AF=BE?= =?UTF-8?q?=E5=BF=9C=20(#209)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/api/v1/statuses_controller.rb | 5 ++ app/javascript/mastodon/actions/statuses.js | 2 +- .../api/v1/statuses_controller_spec.rb | 63 +++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index 065ec07613..44ae3aae19 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -49,6 +49,11 @@ class Api::V1::StatusesController < Api::BaseController loaded_descendants = cache_collection(descendants_results, Status) loaded_references = cache_collection(references_results, Status) + unless params[:with_reference] + loaded_ancestors = (loaded_ancestors + loaded_references).uniq(&:id) + loaded_references = [] + end + @context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants, references: loaded_references) statuses = [@status] + @context.ancestors + @context.descendants + @context.references diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js index b9779cdcf4..9807e6f67c 100644 --- a/app/javascript/mastodon/actions/statuses.js +++ b/app/javascript/mastodon/actions/statuses.js @@ -180,7 +180,7 @@ export function fetchContext(id) { return (dispatch, getState) => { dispatch(fetchContextRequest(id)); - api(getState).get(`/api/v1/statuses/${id}/context`).then(response => { + api(getState).get(`/api/v1/statuses/${id}/context?with_reference=1`).then(response => { dispatch(importFetchedStatuses(response.data.ancestors.concat(response.data.descendants).concat(response.data.references))); dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants, response.data.references)); diff --git a/spec/controllers/api/v1/statuses_controller_spec.rb b/spec/controllers/api/v1/statuses_controller_spec.rb index 30bafe19ac..952a2e3b40 100644 --- a/spec/controllers/api/v1/statuses_controller_spec.rb +++ b/spec/controllers/api/v1/statuses_controller_spec.rb @@ -108,6 +108,69 @@ RSpec.describe Api::V1::StatusesController do end end + context 'with reference' do + let(:status) { Fabricate(:status, account: user.account) } + let(:scopes) { 'read:statuses' } + let(:referred) { Fabricate(:status) } + let(:referred_private) { Fabricate(:status, visibility: :private) } + let(:referred_private_following) { Fabricate(:status, visibility: :private) } + + before do + user.account.follow!(referred_private_following.account) + Fabricate(:status_reference, status: status, target_status: referred) + Fabricate(:status_reference, status: status, target_status: referred_private) + Fabricate(:status_reference, status: status, target_status: referred_private_following) + end + + it 'returns http success' do + get :context, params: { id: status.id } + expect(response).to have_http_status(200) + end + + it 'returns empty references' do + get :context, params: { id: status.id } + status_ids = body_as_json[:references].map { |ref| ref[:id].to_i } + + expect(status_ids).to eq [] + end + + it 'contains referred status' do + get :context, params: { id: status.id } + status_ids = body_as_json[:ancestors].map { |ref| ref[:id].to_i } + + expect(status_ids).to include referred.id + expect(status_ids).to include referred_private_following.id + end + + it 'does not contain private status' do + get :context, params: { id: status.id } + status_ids = body_as_json[:ancestors].map { |ref| ref[:id].to_i } + + expect(status_ids).to_not include referred_private.id + end + + context 'when with_reference is enabled' do + it 'returns http success' do + get :context, params: { id: status.id, with_reference: true } + expect(response).to have_http_status(200) + end + + it 'returns empty ancestors' do + get :context, params: { id: status.id, with_reference: true } + status_ids = body_as_json[:ancestors].map { |ref| ref[:id].to_i } + + expect(status_ids).to eq [] + end + + it 'contains referred status' do + get :context, params: { id: status.id, with_reference: true } + status_ids = body_as_json[:references].map { |ref| ref[:id].to_i } + + expect(status_ids).to include referred.id + end + end + end + describe 'POST #create' do let(:scopes) { 'write:statuses' }