Skip to content

Commit 7d3b88b

Browse files
ShahzaibAwanvitalie
authored andcommitted
[BSFY-181] Add env vars changes to changelog for admin
1 parent 9deeb71 commit 7d3b88b

File tree

11 files changed

+134
-16
lines changed

11 files changed

+134
-16
lines changed

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

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

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

713
class << self
@@ -19,7 +25,7 @@ def subclass(name)
1925
end
2026

2127
def create_settings_class(name)
22-
klass = Class.new(self) do
28+
Class.new(self) do
2329
define_method(:name) { name }
2430
before { authenticate_by_mode! }
2531
define_routes!
@@ -50,7 +56,15 @@ def update
5056
record.update(JSON.parse(request.body.read)[singular_name])
5157

5258
if record.valid?
59+
@changes = {
60+
env_vars: {
61+
created: "name: #{record.name}, is_public: #{record.public}, branch: #{record.branch || 'all'} "
62+
}
63+
} if is_env_var?
64+
5365
repo_settings.save
66+
run_callbacks :after_save if is_env_var?
67+
5468
respond_with(record, type: singular_name, version: :v2)
5569
else
5670
status 422
@@ -64,7 +78,15 @@ def create
6478
record = collection.create(JSON.parse(request.body.read)[singular_name])
6579

6680
if record.valid?
81+
@changes = {
82+
env_vars: {
83+
created: "name: #{record.name}, is_public: #{record.public}, branch: #{record.branch || 'all'}"
84+
}
85+
} if is_env_var?
86+
6787
repo_settings.save
88+
run_callbacks :after_save if is_env_var?
89+
6890
respond_with(record, type: singular_name, version: :v2)
6991
else
7092
status 422
@@ -76,7 +98,15 @@ def destroy
7698
disallow_migrating!(repo)
7799

78100
record = collection.destroy(params[:id]) || record_not_found
101+
@changes = {
102+
env_vars: {
103+
destroyed: "name: #{record.name}, is_public: #{record.public}, branch: #{record.branch || 'all'} "
104+
}
105+
} if is_env_var?
106+
79107
repo_settings.save
108+
run_callbacks :after_save if is_env_var?
109+
80110
respond_with(record, type: singular_name, version: :v2)
81111
end
82112

@@ -89,15 +119,15 @@ def collection
89119
end
90120

91121
def repo
92-
Repository.find(params[:repository_id])
122+
@repo = Repository.find(params[:repository_id])
93123
end
94124

95125
# This method can't be called "settings" because it clashes with
96126
# Sinatra's method
97127
def repo_settings
98128
@settings ||= begin
99-
service(:find_repo_settings, id: params['repository_id'].to_i).run
100-
end || halt(404, error: "Couldn't find repository")
129+
service(:find_repo_settings, id: params['repository_id'].to_i).run
130+
end || halt(404, error: "Couldn't find repository")
101131
end
102132

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

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

Lines changed: 37 additions & 2 deletions
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

Lines changed: 11 additions & 4 deletions
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

Lines changed: 7 additions & 2 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 3 additions & 1 deletion
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

Lines changed: 3 additions & 1 deletion
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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

0 commit comments

Comments
 (0)