summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrpereira2 <rpereira@gitlab.com>2019-01-27 19:51:43 +0530
committerrpereira2 <rpereira@gitlab.com>2019-02-06 21:09:00 +0530
commit39a295848776d06159bc783d368e0aefa7159acc (patch)
tree3862c85584eb68f84fac87b97dcb798fd972d28d
parent8b45369d72a3636201af8253fb61ed7a05febcf2 (diff)
downloadgitlab-ce-39a295848776d06159bc783d368e0aefa7159acc.tar.gz
Add list_projects endpoint to error tracking
Add an endpoint that returns a list of sentry projects, given an api_host and token.
-rw-r--r--app/controllers/projects/error_tracking_controller.rb37
-rw-r--r--config/routes/project.rb6
-rw-r--r--spec/controllers/projects/error_tracking_controller_spec.rb74
3 files changed, 116 insertions, 1 deletions
diff --git a/app/controllers/projects/error_tracking_controller.rb b/app/controllers/projects/error_tracking_controller.rb
index 9e403e1d25b..06ecb53b048 100644
--- a/app/controllers/projects/error_tracking_controller.rb
+++ b/app/controllers/projects/error_tracking_controller.rb
@@ -15,8 +15,25 @@ class Projects::ErrorTrackingController < Projects::ApplicationController
end
end
+ def list_projects
+ respond_to do |format|
+ format.json do
+ set_polling_interval
+ render_project_list_json
+ end
+ end
+ end
+
private
+ def list_projects_params
+ params.require(:error_tracking_setting).permit([:api_host, :token])
+
+ params[:api_host] = ActionController::Base.helpers.sanitize(params[:api_host])
+
+ params
+ end
+
def render_index_json
service = ErrorTracking::ListIssuesService.new(project, current_user)
result = service.execute
@@ -32,6 +49,20 @@ class Projects::ErrorTrackingController < Projects::ApplicationController
}
end
+ def render_project_list_json
+ service = ErrorTracking::ListSentryProjectsService.new(project, current_user, list_projects_params)
+ result = service.execute
+
+ unless result[:status] == :success
+ return render json: { message: result[:message] },
+ status: result[:http_status] || :bad_request
+ end
+
+ render json: {
+ projects: serialize_projects(result[:projects])
+ }
+ end
+
def set_polling_interval
Gitlab::PollingInterval.set_header(response, interval: POLLING_INTERVAL)
end
@@ -41,4 +72,10 @@ class Projects::ErrorTrackingController < Projects::ApplicationController
.new(project: project, user: current_user)
.represent(errors)
end
+
+ def serialize_projects(projects)
+ ErrorTracking::ProjectSerializer
+ .new(project: project, user: current_user)
+ .represent(projects)
+ end
end
diff --git a/config/routes/project.rb b/config/routes/project.rb
index d730479cf2b..b0c2143babd 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -444,7 +444,11 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
end
end
- resources :error_tracking, only: [:index], controller: :error_tracking
+ resources :error_tracking, only: [:index], controller: :error_tracking do
+ collection do
+ post 'list_projects'
+ end
+ end
# Since both wiki and repository routing contains wildcard characters
# its preferable to keep it below all other project routes
diff --git a/spec/controllers/projects/error_tracking_controller_spec.rb b/spec/controllers/projects/error_tracking_controller_spec.rb
index 6464398cea1..421f48b4ba3 100644
--- a/spec/controllers/projects/error_tracking_controller_spec.rb
+++ b/spec/controllers/projects/error_tracking_controller_spec.rb
@@ -11,6 +11,68 @@ describe Projects::ErrorTrackingController do
project.add_maintainer(user)
end
+ describe 'POST #list_projects' do
+ let(:list_sentry_projects_service) { spy(:list_sentry_projects_service) }
+ let(:sentry_project) { build(:error_tracking_project) }
+
+ before do
+ expect(ErrorTracking::ListSentryProjectsService)
+ .to receive(:new).with(project, user, ActionController::Parameters)
+ .and_return(list_sentry_projects_service)
+ end
+
+ context 'service result is successful' do
+ let(:sentry_project) { build(:error_tracking_project) }
+
+ before do
+ expect(list_sentry_projects_service).to receive(:execute)
+ .and_return(status: :success, projects: [sentry_project])
+ end
+
+ it 'returns a list of errors' do
+ post :list_projects, params: list_projects_params
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to match_response_schema('error_tracking/list_projects')
+ expect(json_response['projects']).to eq([sentry_project].as_json)
+ end
+ end
+
+ context 'service result is erroneous' do
+ let(:error_message) { 'error message' }
+
+ context 'without http_status' do
+ before do
+ expect(list_sentry_projects_service).to receive(:execute)
+ .and_return(status: :error, message: error_message)
+ end
+
+ it 'returns 400 with message' do
+ get :list_projects, params: list_projects_params
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['message']).to eq(error_message)
+ end
+ end
+
+ context 'with explicit http_status' do
+ let(:http_status) { :no_content }
+
+ before do
+ expect(list_sentry_projects_service).to receive(:execute)
+ .and_return(status: :error, message: error_message, http_status: http_status)
+ end
+
+ it 'returns http_status with message' do
+ get :list_projects, params: list_projects_params
+
+ expect(response).to have_gitlab_http_status(http_status)
+ expect(json_response['message']).to eq(error_message)
+ end
+ end
+ end
+ end
+
describe 'GET #index' do
describe 'html' do
it 'renders index with 200 status code' do
@@ -127,4 +189,16 @@ describe Projects::ErrorTrackingController do
def project_params(opts = {})
opts.reverse_merge(namespace_id: project.namespace, project_id: project)
end
+
+ def list_projects_params(opts = {})
+ opts.reverse_merge(
+ namespace_id: project.namespace,
+ project_id: project,
+ format: :json,
+ error_tracking_setting: {
+ api_host: 'gitlab.com',
+ token: 'token'
+ }
+ )
+ end
end