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 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 diff --git a/spec/fabricators/status_reaction_fabricator.rb b/spec/fabricators/status_reaction_fabricator.rb index f1f3b4cfac..6c5e67e8a4 100644 --- a/spec/fabricators/status_reaction_fabricator.rb +++ b/spec/fabricators/status_reaction_fabricator.rb @@ -1,8 +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