Skip to content

Commit 597bb9d

Browse files
author
Shairyar Baig
authored
Merge pull request #1169 from travis-ci/epic-pricing-rc2
Billing milestone 2
2 parents a3bb95f + 13bbf47 commit 597bb9d

File tree

15 files changed

+376
-15
lines changed

15 files changed

+376
-15
lines changed

lib/travis/api/enqueue/services/restart_model.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,15 @@ def target
7878
private
7979

8080
def permission?
81-
current_user && current_user.permission?(required_role, repository_id: target.repository_id) && !abusive?
81+
current_user && current_user.permission?(required_role, repository_id: target.repository_id) && !abusive? && build_permission?
82+
end
83+
84+
def build_permission?
85+
# nil value is considered true
86+
return false if repository.permissions.find_by(user_id: current_user.id).build == false
87+
return false if repository.owner_type == 'Organization' && repository.owner.memberships.find_by(user_id: current_user.id)&.build_permission == false
88+
89+
true
8290
end
8391

8492
def abusive?

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
module Travis::API::V3
22
class Queries::BuildPermissions < Query
33
def find_for_repo(repository)
4-
Models::Repository.find(repository.id).permissions.includes(:user)
4+
Models::Repository.find(repository.id).permissions.joins(:user).includes(:user)
55
end
66

77
def find_for_organization(organization)
8-
Models::Membership.where(organization_id: organization.id).includes(:user)
8+
Models::Membership.where(organization_id: organization.id).joins(:user).includes(:user)
99
end
1010

1111
def update_for_organization(organization, user_ids, permission)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Travis::API::V3
2+
class Renderer::ExecutionPerRepo < ModelRenderer
3+
representation :minimal, :repository_id, :os, :credits_consumed, :minutes_consumed, :repository
4+
representation :standard, *representations[:minimal]
5+
end
6+
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Travis::API::V3
2+
class Renderer::ExecutionPerSender < ModelRenderer
3+
representation :minimal, :credits_consumed, :minutes_consumed, :sender_id, :sender
4+
representation :standard, *representations[:minimal]
5+
end
6+
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Travis::API::V3
2+
class Renderer::ExecutionsPerRepo < CollectionRenderer
3+
type :executionsperrepo
4+
collection_key :executionsperrepo
5+
end
6+
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Travis::API::V3
2+
class Renderer::ExecutionsPerSender < CollectionRenderer
3+
type :executionspersender
4+
collection_key :executionspersender
5+
end
6+
end

lib/travis/api/v3/renderer/user.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ class Renderer::User < Renderer::Owner
66
representation(:additional, :emails)
77

88
def email
9-
@model.email if current_user?
9+
@model.email if show_emails?
1010
end
1111

1212
def emails
13-
current_user? ? @model.emails.map(&:email) : []
13+
show_emails? ? @model.emails.map(&:email) : []
1414
end
1515

1616
def secure_user_hash
@@ -20,6 +20,10 @@ def secure_user_hash
2020

2121
private
2222

23+
def show_emails?
24+
current_user? || options[:show_email] == true
25+
end
26+
2327
def current_user?
2428
access_control.class == Travis::API::V3::AccessControl::LegacyToken && access_control.user.id == @model.id
2529
end

lib/travis/api/v3/routes.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,16 @@ module Routes
132132
route '/executions'
133133
get :for_owner
134134
end
135+
136+
resource :executions do
137+
route '/executions_per_repo'
138+
get :for_owner_per_repo
139+
end
140+
141+
resource :executions do
142+
route '/executions_per_sender'
143+
get :for_owner_per_sender
144+
end
135145
end
136146

137147
resource :repositories do

lib/travis/api/v3/services/executions/for_owner.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ def run!
1212
raise NotFound unless owner
1313
raise InsufficientAccess unless access_control.visible?(owner)
1414

15-
result query(:executions).for_owner(owner, access_control.user.id, params['page'], params['per_page'],
16-
params['from'], params['to'])
15+
result query(:executions).for_owner(owner, access_control.user.id, params['page'] || 0,
16+
params['per_page'] || 0, params['from'], params['to'])
1717
end
1818
end
1919
end
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
module Travis::API::V3
2+
class Services::Executions::ForOwnerPerRepo < Service
3+
params :from, :to
4+
result_type :executions_per_repo
5+
6+
def run!
7+
raise MethodNotAllowed if Travis.config.org?
8+
raise LoginRequired unless access_control.logged_in?
9+
10+
owner = query(:owner).find
11+
12+
raise NotFound unless owner
13+
raise InsufficientAccess unless access_control.visible?(owner)
14+
15+
results = query(:executions).for_owner(owner, access_control.user.id, 0, 0,
16+
params['from'], params['to'])
17+
result recuce_by_repo(results)
18+
end
19+
20+
def recuce_by_repo(results) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
21+
reduced = []
22+
results.each do |item|
23+
minutes_consumed = calculate_minutes(item.started_at, item.finished_at)
24+
obj = reduced.find { |one| one[:repository_id] == item.repository_id && one[:os] == item.os }
25+
if obj
26+
obj[:credits_consumed] += item.credits_consumed
27+
obj[:minutes_consumed] += minutes_consumed
28+
else
29+
repo = Travis::API::V3::Models::Repository.find(item.repository_id)
30+
reduced << {
31+
repository_id: item.repository_id,
32+
os: item.os,
33+
credits_consumed: item.credits_consumed,
34+
minutes_consumed: minutes_consumed,
35+
repository: Renderer.render_model(repo, mode: :standard)
36+
}
37+
end
38+
end
39+
reduced
40+
end
41+
42+
def calculate_minutes(start, finish)
43+
return 0 if start.to_s.empty? || finish.to_s.empty?
44+
45+
((Time.parse(finish.to_s) - Time.parse(start.to_s)) / 60.to_f).ceil
46+
end
47+
end
48+
end

0 commit comments

Comments
 (0)