Add simple API to remove item from collection (#37225)

This commit is contained in:
David Roetzel 2025-12-15 09:03:49 +01:00 committed by GitHub
parent 372de345d7
commit bb72ecd466
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 63 additions and 1 deletions

View File

@ -11,6 +11,7 @@ class Api::V1Alpha::CollectionItemsController < Api::BaseController
before_action :set_collection before_action :set_collection
before_action :set_account, only: [:create] before_action :set_account, only: [:create]
before_action :set_collection_item, only: [:destroy]
after_action :verify_authorized after_action :verify_authorized
@ -23,6 +24,14 @@ class Api::V1Alpha::CollectionItemsController < Api::BaseController
render json: @item, serializer: REST::CollectionItemSerializer render json: @item, serializer: REST::CollectionItemSerializer
end end
def destroy
authorize @collection, :update?
@collection_item.destroy
head 200
end
private private
def set_collection def set_collection
@ -35,6 +44,10 @@ class Api::V1Alpha::CollectionItemsController < Api::BaseController
@account = Account.find(params[:account_id]) @account = Account.find(params[:account_id])
end end
def set_collection_item
@collection_item = @collection.collection_items.find(params[:id])
end
def check_feature_enabled def check_feature_enabled
raise ActionController::RoutingError unless Mastodon::Feature.collections_enabled? raise ActionController::RoutingError unless Mastodon::Feature.collections_enabled?
end end

View File

@ -13,7 +13,7 @@ namespace :api, format: false do
resources :async_refreshes, only: :show resources :async_refreshes, only: :show
resources :collections, only: [:show, :create, :update, :destroy] do resources :collections, only: [:show, :create, :update, :destroy] do
resources :items, only: [:create], controller: 'collection_items' resources :items, only: [:create, :destroy], controller: 'collection_items'
end end
end end

View File

@ -52,4 +52,53 @@ RSpec.describe 'Api::V1Alpha::CollectionItems', feature: :collections do
end end
end end
end end
describe 'DELETE /api/v1_alpha/collections/:collection_id/items/:id' do
subject do
delete "/api/v1_alpha/collections/#{collection.id}/items/#{item.id}", headers: headers
end
let(:collection) { Fabricate(:collection, account: user.account) }
let(:item) { Fabricate(:collection_item, collection:) }
it_behaves_like 'forbidden for wrong scope', 'read'
context 'when user is owner of the collection' do
context 'when item belongs to collection' do
it 'deletes the collection item and returns http success' do
item # Make sure this exists before calling the API
expect do
subject
end.to change(collection.collection_items, :count).by(-1)
expect(response).to have_http_status(200)
end
end
context 'when item does not belong to to collection' do
let(:item) { Fabricate(:collection_item) }
it 'returns http not found' do
item # Make sure this exists before calling the API
expect do
subject
end.to_not change(CollectionItem, :count)
expect(response).to have_http_status(404)
end
end
end
context 'when user is not the owner of the collection' do
let(:collection) { Fabricate(:collection) }
it 'returns http forbidden' do
subject
expect(response).to have_http_status(403)
end
end
end
end end