diff options
Diffstat (limited to 'app/services/notes/build_service.rb')
-rw-r--r-- | app/services/notes/build_service.rb | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/app/services/notes/build_service.rb b/app/services/notes/build_service.rb index cf21818a886..8c250526efc 100644 --- a/app/services/notes/build_service.rb +++ b/app/services/notes/build_service.rb @@ -3,32 +3,36 @@ module Notes class BuildService < ::BaseService def execute - should_resolve = false in_reply_to_discussion_id = params.delete(:in_reply_to_discussion_id) + discussion = nil if in_reply_to_discussion_id.present? discussion = find_discussion(in_reply_to_discussion_id) - unless discussion && can?(current_user, :create_note, discussion.noteable) - note = Note.new - note.errors.add(:base, _('Discussion to reply to cannot be found')) - return note - end + return discussion_not_found unless discussion && can?(current_user, :create_note, discussion.noteable) discussion = discussion.convert_to_discussion! if discussion.can_convert_to_discussion? params.merge!(discussion.reply_attributes) - should_resolve = discussion.resolved? end + new_note(params, discussion) + end + + private + + def new_note(params, discussion) note = Note.new(params) note.project = project note.author = current_user - if should_resolve - note.resolve_without_save(current_user) - end + parent_confidential = discussion&.confidential? + can_set_confidential = can?(current_user, :mark_note_as_confidential, note) + return discussion_not_found if parent_confidential && !can_set_confidential + + note.confidential = (parent_confidential.nil? && can_set_confidential ? params.delete(:confidential) : parent_confidential) + note.resolve_without_save(current_user) if discussion&.resolved? note end @@ -39,5 +43,11 @@ module Notes Note.find_discussion(discussion_id) end end + + def discussion_not_found + note = Note.new + note.errors.add(:base, _('Discussion to reply to cannot be found')) + note + end end end |