summaryrefslogtreecommitdiff
path: root/app/workers/merge_requests/close_issue_worker.rb
blob: 86d63e571ac03706996218a3c05250235dc2e2cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# frozen_string_literal: true

module MergeRequests
  class CloseIssueWorker
    include ApplicationWorker

    data_consistency :always
    feature_category :code_review
    urgency :low
    idempotent!

    # Issues:CloseService execute webhooks which are treated as external dependencies
    worker_has_external_dependencies!

    # This worker only accepts ID of an Issue. We are intentionally using this
    # worker to close Issues asynchronously as we only experience SQL timeouts
    # when closing an Issue.
    def perform(project_id, user_id, issue_id, merge_request_id)
      project = Project.find_by_id(project_id)

      unless project
        logger.info(structured_payload(message: 'Project not found.', project_id: project_id))
        return
      end

      user = User.find_by_id(user_id)

      unless user
        logger.info(structured_payload(message: 'User not found.', user_id: user_id))
        return
      end

      issue = Issue.find_by_id(issue_id)

      unless issue
        logger.info(structured_payload(message: 'Issue not found.', issue_id: issue_id))
        return
      end

      merge_request = MergeRequest.find_by_id(merge_request_id)

      unless merge_request
        logger.info(structured_payload(message: 'Merge request not found.', merge_request_id: merge_request_id))
        return
      end

      Issues::CloseService
        .new(project: project, current_user: user)
        .execute(issue, commit: merge_request)
    end
  end
end