gitlab-org--gitlab-foss/app/services/award_emojis/add_service.rb

50 lines
1.2 KiB
Ruby

# frozen_string_literal: true
module AwardEmojis
class AddService < AwardEmojis::BaseService
include Gitlab::Utils::StrongMemoize
def execute
unless awardable.user_can_award?(current_user)
return error('User cannot award emoji to awardable', status: :forbidden)
end
unless awardable.emoji_awardable?
return error('Awardable cannot be awarded emoji', status: :unprocessable_entity)
end
award = awardable.award_emoji.create(name: name, user: current_user)
if award.persisted?
after_create(award)
success(award: award)
else
error(award.errors.full_messages, award: award)
end
end
private
def after_create(award)
TodoService.new.new_award_emoji(todoable, current_user) if todoable
end
def todoable
strong_memoize(:todoable) do
case awardable
when Note
# We don't create todos for personal snippet comments for now
awardable.noteable unless awardable.for_personal_snippet?
when MergeRequest, Issue
awardable
else
# No todos for all other awardables
nil
end
end
end
end
end
AwardEmojis::AddService.prepend_mod_with('AwardEmojis::AddService')