diff --git a/app/controllers/api/v3/notices_controller.rb b/app/controllers/api/v3/notices_controller.rb index 750d0dd..3ec5404 100644 --- a/app/controllers/api/v3/notices_controller.rb +++ b/app/controllers/api/v3/notices_controller.rb @@ -5,28 +5,24 @@ class Api::V3::NoticesController < ApplicationController respond_to :json def create - response.headers['Access-Control-Allow-Origin'] = '*' - response.headers['Access-Control-Allow-Headers'] = 'origin, content-type, accept' + params.merge!(JSON.parse(request.raw_post) || {}) + report = AirbrakeApi::V3::NoticeParser.new(params).report - if !request.options? - report = AirbrakeApi::V3::NoticeParser.new(params).report - - if report.valid? - if report.should_keep? - report.generate_notice! - render json: { - notice: { - id: report.notice.id - } - } - else - render text: 'Notice for old app version ignored' - end + if report.valid? + if report.should_keep? + report.generate_notice! + render json: { + id: report.notice.id, + url: app_problem_path( + report.app, + report.error.problem_id, + only_path: false) + } else - render text: 'Your API key is unknown', status: 422 + render text: 'Notice for old app version ignored' end else - render nothing: true + render text: 'Your API key is unknown', status: 422 end rescue AirbrakeApi::ParamsError render text: 'Invalid request', status: 400 diff --git a/config/routes.rb b/config/routes.rb index fcf1e3d..f385464 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -60,7 +60,7 @@ Rails.application.routes.draw do end end - match '/api/v3/projects/:project_id/notices' => 'api/v3/notices#create', via: [:post, :options] + match '/api/v3/projects/:project_id/create-notice' => 'api/v3/notices#create', via: [:post] root :to => 'apps#index' end diff --git a/spec/controllers/api/v3/notices_controller_spec.rb b/spec/controllers/api/v3/notices_controller_spec.rb index 2f52787..0b18905 100644 --- a/spec/controllers/api/v3/notices_controller_spec.rb +++ b/spec/controllers/api/v3/notices_controller_spec.rb @@ -1,54 +1,39 @@ describe Api::V3::NoticesController, type: :controller do let(:app) { Fabricate(:app) } - - it 'responds to OPTIONS request and sets CORS headers' do - process :create, 'OPTIONS', project_id: app.api_key - expect(response).to be_success - expect(response.headers['Access-Control-Allow-Origin']).to eq('*') - expect(response.headers['Access-Control-Allow-Headers']).to eq('origin, content-type, accept') - end - - it 'sets CORS headers on POST request' do - post :create, project_id: 'invalid id' - expect(response.headers['Access-Control-Allow-Origin']).to eq('*') - expect(response.headers['Access-Control-Allow-Headers']).to eq('origin, content-type, accept') + let(:project_id) { app.api_key } + let(:legit_params) { { project_id: project_id, key: project_id } } + let(:legit_body) do + Rails.root.join('spec', 'fixtures', 'api_v3_request.json').read end it 'returns created notice id in json format' do - json = Rails.root.join('spec', 'fixtures', 'api_v3_request.json').read - data = JSON.parse(json) - data['project_id'] = app.api_key - data['key'] = app.api_key - post :create, data + post :create, legit_body, legit_params notice = Notice.last - expect(response.body).to eq({ notice: { id: notice.id } }.to_json) + expect(JSON.parse(response.body)).to eq({ + 'id' => notice.id.to_s, + 'url' => app_problem_path(app, notice.problem, only_path: false) + }) end it 'responds with 400 when request attributes are not valid' do - allow_any_instance_of(AirbrakeApi::V3::NoticeParser).to receive(:report).and_raise(AirbrakeApi::ParamsError) + allow_any_instance_of(AirbrakeApi::V3::NoticeParser) + .to receive(:report).and_raise(AirbrakeApi::ParamsError) post :create, project_id: 'ID' expect(response.status).to eq(400) expect(response.body).to eq('Invalid request') end - it 'responds with 422 when api_key or project_id is invalid' do - json = Rails.root.join('spec', 'fixtures', 'api_v3_request.json').read - data = JSON.parse(json) - data['project_id'] = 'invalid' - data.delete('key') - post :create, data + it 'responds with 422 when project_id is invalid' do + post :create, legit_body, { project_id: 'hm?', key: 'wha?' } + expect(response.status).to eq(422) expect(response.body).to eq('Your API key is unknown') end it 'ignores notices for older api' do - upgraded_app = Fabricate(:app, current_app_version: '2.0') - json = Rails.root.join('spec', 'fixtures', 'api_v3_request.json').read - data = JSON.parse(json) - data['project_id'] = upgraded_app.api_key - data['key'] = upgraded_app.api_key - post :create, data + app = Fabricate(:app, current_app_version: '2.0') + post :create, legit_body, { project_id: app.api_key, key: app.api_key } expect(response.body).to eq('Notice for old app version ignored') expect(Notice.count).to eq(0) end -end \ No newline at end of file +end diff --git a/spec/fixtures/api_v3_request.json b/spec/fixtures/api_v3_request.json index dccf38c..01a1324 100644 --- a/spec/fixtures/api_v3_request.json +++ b/spec/fixtures/api_v3_request.json @@ -32,7 +32,5 @@ }, "params":{"returnTo":"dashboard"}, "environment":{"navigator_vendor":"Google Inc."}, - "session":{"isAdmin":true}, - "key":"a3969bfbf65f073921e", - "project_id":"a3969bfbf65f073921e" -} \ No newline at end of file + "session":{"isAdmin":true} +} -- libgit2 0.21.2