forked from cybrespace/mastodon
		
	Fix not being able to unfavorite toots one has lost access to (#15192)
Fixes #15191
This commit is contained in:
		
							parent
							
								
									8b8004a962
								
							
						
					
					
						commit
						c43f4cd3bb
					
				
					 2 changed files with 38 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -5,7 +5,7 @@ class Api::V1::Statuses::FavouritesController < Api::BaseController
 | 
			
		|||
 | 
			
		||||
  before_action -> { doorkeeper_authorize! :write, :'write:favourites' }
 | 
			
		||||
  before_action :require_user!
 | 
			
		||||
  before_action :set_status
 | 
			
		||||
  before_action :set_status, only: [:create]
 | 
			
		||||
 | 
			
		||||
  def create
 | 
			
		||||
    FavouriteService.new.call(current_account, @status)
 | 
			
		||||
| 
						 | 
				
			
			@ -13,8 +13,19 @@ class Api::V1::Statuses::FavouritesController < Api::BaseController
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def destroy
 | 
			
		||||
    UnfavouriteWorker.perform_async(current_account.id, @status.id)
 | 
			
		||||
    fav = current_account.favourites.find_by(status_id: params[:status_id])
 | 
			
		||||
 | 
			
		||||
    if fav
 | 
			
		||||
      @status = fav.status
 | 
			
		||||
      UnfavouriteWorker.perform_async(current_account.id, @status.id)
 | 
			
		||||
    else
 | 
			
		||||
      @status = Status.find(params[:status_id])
 | 
			
		||||
      authorize @status, :show?
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, favourites_map: { @status.id => false })
 | 
			
		||||
  rescue Mastodon::NotPermittedError
 | 
			
		||||
    not_found
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -82,6 +82,31 @@ describe Api::V1::Statuses::FavouritesController do
 | 
			
		|||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      context 'with public status when blocked by its author' do
 | 
			
		||||
        let(:status) { Fabricate(:status) }
 | 
			
		||||
 | 
			
		||||
        before do
 | 
			
		||||
          FavouriteService.new.call(user.account, status)
 | 
			
		||||
          status.account.block!(user.account)
 | 
			
		||||
          post :destroy, params: { status_id: status.id }
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'returns http success' do
 | 
			
		||||
          expect(response).to have_http_status(200)
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'updates the favourite attribute' do
 | 
			
		||||
          expect(user.account.favourited?(status)).to be false
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'returns json with updated attributes' do
 | 
			
		||||
          hash_body = body_as_json
 | 
			
		||||
 | 
			
		||||
          expect(hash_body[:id]).to eq status.id.to_s
 | 
			
		||||
          expect(hash_body[:favourited]).to be false
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      context 'with private status that was not favourited' do
 | 
			
		||||
        let(:status) { Fabricate(:status, visibility: :private) }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue