diff --git a/lib/travis/api/app/endpoint/builds.rb b/lib/travis/api/app/endpoint/builds.rb index 1efc0f90..e5766bb5 100644 --- a/lib/travis/api/app/endpoint/builds.rb +++ b/lib/travis/api/app/endpoint/builds.rb @@ -50,21 +50,29 @@ class Travis::Api::App post '/:id/restart' do Metriks.meter("api.request.restart_build").mark - service = self.service(:reset_model, build_id: params[:id]) - if !service.accept? - status 400 - result = false - else - if Travis::Features.owner_active?(:enqueue_to_hub, current_user) + if Travis::Features.owner_active?(:enqueue_to_hub, current_user) + service = Travis::Enqueue::Services::EnqueueBuild.new(current_user, params[:id]) + if !service.accept? + status 400 + result = false + else payload = {id: params[:id], user_id: current_user.id} - Travis::Enqueue::Services::EnqueueBuild.push("build:restart", payload) + service.push("build:restart", payload) + status 202 + result = true + end + else + service = self.service(:reset_model, build_id: params[:id]) + if !service.accept? + status 400 + result = false else Travis::Sidekiq::BuildRestart.perform_async(id: params[:id], user_id: current_user.id) + status 202 + result = true end - - status 202 - result = true end + respond_with(result: result, flash: service.messages) end end diff --git a/lib/travis/api/enqueue/services/enqueue_build.rb b/lib/travis/api/enqueue/services/enqueue_build.rb index 2601cb1b..8776a5e6 100644 --- a/lib/travis/api/enqueue/services/enqueue_build.rb +++ b/lib/travis/api/enqueue/services/enqueue_build.rb @@ -3,16 +3,47 @@ module Travis module Services class EnqueueBuild + attr_reader :current_user, :build - def self.push(event, payload) + def initialize(current_user, build_id) + @current_user = current_user + @build = Build.find(build_id) + end + + def push(event, payload) ::Sidekiq::Client.push( 'queue' => 'hub', 'class' => 'Travis::Hub::Sidekiq::Worker', 'args' => [event, payload] ) end - end + def accept? + current_user && permission? && resetable? + end + + def messages + messages = [] + messages << { notice: "The build was successfully restarted." } if accept? + messages << { error: 'You do not seem to have sufficient permissions.' } unless permission? + messages << { error: "This build currently can not be restarted." } unless resetable? + messages + end + + private + + def permission? + current_user.permission?(required_role, repository_id: build.repository_id) + end + + def resetable? + build.resetable? + end + + def required_role + Travis.config.roles.reset_model + end + end end end end diff --git a/spec/integration/v2/builds_spec.rb b/spec/integration/v2/builds_spec.rb index 4585d4ec..8db3a0b0 100644 --- a/spec/integration/v2/builds_spec.rb +++ b/spec/integration/v2/builds_spec.rb @@ -122,13 +122,13 @@ describe 'Builds' do before { Travis::Features.activate_owner(:enqueue_to_hub, repo.owner) } it 'restarts the build' do - Travis::Enqueue::Services::EnqueueBuild.expects(:push).with("build:restart", {id: build.id.to_s, user_id: user.id}) + ::Sidekiq::Client.expects(:push) response = post "/builds/#{build.id}/restart", {}, headers response.status.should == 202 end it 'sends the correct response body' do - Travis::Enqueue::Services::EnqueueBuild.expects(:push).with("build:restart", {id: build.id.to_s, user_id: user.id}) + ::Sidekiq::Client.expects(:push) response = post "/builds/#{build.id}/restart", {}, headers body = JSON.parse(response.body) body.should == {"result"=>true, "flash"=>[{"notice"=>"The build was successfully restarted."}]}