Add: #198 contextのAPIについてwith_references対応 (#209)

This commit is contained in:
KMY(雪あすか) 2023-11-01 10:00:22 +09:00 committed by GitHub
parent cc938d76a7
commit 99511ee1b5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 69 additions and 1 deletions

View file

@ -49,6 +49,11 @@ class Api::V1::StatusesController < Api::BaseController
loaded_descendants = cache_collection(descendants_results, Status) loaded_descendants = cache_collection(descendants_results, Status)
loaded_references = cache_collection(references_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) @context = Context.new(ancestors: loaded_ancestors, descendants: loaded_descendants, references: loaded_references)
statuses = [@status] + @context.ancestors + @context.descendants + @context.references statuses = [@status] + @context.ancestors + @context.descendants + @context.references

View file

@ -180,7 +180,7 @@ export function fetchContext(id) {
return (dispatch, getState) => { return (dispatch, getState) => {
dispatch(fetchContextRequest(id)); 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(importFetchedStatuses(response.data.ancestors.concat(response.data.descendants).concat(response.data.references)));
dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants, response.data.references)); dispatch(fetchContextSuccess(id, response.data.ancestors, response.data.descendants, response.data.references));

View file

@ -108,6 +108,69 @@ RSpec.describe Api::V1::StatusesController do
end end
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 describe 'POST #create' do
let(:scopes) { 'write:statuses' } let(:scopes) { 'write:statuses' }