diff --git a/lib/travis/api/v3/permissions/build.rb b/lib/travis/api/v3/permissions/build.rb new file mode 100644 index 00000000..e1f4bfb0 --- /dev/null +++ b/lib/travis/api/v3/permissions/build.rb @@ -0,0 +1,13 @@ +require 'travis/api/v3/permissions/generic' + +module Travis::API::V3 + class Permissions::Build < Permissions::Generic + def cancel? + write? + end + + def restart? + write? + end + end +end diff --git a/lib/travis/api/v3/permissions/job.rb b/lib/travis/api/v3/permissions/job.rb new file mode 100644 index 00000000..3055257e --- /dev/null +++ b/lib/travis/api/v3/permissions/job.rb @@ -0,0 +1,13 @@ +require 'travis/api/v3/permissions/generic' + +module Travis::API::V3 + class Permissions::Job < Permissions::Generic + def cancel? + write? + end + + def restart? + write? + end + end +end diff --git a/lib/travis/api/v3/queries/build.rb b/lib/travis/api/v3/queries/build.rb index 1f97e7c7..8294a00a 100644 --- a/lib/travis/api/v3/queries/build.rb +++ b/lib/travis/api/v3/queries/build.rb @@ -6,5 +6,15 @@ module Travis::API::V3 return Models::Build.find_by_id(id) if id raise WrongParams, 'missing build.id'.freeze end + + def cancel + raise WrongParams, 'missing build.id'.freeze unless build.id + payload = { + build: { id: build.id } + } + + perform_async(:build_cancellation, type: 'api'.freeze, credentials: { token: token }, payload: JSON.dump(payload)) + payload + end end end diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index 811b153a..8d1d3584 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -18,7 +18,7 @@ module Travis::API::V3 route '/build/{build.id}' get :find - # post :cancel, '/cancel' + post :cancel, '/cancel' # post :restart, '/restart' end diff --git a/lib/travis/api/v3/services/build/cancel.rb b/lib/travis/api/v3/services/build/cancel.rb new file mode 100644 index 00000000..bf1ab19b --- /dev/null +++ b/lib/travis/api/v3/services/build/cancel.rb @@ -0,0 +1,13 @@ +module Travis::API::V3 + class Services::Build::Cancel < Service + + def run + raise LoginRequired unless access_control.logged_in? or access_control.full_access? + raise NotFound unless build = find(:build) + access_control.permissions(build).cancel! + + payload = query.cancel(build) + build + end + end +end diff --git a/spec/v3/services/build/find_spec.rb b/spec/v3/services/build/find_spec.rb index a088aa03..17f364e6 100644 --- a/spec/v3/services/build/find_spec.rb +++ b/spec/v3/services/build/find_spec.rb @@ -26,9 +26,13 @@ describe Travis::API::V3::Services::Build::Find do before { get("/v3/build/#{build.id}") } example { expect(last_response).to be_ok } example { expect(parsed_body).to be == { - "@type" => "build", - "@href" => "/v3/build/#{build.id}", - "@representation" => "standard", + "@type" => "build", + "@href" => "/v3/build/#{build.id}", + "@representation" => "standard", + "@permissions" => { + "read" => true, + "cancel" => false, + "restart" => false}, "id" => build.id, "number" => build.number, "state" => build.state, @@ -99,9 +103,13 @@ describe Travis::API::V3::Services::Build::Find do after { repo.update_attribute(:private, false) } example { expect(last_response).to be_ok } example { expect(parsed_body).to be == { - "@type" => "build", - "@href" => "/v3/build/#{build.id}", - "@representation" => "standard", + "@type" => "build", + "@href" => "/v3/build/#{build.id}", + "@representation" => "standard", + "@permissions" => { + "read" => true, + "cancel" => false, + "restart" => false}, "id" => build.id, "number" => build.number, "state" => build.state, diff --git a/spec/v3/services/builds/find_spec.rb b/spec/v3/services/builds/find_spec.rb index 114bd355..bd2ff907 100644 --- a/spec/v3/services/builds/find_spec.rb +++ b/spec/v3/services/builds/find_spec.rb @@ -52,6 +52,10 @@ describe Travis::API::V3::Services::Builds::Find do "@type" => "build", "@href" => "/v3/build/#{build.id}", "@representation" => "standard", + "@permissions" => { + "read" => true, + "cancel" => false, + "restart" => false }, "id" => build.id, "number" => "3", "state" => "configured", @@ -149,6 +153,10 @@ describe Travis::API::V3::Services::Builds::Find do "@type" => "build", "@href" => "/v3/build/#{build.id}", "@representation" => "standard", + "@permissions" => { + "read" => true, + "cancel" => false, + "restart" => false }, "id" => build.id, "number" => "3", "state" => "configured", diff --git a/spec/v3/services/job/find_spec.rb b/spec/v3/services/job/find_spec.rb index 476c44ad..56c1b5fe 100644 --- a/spec/v3/services/job/find_spec.rb +++ b/spec/v3/services/job/find_spec.rb @@ -20,6 +20,10 @@ describe Travis::API::V3::Services::Job::Find do "@type" => "job", "@href" => "/v3/job/#{job.id}", "@representation" => "standard", + "@permissions" => { + "read" => true, + "cancel" => false, + "restart" => false }, "id" => job.id, "number" => job.number, "state" => job.state, @@ -140,6 +144,10 @@ describe Travis::API::V3::Services::Job::Find do "@type" => "job", "@href" => "/v3/job/#{job.id}", "@representation" => "standard", + "@permissions" => { + "read" => true, + "cancel" => false, + "restart" => false }, "id" => job.id, "number" => job.number, "state" => job.state,