diff options
Diffstat (limited to 'app/services/issues/update_service.rb')
-rw-r--r-- | app/services/issues/update_service.rb | 70 |
1 files changed, 49 insertions, 21 deletions
diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb index 9ede5ef728b..d120b007af2 100644 --- a/app/services/issues/update_service.rb +++ b/app/services/issues/update_service.rb @@ -26,6 +26,8 @@ module Issues end def before_update(issue, skip_spam_check: false) + change_work_item_type(issue) + return if skip_spam_check Spam::SpamActionService.new( @@ -36,6 +38,14 @@ module Issues ).execute end + def change_work_item_type(issue) + return unless issue.changed_attributes['issue_type'] + + type_id = find_work_item_type_id(issue.issue_type) + + issue.work_item_type_id = type_id + end + def handle_changes(issue, options) super old_associations = options.fetch(:old_associations, {}) @@ -54,29 +64,12 @@ module Issues end handle_assignee_changes(issue, old_assignees) - - if issue.previous_changes.include?('confidential') - # don't enqueue immediately to prevent todos removal in case of a mistake - TodosDestroyer::ConfidentialIssueWorker.perform_in(Todo::WAIT_FOR_DELETE, issue.id) if issue.confidential? - create_confidentiality_note(issue) - track_usage_event(:incident_management_incident_change_confidential, current_user.id) - end - - added_labels = issue.labels - old_labels - - if added_labels.present? - notification_service.async.relabeled_issue(issue, added_labels, current_user) - end - + handle_confidential_change(issue) + handle_added_labels(issue, old_labels) handle_milestone_change(issue) - - added_mentions = issue.mentioned_users(current_user) - old_mentioned_users - - if added_mentions.present? - notification_service.async.new_mentions_in_issue(issue, added_mentions, current_user) - end - + handle_added_mentions(issue, old_mentioned_users) handle_severity_change(issue, old_severity) + handle_issue_type_change(issue) end def handle_assignee_changes(issue, old_assignees) @@ -156,6 +149,23 @@ module Issues MergeRequests::CreateFromIssueService.new(project: project, current_user: current_user, mr_params: create_merge_request_params).execute end + def handle_confidential_change(issue) + if issue.previous_changes.include?('confidential') + # don't enqueue immediately to prevent todos removal in case of a mistake + TodosDestroyer::ConfidentialIssueWorker.perform_in(Todo::WAIT_FOR_DELETE, issue.id) if issue.confidential? + create_confidentiality_note(issue) + track_usage_event(:incident_management_incident_change_confidential, current_user.id) + end + end + + def handle_added_labels(issue, old_labels) + added_labels = issue.labels - old_labels + + if added_labels.present? + notification_service.async.relabeled_issue(issue, added_labels, current_user) + end + end + def handle_milestone_change(issue) return unless issue.previous_changes.include?('milestone_id') @@ -184,6 +194,14 @@ module Issues end end + def handle_added_mentions(issue, old_mentioned_users) + added_mentions = issue.mentioned_users(current_user) - old_mentioned_users + + if added_mentions.present? + notification_service.async.new_mentions_in_issue(issue, added_mentions, current_user) + end + end + def handle_severity_change(issue, old_severity) return unless old_severity && issue.severity != old_severity @@ -218,6 +236,16 @@ module Issues def remove_incident_label?(issue) issue.issue_type != params[:issue_type] && issue.incident? end + + def handle_issue_type_change(issue) + return unless issue.previous_changes.include?('issue_type') + + do_handle_issue_type_change(issue) + end + + def do_handle_issue_type_change(issue) + SystemNoteService.change_issue_type(issue, current_user) + end end end |