Skip to content

Commit fda9840

Browse files
ShahzaibAwanvitalie
ShahzaibAwan
authored and
vitalie
committed
[BSFY-181] Add env vars changes to changelog for admin
1 parent 9deeb71 commit fda9840

File tree

11 files changed

+133
-16
lines changed

11 files changed

+133
-16
lines changed

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

+56-4
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+
set_callback :after_save, :after, :save_audit
9+
510
set(:prefix) { "/settings/" << name[/[^:]+$/].underscore }
611

712
class << self
@@ -19,7 +24,7 @@ def subclass(name)
1924
end
2025

2126
def create_settings_class(name)
22-
klass = Class.new(self) do
27+
Class.new(self) do
2328
define_method(:name) { name }
2429
before { authenticate_by_mode! }
2530
define_routes!
@@ -50,7 +55,15 @@ def update
5055
record.update(JSON.parse(request.body.read)[singular_name])
5156

5257
if record.valid?
58+
@changes = {
59+
env_vars: {
60+
created: "name: #{record.name}, is_public: #{record.public}, branch: #{record.branch || 'all'} "
61+
}
62+
} if is_env_var?
63+
5364
repo_settings.save
65+
run_callbacks :after_save if is_env_var?
66+
5467
respond_with(record, type: singular_name, version: :v2)
5568
else
5669
status 422
@@ -64,7 +77,15 @@ def create
6477
record = collection.create(JSON.parse(request.body.read)[singular_name])
6578

6679
if record.valid?
80+
@changes = {
81+
env_vars: {
82+
created: "name: #{record.name}, is_public: #{record.public}, branch: #{record.branch || 'all'}"
83+
}
84+
} if is_env_var?
85+
6786
repo_settings.save
87+
run_callbacks :after_save if is_env_var?
88+
6889
respond_with(record, type: singular_name, version: :v2)
6990
else
7091
status 422
@@ -76,7 +97,15 @@ def destroy
7697
disallow_migrating!(repo)
7798

7899
record = collection.destroy(params[:id]) || record_not_found
100+
@changes = {
101+
env_vars: {
102+
destroyed: "name: #{record.name}, is_public: #{record.public}, branch: #{record.branch || 'all'} "
103+
}
104+
} if is_env_var?
105+
79106
repo_settings.save
107+
run_callbacks :after_save if is_env_var?
108+
80109
respond_with(record, type: singular_name, version: :v2)
81110
end
82111

@@ -89,15 +118,15 @@ def collection
89118
end
90119

91120
def repo
92-
Repository.find(params[:repository_id])
121+
@repo = Repository.find(params[:repository_id])
93122
end
94123

95124
# This method can't be called "settings" because it clashes with
96125
# Sinatra's method
97126
def repo_settings
98127
@settings ||= begin
99-
service(:find_repo_settings, id: params['repository_id'].to_i).run
100-
end || halt(404, error: "Couldn't find repository")
128+
service(:find_repo_settings, id: params['repository_id'].to_i).run
129+
end || halt(404, error: "Couldn't find repository")
101130
end
102131

103132
def record
@@ -107,5 +136,28 @@ def record
107136
def record_not_found
108137
halt(404, { error: "Could not find a requested setting" })
109138
end
139+
140+
def changes
141+
@changes
142+
end
143+
144+
def is_env_var?
145+
singular_name == 'env_var'
146+
end
147+
148+
private
149+
150+
def save_audit
151+
change_source = access_token.app_id == 2 ? 'admin-v2' : 'travis-api'
152+
Travis::API::V3::Models::Audit.create!(
153+
owner: current_user,
154+
change_source: change_source,
155+
source: @repo,
156+
source_changes: {
157+
settings: self.changes
158+
}
159+
)
160+
@changes = {}
161+
end
110162
end
111163
end

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

+37-2
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,26 @@
33
module Travis::API::V3
44
class Models::EnvVars < Travis::Settings::Collection
55
include Models::JsonSync
6+
include ActiveSupport::Callbacks
7+
extend ActiveSupport::Concern
8+
69
model Models::EnvVar
710

11+
define_callbacks :after_save
12+
set_callback :after_save, :after, :save_audit
13+
14+
attr_accessor :user, :change_source
15+
816
# See Models::JsonSync
917
def to_h
1018
{ 'env_vars' => map(&:to_h).map(&:stringify_keys) }
1119
end
1220

1321
def create(attributes)
14-
super(attributes).tap { sync! }
22+
@changes = { env_vars: { created: "#{attributes.except("value")}" } }
23+
env_var = super(attributes).tap { sync! }
24+
run_callbacks :after_save
25+
env_var
1526
end
1627

1728
def add(env_var)
@@ -20,11 +31,35 @@ def add(env_var)
2031
end
2132

2233
def destroy(id)
23-
super(id).tap { sync! }
34+
env_var = find(id)
35+
@changes = { env_vars: { deleted: "#{env_var.attributes.delete("value")}" } }
36+
deleted_env_var = super(id).tap { sync! }
37+
run_callbacks :after_save
38+
deleted_env_var
2439
end
2540

2641
def repository
2742
@repository ||= Models::Repository.find(additional_attributes[:repository_id])
2843
end
44+
45+
def changes
46+
@changes
47+
end
48+
49+
private
50+
51+
def save_audit
52+
if self.change_source
53+
Travis::API::V3::Models::Audit.create!(
54+
owner: self.user,
55+
change_source: self.change_source,
56+
source: self.repository,
57+
source_changes: {
58+
settings: self.changes
59+
}
60+
)
61+
@changes = {}
62+
end
63+
end
2964
end
3065
end

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

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

9-
def update(env_var)
9+
def update(env_var, from_admin = false)
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)
15+
1216
env_var
1317
end
1418

15-
def delete(repository)
16-
repository.env_vars.destroy(id)
19+
def delete(repository, from_admin = false)
20+
env_vars = repository.env_vars
21+
env_vars.user = repository.user_settings.user
22+
env_vars.change_source = 'travis-api' unless from_admin
23+
env_vars.destroy(id)
1724
end
1825
end
1926
end

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

+7-2
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@ 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 = false)
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

1215
unless env_var.valid?
1316
repository.env_vars.destroy(env_var.id)
1417
handle_errors(env_var)
1518
end
19+
1620
repository.save!
21+
1722
env_var
1823
end
1924

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ def find(repository)
66
repository.user_settings.read(_name)
77
end
88

9-
def update(repository, user, from_admin)
9+
def update(repository, user, from_admin = false)
1010
user_settings = repository.user_settings
1111
user_settings.user = user
1212
user_settings.change_source = 'travis-api' unless from_admin

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)