travis-api/lib/travis/services/find_admin.rb
Aakriti Gupta 65f1a29d86 Move travis-core files from /vendor to /lib.
- Re-factor
- Remove code for notifications
- Remove addons
- Remove travis-core gem.
- Ignore logs directory only
- Move core tests to spec/lib
2016-07-20 11:22:25 +02:00

95 lines
2.7 KiB
Ruby

require 'faraday/error'
require 'travis/services/base'
# TODO extract github specific stuff to a separate service
module Travis
module Services
class FindAdmin < Base
extend Travis::Instrumentation
include Travis::Logging
register :find_admin
def run
if repository
admin = candidates.first
admin || raise_admin_missing
else
error "[github-admin] repository is nil: #{params.inspect}"
raise Travis::RepositoryMissing, "no repository given"
end
end
instrument :run
def repository
params[:repository]
end
private
def candidates
User.with_github_token.with_permissions(:repository_id => repository.id, :admin => true)
end
def validate(user)
Timeout.timeout(2) do
data = Github.authenticated(user) { repository_data }
if data['permissions'] && data['permissions']['admin']
user
else
info "[github-admin] #{user.login} no longer has admin access to #{repository.slug}"
update(user, data['permissions'])
false
end
end
rescue Timeout::Error => error
handle_error(user, error)
false
rescue GH::Error => error
handle_error(user, error)
false
end
def handle_error(user, error)
status = error.info[:response_status]
case status
when 401
error "[github-admin] token for #{user.login} no longer valid"
user.update_attributes!(:github_oauth_token => "")
when 404
info "[github-admin] #{user.login} no longer has any access to #{repository.slug}"
update(user, {})
else
error "[github-admin] error retrieving repository info for #{repository.slug} for #{user.login}: #{error.message}"
end
end
# TODO should this not be memoized?
def repository_data
data = GH["repos/#{repository.slug}"]
info "[github-admin] could not retrieve data for #{repository.slug}" unless data
data || { 'permissions' => {} }
end
def update(user, permissions)
user.update_attributes!(:permissions => permissions)
end
def raise_admin_missing
raise Travis::AdminMissing.new("no admin available for #{repository.slug}")
end
class Instrument < Notification::Instrument
def run_completed
publish(
msg: "for #{target.repository.slug}: #{result.login}",
result: result
)
end
end
Instrument.attach_to(self)
end
end
end