Welcome to mirror list, hosted at ThFree Co, Russian Federation.

error_tracking_controller.rb « projects « controllers « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 56a66dd38db37384bc26d85d60d2024e3c2db656 (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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# frozen_string_literal: true

class Projects::ErrorTrackingController < Projects::ApplicationController
  before_action :authorize_read_sentry_issue!
  before_action :set_issue_id, only: [:details, :stack_trace]

  POLLING_INTERVAL = 10_000

  def index
    respond_to do |format|
      format.html
      format.json do
        set_polling_interval
        render_index_json
      end
    end
  end

  def details
    respond_to do |format|
      format.html
      format.json do
        render_issue_detail_json
      end
    end
  end

  def stack_trace
    respond_to do |format|
      format.json do
        render_issue_stack_trace_json
      end
    end
  end

  def list_projects
    respond_to do |format|
      format.json do
        render_project_list_json
      end
    end
  end

  private

  def render_index_json
    service = ErrorTracking::ListIssuesService.new(
      project,
      current_user,
      list_issues_params
    )
    result = service.execute

    return if handle_errors(result)

    render json: {
      errors: serialize_errors(result[:issues]),
      pagination: result[:pagination],
      external_url: service.external_url
    }
  end

  def render_issue_detail_json
    service = ErrorTracking::IssueDetailsService.new(project, current_user, issue_details_params)
    result = service.execute

    return if handle_errors(result)

    render json: {
      error: serialize_detailed_error(result[:issue])
    }
  end

  def render_issue_stack_trace_json
    service = ErrorTracking::IssueLatestEventService.new(project, current_user, issue_details_params)
    result = service.execute

    return if handle_errors(result)

    render json: {
      error: serialize_error_event(result[:latest_event])
    }
  end

  def render_project_list_json
    service = ErrorTracking::ListProjectsService.new(
      project,
      current_user,
      list_projects_params
    )
    result = service.execute

    if result[:status] == :success
      render json: {
        projects: serialize_projects(result[:projects])
      }
    else
      return render(
        status: result[:http_status] || :bad_request,
        json: {
          message: result[:message]
        }
      )
    end
  end

  def handle_errors(result)
    unless result[:status] == :success
      render json: { message: result[:message] },
             status: result[:http_status] || :bad_request
    end
  end

  def list_issues_params
    params.permit(:search_term, :sort, :cursor)
  end

  def list_projects_params
    params.require(:error_tracking_setting).permit([:api_host, :token])
  end

  def issue_details_params
    params.permit(:issue_id)
  end

  def set_issue_id
    @issue_id = issue_details_params[:issue_id]
  end

  def set_polling_interval
    Gitlab::PollingInterval.set_header(response, interval: POLLING_INTERVAL)
  end

  def serialize_errors(errors)
    ErrorTracking::ErrorSerializer
      .new(project: project, user: current_user)
      .represent(errors)
  end

  def serialize_detailed_error(error)
    ErrorTracking::DetailedErrorSerializer
      .new(project: project, user: current_user)
      .represent(error)
  end

  def serialize_error_event(event)
    ErrorTracking::ErrorEventSerializer
      .new(project: project, user: current_user)
      .represent(event)
  end

  def serialize_projects(projects)
    ErrorTracking::ProjectSerializer
      .new(project: project, user: current_user)
      .represent(projects)
  end
end