Skip to content

Commit a92e03a

Browse files
Merge pull request #1257 from travis-ci/bsfy-181-fix
Bsfy 181 fix
2 parents 4d10c7f + 701db1c commit a92e03a

File tree

10 files changed

+99
-15
lines changed

10 files changed

+99
-15
lines changed

lib/travis/api/app/endpoint/setting_endpoint.rb

+35-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
class Travis::Api::App
44
class SettingsEndpoint < Endpoint
5+
include ActiveSupport::Callbacks
6+
7+
define_callbacks :after_save
8+
9+
set_callback :after_save, :after, :save_audit
510
set(:prefix) { "/settings/" << name[/[^:]+$/].underscore }
611

712
class << self
@@ -38,6 +43,7 @@ def define_routes!
3843
# Rails style methods for easy overriding
3944
def index
4045
respond_with(collection, type: name, version: :v2)
46+
4147
end
4248

4349
def show
@@ -48,9 +54,12 @@ def update
4854
disallow_migrating!(repo)
4955

5056
record.update(JSON.parse(request.body.read)[singular_name])
51-
5257
if record.valid?
58+
@changes = { :"env_vars" => { created: "name: #{record.name}, is_public: #{record.public}, branch: #{record.branch || 'all'} " } } if is_env_var?
59+
5360
repo_settings.save
61+
run_callbacks :after_save if is_env_var?
62+
5463
respond_with(record, type: singular_name, version: :v2)
5564
else
5665
status 422
@@ -62,9 +71,12 @@ def create
6271
disallow_migrating!(repo)
6372

6473
record = collection.create(JSON.parse(request.body.read)[singular_name])
65-
6674
if record.valid?
75+
@changes = { :"env_vars" => { created: "name: #{record.name}, is_public: #{record.public}, branch: #{record.branch || 'all'}" } } if is_env_var?
76+
6777
repo_settings.save
78+
run_callbacks :after_save if is_env_var?
79+
6880
respond_with(record, type: singular_name, version: :v2)
6981
else
7082
status 422
@@ -76,7 +88,11 @@ def destroy
7688
disallow_migrating!(repo)
7789

7890
record = collection.destroy(params[:id]) || record_not_found
91+
@changes = { :"env_vars" => { destroyed: "name: #{record.name}, is_public: #{record.public}, branch: #{record.branch || 'all'} " } } if is_env_var?
92+
7993
repo_settings.save
94+
run_callbacks :after_save if is_env_var?
95+
8096
respond_with(record, type: singular_name, version: :v2)
8197
end
8298

@@ -89,7 +105,7 @@ def collection
89105
end
90106

91107
def repo
92-
Repository.find(params[:repository_id])
108+
@repo = Repository.find(params[:repository_id])
93109
end
94110

95111
# This method can't be called "settings" because it clashes with
@@ -107,5 +123,21 @@ def record
107123
def record_not_found
108124
halt(404, { error: "Could not find a requested setting" })
109125
end
126+
127+
def changes
128+
@changes
129+
end
130+
131+
def is_env_var?
132+
singular_name == 'env_var'
133+
end
134+
135+
private
136+
137+
def save_audit
138+
change_source = access_token.app_id == 2 ? 'admin-v2' : 'travis-api'
139+
Travis::API::V3::Models::Audit.create!(owner: current_user, change_source: change_source, source: @repo, source_changes: { settings: self.changes })
140+
@changes = {}
141+
end
110142
end
111143
end

lib/travis/api/v3/models/env_vars.rb

+28-3
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,24 @@
22

33
module Travis::API::V3
44
class Models::EnvVars < Travis::Settings::Collection
5-
include Models::JsonSync
5+
include Models::JsonSync, ActiveSupport::Callbacks
6+
extend ActiveSupport::Concern
67
model Models::EnvVar
8+
define_callbacks :after_save
79

10+
set_callback :after_save, :after, :save_audit
11+
12+
attr_accessor :user, :change_source
813
# See Models::JsonSync
914
def to_h
1015
{ 'env_vars' => map(&:to_h).map(&:stringify_keys) }
1116
end
1217

1318
def create(attributes)
14-
super(attributes).tap { sync! }
19+
@changes = { :"env_vars" => { created: "#{attributes.except("value")}" } }
20+
env_var = super(attributes).tap { sync! }
21+
run_callbacks :after_save
22+
env_var
1523
end
1624

1725
def add(env_var)
@@ -20,11 +28,28 @@ def add(env_var)
2028
end
2129

2230
def destroy(id)
23-
super(id).tap { sync! }
31+
env_var = find(id)
32+
@changes = { :"env_vars" => { deleted: "#{env_var.attributes.delete("value")}" } }
33+
deleted_env_var = super(id).tap { sync! }
34+
run_callbacks :after_save
35+
deleted_env_var
2436
end
2537

2638
def repository
2739
@repository ||= Models::Repository.find(additional_attributes[:repository_id])
2840
end
41+
42+
def changes
43+
@changes
44+
end
45+
46+
private
47+
48+
def save_audit
49+
if self.change_source
50+
Travis::API::V3::Models::Audit.create!(owner: self.user, change_source: self.change_source, source: self.repository, source_changes: { settings: self.changes })
51+
@changes = {}
52+
end
53+
end
2954
end
3055
end

lib/travis/api/v3/queries/env_var.rb

+10-4
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@ def find(repository)
66
repository.env_vars.find(id)
77
end
88

9-
def update(env_var)
9+
def update(env_var, from_admin)
10+
env_vars = env_var.repository.env_vars
11+
env_vars.user = env_var.repository.user_settings.user
12+
env_vars.change_source = 'travis-api' unless from_admin
1013
env_var.update(env_var_params)
11-
env_var.repository.env_vars.add(env_var)
14+
env_vars.add(env_var)
1215
env_var
1316
end
1417

15-
def delete(repository)
16-
repository.env_vars.destroy(id)
18+
def delete(repository, from_admin)
19+
env_vars = repository.env_vars
20+
env_vars.user = repository.user_settings.user
21+
env_vars.change_source = 'travis-api' unless from_admin
22+
env_vars.destroy(id)
1723
end
1824
end
1925
end

lib/travis/api/v3/queries/env_vars.rb

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ def find(repository)
66
repository.env_vars
77
end
88

9-
def create(repository)
10-
env_var = repository.env_vars.create(env_var_params)
9+
def create(repository, from_admin)
10+
env_vars = repository.env_vars
11+
env_vars.user = repository.user_settings.user
12+
env_vars.change_source = 'travis-api' unless from_admin
13+
env_var = env_vars.create(env_var_params)
1114
unless env_var.valid?
1215
repository.env_vars.destroy(env_var.id)
1316
handle_errors(env_var)

lib/travis/api/v3/services/env_var/delete.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ def run!
88

99
env_var = find(:env_var, repository)
1010
access_control.permissions(env_var).write!
11-
query.delete(repository) and deleted
11+
app_id = Travis::Api::App::AccessToken.find_by_token(access_control.token).app_id
12+
13+
query.delete(repository, app_id == 2) and deleted
1214
end
1315
end
1416
end

lib/travis/api/v3/services/env_var/update.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ def run!
88

99
env_var = find(:env_var, repository)
1010
access_control.permissions(env_var).write!
11-
result query.update(env_var)
11+
app_id = Travis::Api::App::AccessToken.find_by_token(access_control.token).app_id
12+
13+
result query.update(env_var, app_id == 2)
1214
end
1315
end
1416
end

lib/travis/api/v3/services/env_vars/create.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ def run!
77
repository = check_login_and_find(:repository)
88
access_control.permissions(repository).create_env_var!
99
return repo_migrated if migrated?(repository)
10+
app_id = Travis::Api::App::AccessToken.find_by_token(access_control.token).app_id
1011

11-
env_var = query(:env_vars).create(repository)
12+
env_var = query(:env_vars).create(repository, app_id == 2)
1213
result(env_var, status: 201)
1314
end
1415
end

spec/v3/services/env_var/delete_spec.rb

+4
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@
6565
example 'does not clobber other settings' do
6666
expect(repo.reload.settings['foo']).to eq 'bar'
6767
end
68+
example 'audit is created' do
69+
expect(Travis::API::V3::Models::Audit.last.source_id).to eq(repo.id)
70+
expect(Travis::API::V3::Models::Audit.last.source_type).to eq('Repository')
71+
end
6872
end
6973
end
7074

spec/v3/services/env_var/update_spec.rb

+4
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@
8989
example 'does not clobber other settings' do
9090
expect(repo.reload.settings['foo']).to eq 'bar'
9191
end
92+
example 'audit is created' do
93+
expect(Travis::API::V3::Models::Audit.last.source_id).to eq(repo.id)
94+
expect(Travis::API::V3::Models::Audit.last.source_type).to eq('Repository')
95+
end
9296
end
9397

9498
context do

spec/v3/services/env_vars/create_spec.rb

+5
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,11 @@
126126
example 'persists repository id' do
127127
expect(repo.reload.settings['env_vars'].first['repository_id']).to eq repo.id
128128
end
129+
example 'audit is created' do
130+
expect(Travis::API::V3::Models::Audit.last.source_id).to eq(repo.id)
131+
expect(Travis::API::V3::Models::Audit.last.source_type).to eq('Repository')
132+
expect(Travis::API::V3::Models::Audit.last.source_changes).to eq({"settings"=>{"env_vars"=>{"created"=> "{\"name\"=>\"FOO\", \"public\"=>false}"}}})
133+
end
129134
end
130135

131136
describe 'public' do

0 commit comments

Comments
 (0)