Commit 6a233224beeb6f7882f488cbfc41a2858f8f00bb

Authored by Stephen Crosby
1 parent d949c00b
Exists in master and in 1 other branch production

support latest airbrake-js

app/controllers/api/v3/notices_controller.rb
@@ -5,28 +5,24 @@ class Api::V3::NoticesController < ApplicationController @@ -5,28 +5,24 @@ class Api::V3::NoticesController < ApplicationController
5 respond_to :json 5 respond_to :json
6 6
7 def create 7 def create
8 - response.headers['Access-Control-Allow-Origin'] = '*'  
9 - response.headers['Access-Control-Allow-Headers'] = 'origin, content-type, accept' 8 + params.merge!(JSON.parse(request.raw_post) || {})
  9 + report = AirbrakeApi::V3::NoticeParser.new(params).report
10 10
11 - if !request.options?  
12 - report = AirbrakeApi::V3::NoticeParser.new(params).report  
13 -  
14 - if report.valid?  
15 - if report.should_keep?  
16 - report.generate_notice!  
17 - render json: {  
18 - notice: {  
19 - id: report.notice.id  
20 - }  
21 - }  
22 - else  
23 - render text: 'Notice for old app version ignored'  
24 - end 11 + if report.valid?
  12 + if report.should_keep?
  13 + report.generate_notice!
  14 + render json: {
  15 + id: report.notice.id,
  16 + url: app_problem_path(
  17 + report.app,
  18 + report.error.problem_id,
  19 + only_path: false)
  20 + }
25 else 21 else
26 - render text: 'Your API key is unknown', status: 422 22 + render text: 'Notice for old app version ignored'
27 end 23 end
28 else 24 else
29 - render nothing: true 25 + render text: 'Your API key is unknown', status: 422
30 end 26 end
31 rescue AirbrakeApi::ParamsError 27 rescue AirbrakeApi::ParamsError
32 render text: 'Invalid request', status: 400 28 render text: 'Invalid request', status: 400
config/routes.rb
@@ -60,7 +60,7 @@ Rails.application.routes.draw do @@ -60,7 +60,7 @@ Rails.application.routes.draw do
60 end 60 end
61 end 61 end
62 62
63 - match '/api/v3/projects/:project_id/notices' => 'api/v3/notices#create', via: [:post, :options] 63 + match '/api/v3/projects/:project_id/create-notice' => 'api/v3/notices#create', via: [:post]
64 64
65 root :to => 'apps#index' 65 root :to => 'apps#index'
66 end 66 end
spec/controllers/api/v3/notices_controller_spec.rb
1 describe Api::V3::NoticesController, type: :controller do 1 describe Api::V3::NoticesController, type: :controller do
2 let(:app) { Fabricate(:app) } 2 let(:app) { Fabricate(:app) }
3 -  
4 - it 'responds to OPTIONS request and sets CORS headers' do  
5 - process :create, 'OPTIONS', project_id: app.api_key  
6 - expect(response).to be_success  
7 - expect(response.headers['Access-Control-Allow-Origin']).to eq('*')  
8 - expect(response.headers['Access-Control-Allow-Headers']).to eq('origin, content-type, accept')  
9 - end  
10 -  
11 - it 'sets CORS headers on POST request' do  
12 - post :create, project_id: 'invalid id'  
13 - expect(response.headers['Access-Control-Allow-Origin']).to eq('*')  
14 - expect(response.headers['Access-Control-Allow-Headers']).to eq('origin, content-type, accept') 3 + let(:project_id) { app.api_key }
  4 + let(:legit_params) { { project_id: project_id, key: project_id } }
  5 + let(:legit_body) do
  6 + Rails.root.join('spec', 'fixtures', 'api_v3_request.json').read
15 end 7 end
16 8
17 it 'returns created notice id in json format' do 9 it 'returns created notice id in json format' do
18 - json = Rails.root.join('spec', 'fixtures', 'api_v3_request.json').read  
19 - data = JSON.parse(json)  
20 - data['project_id'] = app.api_key  
21 - data['key'] = app.api_key  
22 - post :create, data 10 + post :create, legit_body, legit_params
23 notice = Notice.last 11 notice = Notice.last
24 - expect(response.body).to eq({ notice: { id: notice.id } }.to_json) 12 + expect(JSON.parse(response.body)).to eq({
  13 + 'id' => notice.id.to_s,
  14 + 'url' => app_problem_path(app, notice.problem, only_path: false)
  15 + })
25 end 16 end
26 17
27 it 'responds with 400 when request attributes are not valid' do 18 it 'responds with 400 when request attributes are not valid' do
28 - allow_any_instance_of(AirbrakeApi::V3::NoticeParser).to receive(:report).and_raise(AirbrakeApi::ParamsError) 19 + allow_any_instance_of(AirbrakeApi::V3::NoticeParser)
  20 + .to receive(:report).and_raise(AirbrakeApi::ParamsError)
29 post :create, project_id: 'ID' 21 post :create, project_id: 'ID'
30 expect(response.status).to eq(400) 22 expect(response.status).to eq(400)
31 expect(response.body).to eq('Invalid request') 23 expect(response.body).to eq('Invalid request')
32 end 24 end
33 25
34 - it 'responds with 422 when api_key or project_id is invalid' do  
35 - json = Rails.root.join('spec', 'fixtures', 'api_v3_request.json').read  
36 - data = JSON.parse(json)  
37 - data['project_id'] = 'invalid'  
38 - data.delete('key')  
39 - post :create, data 26 + it 'responds with 422 when project_id is invalid' do
  27 + post :create, legit_body, { project_id: 'hm?', key: 'wha?' }
  28 +
40 expect(response.status).to eq(422) 29 expect(response.status).to eq(422)
41 expect(response.body).to eq('Your API key is unknown') 30 expect(response.body).to eq('Your API key is unknown')
42 end 31 end
43 32
44 it 'ignores notices for older api' do 33 it 'ignores notices for older api' do
45 - upgraded_app = Fabricate(:app, current_app_version: '2.0')  
46 - json = Rails.root.join('spec', 'fixtures', 'api_v3_request.json').read  
47 - data = JSON.parse(json)  
48 - data['project_id'] = upgraded_app.api_key  
49 - data['key'] = upgraded_app.api_key  
50 - post :create, data 34 + app = Fabricate(:app, current_app_version: '2.0')
  35 + post :create, legit_body, { project_id: app.api_key, key: app.api_key }
51 expect(response.body).to eq('Notice for old app version ignored') 36 expect(response.body).to eq('Notice for old app version ignored')
52 expect(Notice.count).to eq(0) 37 expect(Notice.count).to eq(0)
53 end 38 end
54 -end  
55 \ No newline at end of file 39 \ No newline at end of file
  40 +end
spec/fixtures/api_v3_request.json
@@ -32,7 +32,5 @@ @@ -32,7 +32,5 @@
32 }, 32 },
33 "params":{"returnTo":"dashboard"}, 33 "params":{"returnTo":"dashboard"},
34 "environment":{"navigator_vendor":"Google Inc."}, 34 "environment":{"navigator_vendor":"Google Inc."},
35 - "session":{"isAdmin":true},  
36 - "key":"a3969bfbf65f073921e",  
37 - "project_id":"a3969bfbf65f073921e"  
38 -}  
39 \ No newline at end of file 35 \ No newline at end of file
  36 + "session":{"isAdmin":true}
  37 +}