From a167d715c966021da179302f8c5513347b45696a Mon Sep 17 00:00:00 2001 From: Jeremy Kescher Date: Wed, 10 May 2023 00:49:41 +0200 Subject: [PATCH 1/4] api.rb: Remove resources line that wasn't in routes.rb anymore Co-authored-by: Plastikmensch --- config/routes/api.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/config/routes/api.rb b/config/routes/api.rb index 4ce4751c4d..e5c37ac4e0 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -32,7 +32,6 @@ namespace :api, format: false do resource :history, only: :show resource :source, only: :show - resources :reactions, only: [:update, :destroy] post :translate, to: 'translations#create' end From bcc8e89b08b6a2309f9a55b08ac3cb0a98d3afdf Mon Sep 17 00:00:00 2001 From: Jeremy Kescher Date: Wed, 10 May 2023 20:53:18 +0200 Subject: [PATCH 2/4] status_reaction_fabricator: Use a unicode emoji instead of "MyString" Co-authored-by: Plastikmensch --- spec/fabricators/status_reaction_fabricator.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spec/fabricators/status_reaction_fabricator.rb b/spec/fabricators/status_reaction_fabricator.rb index bd042ec07a..6c5e67e8a4 100644 --- a/spec/fabricators/status_reaction_fabricator.rb +++ b/spec/fabricators/status_reaction_fabricator.rb @@ -1,6 +1,8 @@ +# frozen_string_literal: true + Fabricator(:status_reaction) do - account nil - status nil - name 'MyString' - custom_emoji nil + account + status + name '👍' + custom_emoji end From 5d0a1a7b74a64dfc74a41dd9dd50bfab14f2b1c0 Mon Sep 17 00:00:00 2001 From: Jeremy Kescher Date: Wed, 10 May 2023 20:59:58 +0200 Subject: [PATCH 3/4] Fix invalidating status reactions when they already exist Co-authored-by: Plastikmensch --- app/validators/status_reaction_validator.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/validators/status_reaction_validator.rb b/app/validators/status_reaction_validator.rb index 8c623c823d..0338bf531a 100644 --- a/app/validators/status_reaction_validator.rb +++ b/app/validators/status_reaction_validator.rb @@ -9,7 +9,7 @@ class StatusReactionValidator < ActiveModel::Validator return if reaction.name.blank? reaction.errors.add(:name, I18n.t('reactions.errors.unrecognized_emoji')) if reaction.custom_emoji_id.blank? && !unicode_emoji?(reaction.name) - reaction.errors.add(:base, I18n.t('reactions.errors.limit_reached')) if reaction.account.local? && limit_reached?(reaction) + reaction.errors.add(:base, I18n.t('reactions.errors.limit_reached')) if reaction.account.local? && new_reaction?(reaction) && limit_reached?(reaction) end private @@ -18,6 +18,10 @@ class StatusReactionValidator < ActiveModel::Validator SUPPORTED_EMOJIS.include?(name) end + def new_reaction?(reaction) + !reaction.status.status_reactions.exists?(status: reaction.status, account: reaction.account, name: reaction.name) + end + def limit_reached?(reaction) reaction.status.status_reactions.where(status: reaction.status, account: reaction.account).count >= LIMIT end From 0f96d0fbb7b9c76329d2012b6dc9bf72cfed651f Mon Sep 17 00:00:00 2001 From: Jeremy Kescher Date: Thu, 11 May 2023 13:40:24 +0200 Subject: [PATCH 4/4] ReactionsController: Don't check for status reaction existence in destroy UnreactService checks for its existence in the background anyway, so remove redundant checks. --- .../api/v1/statuses/reactions_controller.rb | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/app/controllers/api/v1/statuses/reactions_controller.rb b/app/controllers/api/v1/statuses/reactions_controller.rb index e90e46c507..2d7e4f5984 100644 --- a/app/controllers/api/v1/statuses/reactions_controller.rb +++ b/app/controllers/api/v1/statuses/reactions_controller.rb @@ -5,7 +5,7 @@ class Api::V1::Statuses::ReactionsController < Api::BaseController before_action -> { doorkeeper_authorize! :write, :'write:favourites' } before_action :require_user! - before_action :set_status, only: [:create] + before_action :set_status def create ReactService.new.call(current_account, @status, params[:id]) @@ -13,15 +13,7 @@ class Api::V1::Statuses::ReactionsController < Api::BaseController end def destroy - react = current_account.status_reactions.find_by(status_id: params[:status_id], name: params[:id]) - - if react - @status = react.status - UnreactWorker.perform_async(current_account.id, @status.id, params[:id]) - else - @status = Status.find(params[:status_id]) - authorize @status, :show? - end + UnreactWorker.perform_async(current_account.id, @status.id, params[:id]) render json: @status, serializer: REST::StatusSerializer, relationships: StatusRelationshipsPresenter.new([@status], current_account.id, reactions_map: { @status.id => false }) rescue Mastodon::NotPermittedError