1# frozen_string_literal: true 2 3module Notes 4 class BuildService < ::BaseService 5 def execute 6 in_reply_to_discussion_id = params.delete(:in_reply_to_discussion_id) 7 discussion = nil 8 9 if in_reply_to_discussion_id.present? 10 discussion = find_discussion(in_reply_to_discussion_id) 11 12 return discussion_not_found unless discussion && can?(current_user, :create_note, discussion.noteable) 13 14 discussion = discussion.convert_to_discussion! if discussion.can_convert_to_discussion? 15 16 params.merge!(discussion.reply_attributes) 17 end 18 19 new_note(params, discussion) 20 end 21 22 private 23 24 def new_note(params, discussion) 25 note = Note.new(params) 26 note.project = project 27 note.author = current_user 28 29 parent_confidential = discussion&.confidential? 30 can_set_confidential = can?(current_user, :mark_note_as_confidential, note) 31 32 return discussion_not_found if parent_confidential && !can_set_confidential 33 34 note.confidential = (parent_confidential.nil? && can_set_confidential ? params.delete(:confidential) : parent_confidential) 35 note.resolve_without_save(current_user) if discussion&.resolved? 36 note 37 end 38 39 def find_discussion(discussion_id) 40 if project 41 project.notes.find_discussion(discussion_id) 42 else 43 Note.find_discussion(discussion_id) 44 end 45 end 46 47 def discussion_not_found 48 note = Note.new 49 note.errors.add(:base, _('Discussion to reply to cannot be found')) 50 note 51 end 52 end 53end 54