diff options
Diffstat (limited to 'app/services/system_note_service.rb')
-rw-r--r-- | app/services/system_note_service.rb | 118 |
1 files changed, 63 insertions, 55 deletions
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb index a11bca00687..d3e502b66dd 100644 --- a/app/services/system_note_service.rb +++ b/app/services/system_note_service.rb @@ -26,7 +26,7 @@ module SystemNoteService body << new_commit_summary(new_commits).join("\n") body << "\n\n[Compare with previous version](#{diff_comparison_url(noteable, project, oldrev)})" - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'commit', commit_count: total_count)) end # Called when the assignee of a Noteable is changed or removed @@ -46,7 +46,7 @@ module SystemNoteService def change_assignee(noteable, project, author, assignee) body = assignee.nil? ? 'removed assignee' : "assigned to #{assignee.to_reference}" - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'assignee')) end # Called when one or more labels on a Noteable are added and/or removed @@ -86,7 +86,7 @@ module SystemNoteService body << ' ' << 'label'.pluralize(labels_count) - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'label')) end # Called when the milestone of a Noteable is changed @@ -106,7 +106,7 @@ module SystemNoteService def change_milestone(noteable, project, author, milestone) body = milestone.nil? ? 'removed milestone' : "changed milestone to #{milestone.to_reference(project)}" - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'milestone')) end # Called when the estimated time of a Noteable is changed @@ -118,19 +118,21 @@ module SystemNoteService # # Example Note text: # - # "Changed estimate of this issue to 3d 5h" + # "removed time estimate" + # + # "changed time estimate to 3d 5h" # # Returns the created Note object def change_time_estimate(noteable, project, author) parsed_time = Gitlab::TimeTrackingFormatter.output(noteable.time_estimate) body = if noteable.time_estimate == 0 - "Removed time estimate on this #{noteable.human_class_name}" + "removed time estimate" else - "Changed time estimate of this #{noteable.human_class_name} to #{parsed_time}" + "changed time estimate to #{parsed_time}" end - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'time_tracking')) end # Called when the spent time of a Noteable is changed @@ -142,7 +144,9 @@ module SystemNoteService # # Example Note text: # - # "Added 2h 30m of time spent on this issue" + # "removed time spent" + # + # "added 2h 30m of time spent" # # Returns the created Note object @@ -150,14 +154,14 @@ module SystemNoteService time_spent = noteable.time_spent if time_spent == :reset - body = "Removed time spent on this #{noteable.human_class_name}" + body = "removed time spent" else parsed_time = Gitlab::TimeTrackingFormatter.output(time_spent.abs) - action = time_spent > 0 ? 'Added' : 'Subtracted' - body = "#{action} #{parsed_time} of time spent on this #{noteable.human_class_name}" + action = time_spent > 0 ? 'added' : 'subtracted' + body = "#{action} #{parsed_time} of time spent" end - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'time_tracking')) end # Called when the status of a Noteable is changed @@ -179,53 +183,57 @@ module SystemNoteService body = status.dup body << " via #{source.gfm_reference(project)}" if source - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'status')) end # Called when 'merge when pipeline succeeds' is executed - def merge_when_build_succeeds(noteable, project, author, last_commit) + def merge_when_pipeline_succeeds(noteable, project, author, last_commit) body = "enabled an automatic merge when the pipeline for #{last_commit.to_reference(project)} succeeds" - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'merge')) end # Called when 'merge when pipeline succeeds' is canceled - def cancel_merge_when_build_succeeds(noteable, project, author) + def cancel_merge_when_pipeline_succeeds(noteable, project, author) body = 'canceled the automatic merge' - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'merge')) end def remove_merge_request_wip(noteable, project, author) body = 'unmarked as a **Work In Progress**' - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'title')) end def add_merge_request_wip(noteable, project, author) body = 'marked as a **Work In Progress**' - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'title')) end def add_merge_request_wip_from_commit(noteable, project, author, commit) body = "marked as a **Work In Progress** from #{commit.to_reference(project)}" - create_note(noteable: noteable, project: project, author: author, note: body) + create_note(NoteSummary.new(noteable, project, author, body, action: 'title')) end def self.resolve_all_discussions(merge_request, project, author) body = "resolved all discussions" - create_note(noteable: merge_request, project: project, author: author, note: body) + create_note(NoteSummary.new(merge_request, project, author, body, action: 'discussion')) end def discussion_continued_in_issue(discussion, project, author, issue) - body = "Added #{issue.to_reference} to continue this discussion" - note_attributes = discussion.reply_attributes.merge(project: project, author: author, note: body) - note_attributes[:type] = note_attributes.delete(:note_type) + body = "created #{issue.to_reference} to continue this discussion" + + note_params = discussion.reply_attributes.merge(project: project, author: author, note: body) + note_params[:type] = note_params.delete(:note_type) - create_note(note_attributes) + note = Note.create(note_params.merge(system: true)) + note.system_note_metadata = SystemNoteMetadata.new({ action: 'discussion' }) + + note end # Called when the title of a Noteable is changed @@ -249,7 +257,8 @@ module SystemNoteService marked_new_title = Gitlab::Diff::InlineDiffMarker.new(new_title).mark(new_diffs, mode: :addition, markdown: true) body = "changed title from **#{marked_old_title}** to **#{marked_new_title}**" - create_note(noteable: noteable, project: project, author: author, note: body) + + create_note(NoteSummary.new(noteable, project, author, body, action: 'title')) end # Called when the confidentiality changes @@ -260,12 +269,13 @@ module SystemNoteService # # Example Note text: # - # "made the issue confidential" + # "made the issue confidential" # # Returns the created Note object def change_issue_confidentiality(issue, project, author) body = issue.confidential ? 'made the issue confidential' : 'made the issue visible to everyone' - create_note(noteable: issue, project: project, author: author, note: body) + + create_note(NoteSummary.new(issue, project, author, body, action: 'confidentiality')) end # Called when a branch in Noteable is changed @@ -284,7 +294,8 @@ module SystemNoteService # Returns the created Note object def change_branch(noteable, project, author, branch_type, old_branch, new_branch) body = "changed #{branch_type} branch from `#{old_branch}` to `#{new_branch}`" - create_note(noteable: noteable, project: project, author: author, note: body) + + create_note(NoteSummary.new(noteable, project, author, body, action: 'branch')) end # Called when a branch in Noteable is added or deleted @@ -310,7 +321,8 @@ module SystemNoteService end body = "#{verb} #{branch_type} branch `#{branch}`" - create_note(noteable: noteable, project: project, author: author, note: body) + + create_note(NoteSummary.new(noteable, project, author, body, action: 'branch')) end # Called when a branch is created from the 'new branch' button on a issue @@ -321,7 +333,8 @@ module SystemNoteService link = url_helpers.namespace_project_compare_url(project.namespace, project, from: project.default_branch, to: branch) body = "created branch [`#{branch}`](#{link})" - create_note(noteable: issue, project: project, author: author, note: body) + + create_note(NoteSummary.new(issue, project, author, body, action: 'branch')) end # Called when a Mentionable references a Noteable @@ -345,23 +358,12 @@ module SystemNoteService return if cross_reference_disallowed?(noteable, mentioner) gfm_reference = mentioner.gfm_reference(noteable.project) - - note_options = { - project: noteable.project, - author: author, - note: cross_reference_note_content(gfm_reference) - } - - if noteable.kind_of?(Commit) - note_options.merge!(noteable_type: 'Commit', commit_id: noteable.id) - else - note_options.merge!(noteable: noteable) - end + body = cross_reference_note_content(gfm_reference) if noteable.is_a?(ExternalIssue) noteable.project.issues_tracker.create_cross_reference_note(noteable, mentioner, author) else - create_note(note_options) + create_note(NoteSummary.new(noteable, noteable.project, author, body, action: 'cross_reference')) end end @@ -403,12 +405,13 @@ module SystemNoteService # Initial scope should be system notes of this noteable type notes = Note.system.where(noteable_type: noteable.class) - if noteable.is_a?(Commit) - # Commits have non-integer IDs, so they're stored in `commit_id` - notes = notes.where(commit_id: noteable.id) - else - notes = notes.where(noteable_id: noteable.id) - end + notes = + if noteable.is_a?(Commit) + # Commits have non-integer IDs, so they're stored in `commit_id` + notes.where(commit_id: noteable.id) + else + notes.where(noteable_id: noteable.id) + end notes_for_mentioner(mentioner, noteable, notes).exists? end @@ -439,7 +442,8 @@ module SystemNoteService def change_task_status(noteable, project, author, new_task) status_label = new_task.complete? ? Taskable::COMPLETED : Taskable::INCOMPLETE body = "marked the task **#{new_task.source}** as #{status_label}" - create_note(noteable: noteable, project: project, author: author, note: body) + + create_note(NoteSummary.new(noteable, project, author, body, action: 'task')) end # Called when noteable has been moved to another project @@ -461,7 +465,8 @@ module SystemNoteService cross_reference = noteable_ref.to_reference(project) body = "moved #{direction} #{cross_reference}" - create_note(noteable: noteable, project: project, author: author, note: body) + + create_note(NoteSummary.new(noteable, project, author, body, action: 'moved')) end private @@ -477,8 +482,11 @@ module SystemNoteService end end - def create_note(args = {}) - Note.create(args.merge(system: true)) + def create_note(note_summary) + note = Note.create(note_summary.note.merge(system: true)) + note.system_note_metadata = SystemNoteMetadata.new(note_summary.metadata) if note_summary.metadata? + + note end def cross_reference_note_prefix |