From 702b539ddffbeeeb4ea5b059356d55b8ab184e38 Mon Sep 17 00:00:00 2001 From: carlad Date: Wed, 2 Sep 2015 18:22:10 +0200 Subject: [PATCH 01/13] v3 put endpoints in routes.rb into alphabetical order --- lib/travis/api/v3/routes.rb | 55 +++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index cf0a3731..ed5e7d27 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -8,12 +8,40 @@ module Travis::API::V3 get :for_current_user end + resource :build do + capture id: :digit + route '/build/{build.id}' + get :find + end + + resource :job do + capture id: :digit + route '/job/{job.id}' + get :find + end + + resource :organization do + capture id: :digit + route '/org/{organization.id}' + get :find + end + + resource :organizations do + route '/orgs' + get :for_current_user + end + resource :owner do route '/owner/({owner.login}|{user.login}|{organization.login})' get :find get :repositories, '/repos' end + resource :repositories do + route '/repos' + get :for_current_user + end + resource :repository do capture id: :digit, slug: %r{[^/]+%2[fF][^/]+} route '/repo/({repository.id}|{repository.slug})' @@ -39,23 +67,6 @@ module Travis::API::V3 end end - resource :repositories do - route '/repos' - get :for_current_user - end - - resource :build do - capture id: :digit - route '/build/{build.id}' - get :find - end - - resource :job do - capture id: :digit - route '/job/{job.id}' - get :find - end - resource :user do capture id: :digit route '/user' @@ -63,15 +74,5 @@ module Travis::API::V3 get :find, '/{user.id}' end - resource :organization do - capture id: :digit - route '/org/{organization.id}' - get :find - end - - resource :organizations do - route '/orgs' - get :for_current_user - end end end From beaa4b7e1737d1e65f776024778e9eb61daa10dc Mon Sep 17 00:00:00 2001 From: carlad Date: Mon, 7 Sep 2015 17:07:09 +0200 Subject: [PATCH 02/13] add branches endpoint --- lib/travis/api/v3/routes.rb | 19 ++++++++++++------- lib/travis/api/v3/services/requests/find.rb | 1 + 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index ed5e7d27..926d6776 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -50,10 +50,14 @@ module Travis::API::V3 post :enable, '/enable' post :disable, '/disable' - resource :requests do - route '/requests' - get :find - post :create + resource :branch do + route '/branch/{branch.name}' + get :find + end + + resource :branches do + route '/branches' + get :find end resource :builds do @@ -61,9 +65,10 @@ module Travis::API::V3 get :find end - resource :branch do - route '/branch/{branch.name}' - get :find + resource :requests do + route '/requests' + get :find + post :create end end diff --git a/lib/travis/api/v3/services/requests/find.rb b/lib/travis/api/v3/services/requests/find.rb index 653f12a1..56fa68f3 100644 --- a/lib/travis/api/v3/services/requests/find.rb +++ b/lib/travis/api/v3/services/requests/find.rb @@ -1,5 +1,6 @@ module Travis::API::V3 class Services::Requests::Find < Service + paginate def run! query.find(find(:repository)) end From f44b374d791d769abff3fab98a77b807224ed971 Mon Sep 17 00:00:00 2001 From: carlad Date: Mon, 7 Sep 2015 17:09:05 +0200 Subject: [PATCH 03/13] v3 add branches endpoint --- lib/travis/api/v3/queries/branches.rb | 7 +++++++ lib/travis/api/v3/renderer/branches.rb | 6 ++++++ lib/travis/api/v3/routes.rb | 3 +++ lib/travis/api/v3/services.rb | 1 + lib/travis/api/v3/services/branches/find.rb | 9 +++++++++ 5 files changed, 26 insertions(+) create mode 100644 lib/travis/api/v3/queries/branches.rb create mode 100644 lib/travis/api/v3/renderer/branches.rb create mode 100644 lib/travis/api/v3/services/branches/find.rb diff --git a/lib/travis/api/v3/queries/branches.rb b/lib/travis/api/v3/queries/branches.rb new file mode 100644 index 00000000..0491e0b2 --- /dev/null +++ b/lib/travis/api/v3/queries/branches.rb @@ -0,0 +1,7 @@ +module Travis::API::V3 + class Queries::Branches < Query + def find(repository) + repository.branches + end + end +end diff --git a/lib/travis/api/v3/renderer/branches.rb b/lib/travis/api/v3/renderer/branches.rb new file mode 100644 index 00000000..4a927c23 --- /dev/null +++ b/lib/travis/api/v3/renderer/branches.rb @@ -0,0 +1,6 @@ +module Travis::API::V3 + class Renderer::Branches < Renderer::CollectionRenderer + type :branches + collection_key :branches + end +end diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index 926d6776..c2337f56 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -12,6 +12,9 @@ module Travis::API::V3 capture id: :digit route '/build/{build.id}' get :find + + # post :cancel, '/cancel' + # post :restart, '/restart' end resource :job do diff --git a/lib/travis/api/v3/services.rb b/lib/travis/api/v3/services.rb index a25984f1..5098e10f 100644 --- a/lib/travis/api/v3/services.rb +++ b/lib/travis/api/v3/services.rb @@ -4,6 +4,7 @@ module Travis::API::V3 Accounts = Module.new { extend Services } Branch = Module.new { extend Services } + Branch = Module.new { extend Services } Build = Module.new { extend Services } Builds = Module.new { extend Services } Job = Module.new { extend Services } diff --git a/lib/travis/api/v3/services/branches/find.rb b/lib/travis/api/v3/services/branches/find.rb new file mode 100644 index 00000000..76e22c31 --- /dev/null +++ b/lib/travis/api/v3/services/branches/find.rb @@ -0,0 +1,9 @@ +module Travis::API::V3 + class Services::Branches::Find < Service + paginate + def run! + query.find(find(:repository)) + end + end + +end From 2e72233213105c84947d6ddcf3d80ada58d13224 Mon Sep 17 00:00:00 2001 From: carlad Date: Mon, 7 Sep 2015 17:10:03 +0200 Subject: [PATCH 04/13] v3 fix services --- lib/travis/api/v3/services.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/travis/api/v3/services.rb b/lib/travis/api/v3/services.rb index 5098e10f..06b235e5 100644 --- a/lib/travis/api/v3/services.rb +++ b/lib/travis/api/v3/services.rb @@ -4,7 +4,7 @@ module Travis::API::V3 Accounts = Module.new { extend Services } Branch = Module.new { extend Services } - Branch = Module.new { extend Services } + Branches = Module.new { extend Services } Build = Module.new { extend Services } Builds = Module.new { extend Services } Job = Module.new { extend Services } From 2c5ad649f5f56070f64a18a3ee3e36484ee4532d Mon Sep 17 00:00:00 2001 From: carlad Date: Tue, 8 Sep 2015 16:26:43 +0200 Subject: [PATCH 05/13] v3 add :exists_on_github to standard branch representation --- lib/travis/api/v3/renderer/branch.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/travis/api/v3/renderer/branch.rb b/lib/travis/api/v3/renderer/branch.rb index 80445497..25374604 100644 --- a/lib/travis/api/v3/renderer/branch.rb +++ b/lib/travis/api/v3/renderer/branch.rb @@ -3,6 +3,6 @@ require 'travis/api/v3/renderer/model_renderer' module Travis::API::V3 class Renderer::Branch < Renderer::ModelRenderer representation(:minimal, :name, :last_build) - representation(:standard, :name, :repository, :last_build) + representation(:standard, :name, :repository, :last_build, :exists_on_github) end end From 864533830623e8b6d74230c620a494245f3a8dc3 Mon Sep 17 00:00:00 2001 From: carlad Date: Tue, 8 Sep 2015 16:36:40 +0200 Subject: [PATCH 06/13] update build/find_spec to include :exists_on_github --- spec/v3/services/branch/find_spec.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spec/v3/services/branch/find_spec.rb b/spec/v3/services/branch/find_spec.rb index 5fb56102..5779df2d 100644 --- a/spec/v3/services/branch/find_spec.rb +++ b/spec/v3/services/branch/find_spec.rb @@ -48,7 +48,8 @@ describe Travis::API::V3::Services::Repository::Find do {"@type" => "job", "@href" => "/v3/job/#{jobs[3].id}", "@representation"=>"minimal", - "id" =>jobs[3].id}]} + "id" =>jobs[3].id}]}, + "exists_on_github"=> true }} end end From 0705a61808a658daeb9e9d0f5aa71c8a8de12918 Mon Sep 17 00:00:00 2001 From: carlad Date: Tue, 8 Sep 2015 17:08:08 +0200 Subject: [PATCH 07/13] v3 update service_index_spec for requests pagination --- spec/v3/service_index_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/v3/service_index_spec.rb b/spec/v3/service_index_spec.rb index 855c0861..1d430b6e 100644 --- a/spec/v3/service_index_spec.rb +++ b/spec/v3/service_index_spec.rb @@ -16,7 +16,7 @@ describe Travis::API::V3::ServiceIndex do describe "find action" do let(:action) { resource.fetch("actions").fetch("find") } - specify { expect(action).to include("@type"=>"template", "request_method"=>"GET", "uri_template"=>"#{path}repo/{repository.id}/requests{?include}") } + specify { expect(action).to include("@type"=>"template", "request_method"=>"GET", "uri_template"=>"#{path}repo/{repository.id}/requests{?include,limit,offset}") } end describe "create action" do From fba1d65e769d936aa58b2c11a794ff3a8c188a68 Mon Sep 17 00:00:00 2001 From: carlad Date: Tue, 8 Sep 2015 17:57:43 +0200 Subject: [PATCH 08/13] v3 add branches/find spec, update builds spec to use v3 models --- spec/v3/services/branches/find_spec.rb | 170 +++++++++++++++++++++++++ spec/v3/services/builds/find_spec.rb | 4 +- 2 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 spec/v3/services/branches/find_spec.rb diff --git a/spec/v3/services/branches/find_spec.rb b/spec/v3/services/branches/find_spec.rb new file mode 100644 index 00000000..8b261c47 --- /dev/null +++ b/spec/v3/services/branches/find_spec.rb @@ -0,0 +1,170 @@ +require 'spec_helper' + +describe Travis::API::V3::Services::Branches::Find do + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + let(:branch) { Travis::API::V3::Models::Branch.where(repository_id: repo.id).first } + let(:build) { branch.last_build } + let(:jobs) { Travis::API::V3::Models::Build.find(build.id).jobs } + let(:parsed_body) { JSON.load(body) } + + describe "fetching branches on a public repository by slug" do + before { get("/v3/repo/svenfuchs%2Fminimal/branches") } + example { expect(last_response).to be_ok } + end + + describe "fetching branches on a non-existing repository by slug" do + before { get("/v3/repo/svenfuchs%2Fminimal1/branches") } + example { expect(last_response).to be_not_found } + example { expect(parsed_body).to be == { + "@type" => "error", + "error_type" => "not_found", + "error_message" => "repository not found (or insufficient access)", + "resource_type" => "repository" + }} + end + + describe "builds on public repository" do + before { get("/v3/repo/#{repo.id}/branches?limit=1") } + example { expect(last_response).to be_ok } + example { expect(parsed_body).to be == { + "@type" => "branches", + "@href" => "/v3/repo/#{repo.id}/branches?limit=1", + "@representation" => "standard", + "@pagination" => { + "limit" => 1, + "offset" => 0, + "count" => 1, + "is_first" => true, + "is_last" => true, + "next" => nil, + "prev" => nil, + "first" => { + "@href" => "/v3/repo/#{repo.id}/branches?limit=1", + "offset" => 0, + "limit" => 1 }, + "last" => { + "@href" => "/v3/repo/#{repo.id}/branches?limit=1", + "offset" => 0, + "limit" => 1 }}, + "branches" => [{ + "@type" => "branch", + "@href" => "/v3/repo/#{repo.id}/branch/#{branch.name}", + "@representation" => "standard", + "name" => branch.name, + "repository" => { + "@type" => "repository", + "@href" => "/v3/repo/#{repo.id}", + "@representation"=> "minimal", + "id" => repo.id, + "slug" => "svenfuchs/minimal" }, + "last_build" => { + "@type" => "build", + "@href" => "/v3/build/#{build.id}", + "@representation"=> "minimal", + "id" => build.id, + "number" => build.number, + "state" => build.state, + "duration" => nil, + "event_type" => "push", + "previous_state" => "passed", + "started_at" => "2010-11-12T13:00:00Z", + "finished_at" => nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=> "minimal", + "id" => jobs[0].id }, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=>"minimal", + "id" => jobs[1].id }, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=>"minimal", + "id" => jobs[2].id }, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=>"minimal", + "id" => jobs[3].id }]}, + "exists_on_github" => true }]} + } + end + + describe "branches private repository, private API, authenticated as user with access" do + let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } + let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, pull: true) } + before { repo.update_attribute(:private, true) } + before { get("/v3/repo/#{repo.id}/branches?limit=1", {}, headers) } + after { repo.update_attribute(:private, false) } + example { expect(last_response).to be_ok } + example { expect(parsed_body).to be == { + "@type" => "branches", + "@href" => "/v3/repo/#{repo.id}/branches?limit=1", + "@representation" => "standard", + "@pagination" => { + "limit" => 1, + "offset" => 0, + "count" => 1, + "is_first" => true, + "is_last" => true, + "next" => nil, + "prev" => nil, + "first" => { + "@href" => "/v3/repo/#{repo.id}/branches?limit=1", + "offset" => 0, + "limit" => 1 }, + "last" => { + "@href" => "/v3/repo/#{repo.id}/branches?limit=1", + "offset" => 0, + "limit" => 1 }}, + "branches" => [{ + "@type" => "branch", + "@href" => "/v3/repo/#{repo.id}/branch/#{branch.name}", + "@representation" => "standard", + "name" => branch.name, + "repository" => { + "@type" => "repository", + "@href" => "/v3/repo/#{repo.id}", + "@representation"=> "minimal", + "id" => repo.id, + "slug" => "svenfuchs/minimal" }, + "last_build" => { + "@type" => "build", + "@href" => "/v3/build/#{build.id}", + "@representation"=> "minimal", + "id" => build.id, + "number" => build.number, + "state" => build.state, + "duration" => nil, + "event_type" => "push", + "previous_state" => "passed", + "started_at" => "2010-11-12T13:00:00Z", + "finished_at" => nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{jobs[0].id}", + "@representation"=> "minimal", + "id" => jobs[0].id }, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[1].id}", + "@representation"=>"minimal", + "id" => jobs[1].id }, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[2].id}", + "@representation"=>"minimal", + "id" => jobs[2].id }, + { + "@type" => "job", + "@href" => "/v3/job/#{jobs[3].id}", + "@representation"=>"minimal", + "id" => jobs[3].id }]}, + "exists_on_github" => true }]} + } + end +end diff --git a/spec/v3/services/builds/find_spec.rb b/spec/v3/services/builds/find_spec.rb index 65801147..c0dcf635 100644 --- a/spec/v3/services/builds/find_spec.rb +++ b/spec/v3/services/builds/find_spec.rb @@ -1,8 +1,8 @@ require 'spec_helper' describe Travis::API::V3::Services::Builds::Find do - let(:repo) { Repository.by_slug('svenfuchs/minimal').first } - let(:build) { repo.builds.last } + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + let(:build) { repo.builds.first } let(:jobs) { Travis::API::V3::Models::Build.find(build.id).jobs } let(:parsed_body) { JSON.load(body) } From bd61d1e58e6b90e3bb9abd2c04be530fb1cc774d Mon Sep 17 00:00:00 2001 From: carlad Date: Thu, 10 Sep 2015 15:08:41 +0200 Subject: [PATCH 09/13] add broadcasts - initial work --- lib/travis/api/v3/queries/broadcasts.rb | 11 +++++++++++ lib/travis/api/v3/renderer/broadcast.rb | 8 ++++++++ lib/travis/api/v3/renderer/broadcasts.rb | 6 ++++++ lib/travis/api/v3/routes.rb | 10 ++++++++++ lib/travis/api/v3/services.rb | 4 +++- lib/travis/api/v3/services/branches/find.rb | 1 - .../api/v3/services/broadcasts/for_current_repo.rb | 7 +++++++ .../api/v3/services/broadcasts/for_current_user.rb | 7 +++++++ 8 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 lib/travis/api/v3/queries/broadcasts.rb create mode 100644 lib/travis/api/v3/renderer/broadcast.rb create mode 100644 lib/travis/api/v3/renderer/broadcasts.rb create mode 100644 lib/travis/api/v3/services/broadcasts/for_current_repo.rb create mode 100644 lib/travis/api/v3/services/broadcasts/for_current_user.rb diff --git a/lib/travis/api/v3/queries/broadcasts.rb b/lib/travis/api/v3/queries/broadcasts.rb new file mode 100644 index 00000000..229e89c9 --- /dev/null +++ b/lib/travis/api/v3/queries/broadcasts.rb @@ -0,0 +1,11 @@ +module Travis::API::V3 + class Queries::Broadcasts < Query + def for_repo(repository) + Models::Broadcast.where(recipient_id: repository.id) + end + + def for_user(user) + Models::Broadcast.where(recipient_id: user.id) + end + end +end diff --git a/lib/travis/api/v3/renderer/broadcast.rb b/lib/travis/api/v3/renderer/broadcast.rb new file mode 100644 index 00000000..90b42776 --- /dev/null +++ b/lib/travis/api/v3/renderer/broadcast.rb @@ -0,0 +1,8 @@ +require 'travis/api/v3/renderer/model_renderer' + +module Travis::API::V3 + class Renderer::Broadcast < Renderer::ModelRenderer + representation(:minimal, :id, :recipient_id, :message, :created_at) + representation(:standard, :id, :recipient_id, :recipient_type, :kind, :message, :expired, :created_at, :updated_at) + end +end diff --git a/lib/travis/api/v3/renderer/broadcasts.rb b/lib/travis/api/v3/renderer/broadcasts.rb new file mode 100644 index 00000000..5ff114b1 --- /dev/null +++ b/lib/travis/api/v3/renderer/broadcasts.rb @@ -0,0 +1,6 @@ +module Travis::API::V3 + class Renderer::Broadcasts < Renderer::CollectionRenderer + type :broadcasts + collection_key :broadcasts + end +end diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index c2337f56..19b705e8 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -63,6 +63,11 @@ module Travis::API::V3 get :find end + resource :broadcasts do + route '/broadcasts' + get :for_current_repo + end + resource :builds do route '/builds' get :find @@ -80,6 +85,11 @@ module Travis::API::V3 route '/user' get :current get :find, '/{user.id}' + + resource :broadcasts do + route '/broadcasts' + get :for_current_user + end end end diff --git a/lib/travis/api/v3/services.rb b/lib/travis/api/v3/services.rb index 06b235e5..c43d482f 100644 --- a/lib/travis/api/v3/services.rb +++ b/lib/travis/api/v3/services.rb @@ -5,6 +5,8 @@ module Travis::API::V3 Accounts = Module.new { extend Services } Branch = Module.new { extend Services } Branches = Module.new { extend Services } + Broadcast = Module.new { extend Services } + Broadcasts = Module.new { extend Services } Build = Module.new { extend Services } Builds = Module.new { extend Services } Job = Module.new { extend Services } @@ -17,7 +19,7 @@ module Travis::API::V3 User = Module.new { extend Services } def result_type - @resul_type ||= name[/[^:]+$/].underscore.to_sym + @result_type ||= name[/[^:]+$/].underscore.to_sym end end end diff --git a/lib/travis/api/v3/services/branches/find.rb b/lib/travis/api/v3/services/branches/find.rb index 76e22c31..00779a0f 100644 --- a/lib/travis/api/v3/services/branches/find.rb +++ b/lib/travis/api/v3/services/branches/find.rb @@ -5,5 +5,4 @@ module Travis::API::V3 query.find(find(:repository)) end end - end diff --git a/lib/travis/api/v3/services/broadcasts/for_current_repo.rb b/lib/travis/api/v3/services/broadcasts/for_current_repo.rb new file mode 100644 index 00000000..52d8df7f --- /dev/null +++ b/lib/travis/api/v3/services/broadcasts/for_current_repo.rb @@ -0,0 +1,7 @@ +module Travis::API::V3 + class Services::Broadcasts::ForCurrentRepo < Service + def run! + query.for_repo(find(:repository)) + end + end +end diff --git a/lib/travis/api/v3/services/broadcasts/for_current_user.rb b/lib/travis/api/v3/services/broadcasts/for_current_user.rb new file mode 100644 index 00000000..980b7c62 --- /dev/null +++ b/lib/travis/api/v3/services/broadcasts/for_current_user.rb @@ -0,0 +1,7 @@ +module Travis::API::V3 + class Services::Broadcasts::ForCurrentUser < Service + def run! + query.for_user(find(:user)) + end + end +end From 1640c3351701ea0a849701a5a3095f2307909a9e Mon Sep 17 00:00:00 2001 From: carlad Date: Thu, 10 Sep 2015 17:36:13 +0200 Subject: [PATCH 10/13] fix incorrect broadcast endpoints - add correct broadcasts endpoint --- lib/travis/api/v3/queries/broadcasts.rb | 12 +++--- lib/travis/api/v3/routes.rb | 15 +++---- .../services/broadcasts/for_current_repo.rb | 7 ---- .../services/broadcasts/for_current_user.rb | 3 +- .../broadcasts/for_current_user_spec.rb | 41 +++++++++++++++++++ 5 files changed, 55 insertions(+), 23 deletions(-) delete mode 100644 lib/travis/api/v3/services/broadcasts/for_current_repo.rb create mode 100644 spec/v3/services/broadcasts/for_current_user_spec.rb diff --git a/lib/travis/api/v3/queries/broadcasts.rb b/lib/travis/api/v3/queries/broadcasts.rb index 229e89c9..04cac2ba 100644 --- a/lib/travis/api/v3/queries/broadcasts.rb +++ b/lib/travis/api/v3/queries/broadcasts.rb @@ -1,11 +1,13 @@ module Travis::API::V3 class Queries::Broadcasts < Query - def for_repo(repository) - Models::Broadcast.where(recipient_id: repository.id) - end - def for_user(user) - Models::Broadcast.where(recipient_id: user.id) + query = %( + recipient_type IS NULL OR + recipient_type = ? AND recipient_id IN(?) OR + recipient_type = ? AND recipient_id = ? OR + recipient_type = ? AND recipient_id IN (?) + ) + Models::Broadcast.where(query, 'Organization', user.organization_ids, 'User', user.id, 'Repository', user.repository_ids) end end end diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index 19b705e8..811b153a 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -8,6 +8,11 @@ module Travis::API::V3 get :for_current_user end + resource :broadcasts do + route '/broadcasts' + get :for_current_user + end + resource :build do capture id: :digit route '/build/{build.id}' @@ -63,11 +68,6 @@ module Travis::API::V3 get :find end - resource :broadcasts do - route '/broadcasts' - get :for_current_repo - end - resource :builds do route '/builds' get :find @@ -85,11 +85,6 @@ module Travis::API::V3 route '/user' get :current get :find, '/{user.id}' - - resource :broadcasts do - route '/broadcasts' - get :for_current_user - end end end diff --git a/lib/travis/api/v3/services/broadcasts/for_current_repo.rb b/lib/travis/api/v3/services/broadcasts/for_current_repo.rb deleted file mode 100644 index 52d8df7f..00000000 --- a/lib/travis/api/v3/services/broadcasts/for_current_repo.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Travis::API::V3 - class Services::Broadcasts::ForCurrentRepo < Service - def run! - query.for_repo(find(:repository)) - end - end -end diff --git a/lib/travis/api/v3/services/broadcasts/for_current_user.rb b/lib/travis/api/v3/services/broadcasts/for_current_user.rb index 980b7c62..0393fb98 100644 --- a/lib/travis/api/v3/services/broadcasts/for_current_user.rb +++ b/lib/travis/api/v3/services/broadcasts/for_current_user.rb @@ -1,7 +1,8 @@ module Travis::API::V3 class Services::Broadcasts::ForCurrentUser < Service def run! - query.for_user(find(:user)) + raise LoginRequired unless access_control.logged_in? + query.for_user(access_control.user) end end end diff --git a/spec/v3/services/broadcasts/for_current_user_spec.rb b/spec/v3/services/broadcasts/for_current_user_spec.rb new file mode 100644 index 00000000..59a6743e --- /dev/null +++ b/spec/v3/services/broadcasts/for_current_user_spec.rb @@ -0,0 +1,41 @@ +require 'spec_helper' + +describe Travis::API::V3::Services::Broadcasts::ForCurrentUser do + let(:user) { Travis::API::V3::Models::User.where(login: 'svenfuchs').first } + let(:broadcast) { Travis::API::V3::Models::Broadcast.where(recipient_id: user.id) } + + let(:token) { Travis::Api::App::AccessToken.create(user: user, app_id: 1) } + let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} + before { Travis::API::V3::Models::Permission.create(user: user, pull: true) } + # before { Travis::API::V3::Models::Broadcast.create(recipient_id: repo.id, recipient_type: "Organization", message: "This is a test!") } + # before { repo.update_attribute(:private, true) } + # after { repo.update_attribute(:private, false) } + + # let(:org) { Travis::API::V3::Models::Organization.new(login: 'example-org') } + # before { org.save! } + # before { org.memberships.create(user: user.login) } + # after { org.delete } + + describe "authenticated as user with access" do + before { get("/v3/broadcasts", {}, headers) } + example { expect(last_response).to be_ok } + example { expect(JSON.load(body)).to be == { + "@type" => "broadcasts", + "@href" => "/v3/broadcasts", + "@representation" => "standard", + "broadcasts" => [{ + "@type" => "broadcast", + "@representation" => "standard", + "@permissions" => { "read"=>true, "sync"=>true }, + "id" => broadcasts[0].id, + "recipient_id" => broadcasts[0].recipient_id, + "recipient_type" => broadcasts[0].recipient_type, + "kind" => broadcast[0].kind, + "message" => broadcast[0].message, + "expired" => nil, + "created_at" => "2015-09-10T11:05:21Z", + "updated_at" => "2015-09-10T11:05:21Z" + }] + }} + end +end From 28c6e04eb8fa3dfce51a0b78805005f9a45a2f5b Mon Sep 17 00:00:00 2001 From: carlad Date: Fri, 11 Sep 2015 11:10:36 +0200 Subject: [PATCH 11/13] put jobs service back in --- lib/travis/api/v3/services.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/travis/api/v3/services.rb b/lib/travis/api/v3/services.rb index c43d482f..ffb67158 100644 --- a/lib/travis/api/v3/services.rb +++ b/lib/travis/api/v3/services.rb @@ -10,6 +10,7 @@ module Travis::API::V3 Build = Module.new { extend Services } Builds = Module.new { extend Services } Job = Module.new { extend Services } + Jobs = Module.new { extend Services } Organization = Module.new { extend Services } Organizations = Module.new { extend Services } Owner = Module.new { extend Services } From 907591e001f09beb33579705fb05c474bc7e078f Mon Sep 17 00:00:00 2001 From: carlad Date: Fri, 11 Sep 2015 16:49:53 +0200 Subject: [PATCH 12/13] add spec for broadcasts --- .../broadcasts/for_current_user_spec.rb | 92 +++++++++++++------ 1 file changed, 65 insertions(+), 27 deletions(-) diff --git a/spec/v3/services/broadcasts/for_current_user_spec.rb b/spec/v3/services/broadcasts/for_current_user_spec.rb index 59a6743e..78f1bdd6 100644 --- a/spec/v3/services/broadcasts/for_current_user_spec.rb +++ b/spec/v3/services/broadcasts/for_current_user_spec.rb @@ -1,41 +1,79 @@ require 'spec_helper' describe Travis::API::V3::Services::Broadcasts::ForCurrentUser do - let(:user) { Travis::API::V3::Models::User.where(login: 'svenfuchs').first } - let(:broadcast) { Travis::API::V3::Models::Broadcast.where(recipient_id: user.id) } + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + # let(:user) { Travis::API::V3::Models::User.where(login: 'svenfuchs') } - let(:token) { Travis::Api::App::AccessToken.create(user: user, app_id: 1) } + let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} - before { Travis::API::V3::Models::Permission.create(user: user, pull: true) } - # before { Travis::API::V3::Models::Broadcast.create(recipient_id: repo.id, recipient_type: "Organization", message: "This is a test!") } - # before { repo.update_attribute(:private, true) } - # after { repo.update_attribute(:private, false) } - # let(:org) { Travis::API::V3::Models::Organization.new(login: 'example-org') } - # before { org.save! } - # before { org.memberships.create(user: user.login) } - # after { org.delete } + before { Travis::API::V3::Models::Permission.create(user: repo.owner, pull: true) } + before { repo.update_attribute(:private, true) } + after { repo.update_attribute(:private, false) } + + let(:org) { Travis::API::V3::Models::Organization.new(login: 'example-org') } + before { org.save! } + before { org.memberships.create(user: repo.owner) } + after { org.delete } + + before { Travis::API::V3::Models::Broadcast.create(recipient_id: repo.id, recipient_type: "Repository", message: "Repository broadcast!", created_at: "2010-11-12T13:00:00Z", updated_at: "2010-11-12T13:00:00Z") } + before { Travis::API::V3::Models::Broadcast.create(recipient_id: org.id, recipient_type: "Organization", message: "Organization broadcast!", created_at: "2010-11-12T13:00:00Z", updated_at: "2010-11-12T13:00:00Z") } + before { Travis::API::V3::Models::Broadcast.create(recipient_id: repo.owner_id, recipient_type: "User", message: "User broadcast!", created_at: "2010-11-12T13:00:00Z", updated_at: "2010-11-12T13:00:00Z") } + before { Travis::API::V3::Models::Broadcast.create(recipient_id: nil, recipient_type: nil, message: "Global broadcast!", created_at: "2010-11-12T13:00:00Z", updated_at: "2010-11-12T13:00:00Z") } + let(:broadcasts){ Travis::API::V3::Models::Broadcast.where(recipient_id: [repo.id, org.id, repo.owner_id, nil]) } + describe "authenticated as user with access" do before { get("/v3/broadcasts", {}, headers) } example { expect(last_response).to be_ok } example { expect(JSON.load(body)).to be == { - "@type" => "broadcasts", - "@href" => "/v3/broadcasts", - "@representation" => "standard", - "broadcasts" => [{ - "@type" => "broadcast", - "@representation" => "standard", - "@permissions" => { "read"=>true, "sync"=>true }, - "id" => broadcasts[0].id, - "recipient_id" => broadcasts[0].recipient_id, - "recipient_type" => broadcasts[0].recipient_type, - "kind" => broadcast[0].kind, - "message" => broadcast[0].message, - "expired" => nil, - "created_at" => "2015-09-10T11:05:21Z", - "updated_at" => "2015-09-10T11:05:21Z" - }] + "@type" => "broadcasts", + "@href" => "/v3/broadcasts", + "@representation" => "standard", + "broadcasts" => [{ + "@type" => "broadcast", + "@representation"=>"standard", + "id" => broadcasts[0].id, + "recipient_id" => broadcasts[0].recipient_id, + "recipient_type" => broadcasts[0].recipient_type, + "kind" => nil, + "message" => broadcasts[0].message, + "expired" => nil, + "created_at" => "2010-11-12T13:00:00Z", + "updated_at" => "2010-11-12T13:00:00Z" }, + { + "@type" => "broadcast", + "@representation"=> "standard", + "id" => broadcasts[1].id, + "recipient_id" => broadcasts[1].recipient_id, + "recipient_type" => broadcasts[1].recipient_type, + "kind" => nil, + "message" => broadcasts[1].message, + "expired" => nil, + "created_at" => "2010-11-12T13:00:00Z", + "updated_at" => "2010-11-12T13:00:00Z"}, + { + "@type" => "broadcast", + "@representation"=> "standard", + "id" => broadcasts[2].id, + "recipient_id" => broadcasts[2].recipient_id, + "recipient_type" => broadcasts[2].recipient_type, + "kind" => nil, + "message" => broadcasts[2].message, + "expired" => nil, + "created_at" => "2010-11-12T13:00:00Z", + "updated_at" => "2010-11-12T13:00:00Z"}, + { + "@type" => "broadcast", + "@representation"=> "standard", + "id" => broadcasts[3].id, + "recipient_id" => broadcasts[3].recipient_id, + "recipient_type" => broadcasts[3].recipient_type, + "kind" => nil, + "message" => broadcasts[3].message, + "expired" => nil, + "created_at" => "2010-11-12T13:00:00Z", + "updated_at" => "2010-11-12T13:00:00Z"}] }} end end From dc7ced1c7fe3f64013cfda40886ec47cdf3e642c Mon Sep 17 00:00:00 2001 From: carlad Date: Mon, 14 Sep 2015 18:43:26 +0200 Subject: [PATCH 13/13] v3 add :default_branch to minimal representation for repository, update specs --- lib/travis/api/v3/renderer/repository.rb | 2 +- spec/v3/services/branch/find_spec.rb | 4 +- spec/v3/services/branches/find_spec.rb | 8 ++- spec/v3/services/build/find_spec.rb | 18 +++++- spec/v3/services/builds/find_spec.rb | 18 +++++- spec/v3/services/job/find_spec.rb | 80 +++++++++++++++++++++++- spec/v3/services/requests/create_spec.rb | 76 +++++++++++----------- 7 files changed, 156 insertions(+), 50 deletions(-) diff --git a/lib/travis/api/v3/renderer/repository.rb b/lib/travis/api/v3/renderer/repository.rb index 72f3d487..2bb4a75a 100644 --- a/lib/travis/api/v3/renderer/repository.rb +++ b/lib/travis/api/v3/renderer/repository.rb @@ -2,7 +2,7 @@ require 'travis/api/v3/renderer/model_renderer' module Travis::API::V3 class Renderer::Repository < Renderer::ModelRenderer - representation(:minimal, :id, :slug) + representation(:minimal, :id, :slug, :default_branch) representation(:standard, :id, :name, :slug, :description, :github_language, :active, :private, :owner, :last_build, :default_branch) def active diff --git a/spec/v3/services/branch/find_spec.rb b/spec/v3/services/branch/find_spec.rb index 5779df2d..de54c01d 100644 --- a/spec/v3/services/branch/find_spec.rb +++ b/spec/v3/services/branch/find_spec.rb @@ -19,7 +19,9 @@ describe Travis::API::V3::Services::Repository::Find do "@href" => "/v3/repo/#{repo.id}", "@representation"=> "minimal", "id" => repo.id, - "slug" => "svenfuchs/minimal"}, + "slug" => "svenfuchs/minimal", + "default_branch" => { + "@href" => "/v3/repo/#{repo.id}/branch/master"}}, "last_build" => { "@type" => "build", "@href" => "/v3/build/#{repo.default_branch.last_build.id}", diff --git a/spec/v3/services/branches/find_spec.rb b/spec/v3/services/branches/find_spec.rb index 8b261c47..8b9304f4 100644 --- a/spec/v3/services/branches/find_spec.rb +++ b/spec/v3/services/branches/find_spec.rb @@ -56,7 +56,9 @@ describe Travis::API::V3::Services::Branches::Find do "@href" => "/v3/repo/#{repo.id}", "@representation"=> "minimal", "id" => repo.id, - "slug" => "svenfuchs/minimal" }, + "slug" => "svenfuchs/minimal", + "default_branch" => { + "@href" =>"/v3/repo/#{repo.id}/branch/master"}}, "last_build" => { "@type" => "build", "@href" => "/v3/build/#{build.id}", @@ -131,7 +133,9 @@ describe Travis::API::V3::Services::Branches::Find do "@href" => "/v3/repo/#{repo.id}", "@representation"=> "minimal", "id" => repo.id, - "slug" => "svenfuchs/minimal" }, + "slug" => "svenfuchs/minimal", + "default_branch" => { + "@href" =>"/v3/repo/#{repo.id}/branch/master"}}, "last_build" => { "@type" => "build", "@href" => "/v3/build/#{build.id}", diff --git a/spec/v3/services/build/find_spec.rb b/spec/v3/services/build/find_spec.rb index 05ffd26f..a088aa03 100644 --- a/spec/v3/services/build/find_spec.rb +++ b/spec/v3/services/build/find_spec.rb @@ -63,7 +63,14 @@ describe Travis::API::V3::Services::Build::Find do "@href" => "/v3/repo/#{repo.id}", "@representation"=> "minimal", "id" => repo.id, - "slug" => "svenfuchs/minimal" }, + "slug" => "svenfuchs/minimal", + "default_branch" => { + "@type" => "branch", + "@href" =>"/v3/repo/#{repo.id}/branch/master", + "@representation"=>"minimal", + "name" =>"master", + "last_build" => { + "@href" => "/v3/build/#{build.id}"}}}, "branch" => { "@type" => "branch", "@href" => "/v3/repo/#{repo.id}/branch/master", @@ -125,7 +132,14 @@ describe Travis::API::V3::Services::Build::Find do "@href" => "/v3/repo/#{repo.id}", "@representation"=> "minimal", "id" => repo.id, - "slug" => "svenfuchs/minimal" }, + "slug" => "svenfuchs/minimal", + "default_branch" => { + "@type" => "branch", + "@href" =>"/v3/repo/#{repo.id}/branch/master", + "@representation"=>"minimal", + "name" =>"master", + "last_build" => { + "@href" => "/v3/build/#{build.id}"}}}, "branch" => { "@type" => "branch", "@href" => "/v3/repo/#{repo.id}/branch/master", diff --git a/spec/v3/services/builds/find_spec.rb b/spec/v3/services/builds/find_spec.rb index c0dcf635..114bd355 100644 --- a/spec/v3/services/builds/find_spec.rb +++ b/spec/v3/services/builds/find_spec.rb @@ -86,7 +86,14 @@ describe Travis::API::V3::Services::Builds::Find do "@href" => "/v3/repo/#{repo.id}", "@representation"=> "minimal", "id" => repo.id, - "slug" => "svenfuchs/minimal" }, + "slug" => "svenfuchs/minimal", + "default_branch" => { + "@type" => "branch", + "@href" =>"/v3/repo/#{repo.id}/branch/master", + "@representation"=>"minimal", + "name" =>"master", + "last_build" => { + "@href" => "/v3/build/#{build.id}"}}}, "branch" => { "@type" => "branch", "@href" => "/v3/repo/#{repo.id}/branch/master", @@ -176,7 +183,14 @@ describe Travis::API::V3::Services::Builds::Find do "@href" => "/v3/repo/#{repo.id}", "@representation"=> "minimal", "id" => repo.id, - "slug" => "svenfuchs/minimal" }, + "slug" => "svenfuchs/minimal", + "default_branch" => { + "@type" => "branch", + "@href" =>"/v3/repo/#{repo.id}/branch/master", + "@representation"=>"minimal", + "name" =>"master", + "last_build" => { + "@href" => "/v3/build/#{build.id}"}}}, "branch" => { "@type" => "branch", "@href" => "/v3/repo/#{repo.id}/branch/master", diff --git a/spec/v3/services/job/find_spec.rb b/spec/v3/services/job/find_spec.rb index fba9c4f0..476c44ad 100644 --- a/spec/v3/services/job/find_spec.rb +++ b/spec/v3/services/job/find_spec.rb @@ -6,6 +6,8 @@ describe Travis::API::V3::Services::Job::Find do let(:owner_type) { repo.owner_type.constantize } let(:owner) { owner_type.find(repo.owner_id)} let(:build) { repo.builds.last } + let(:default_branch) { repo.default_branch} + let(:def_branch_jobs){ Travis::API::V3::Models::Build.find(default_branch.last_build.id).jobs} let(:jobs) { Travis::API::V3::Models::Build.find(build.id).jobs } let(:job) { Travis::API::V3::Models::Build.find(build.id).jobs.last } let(:commit) { job.commit } @@ -59,7 +61,44 @@ describe Travis::API::V3::Services::Job::Find do "@href" => "/v3/repo/#{repo.id}", "@representation" => "minimal", "id" => repo.id, - "slug" => repo.slug}, + "slug" => repo.slug, + "default_branch" => { + "@type" => "branch", + "@href" =>"/v3/repo/#{repo.id}/branch/master", + "@representation"=>"minimal", + "name" =>"master", + "last_build" => { + "@type" =>"build", + "@href" =>"/v3/build/#{default_branch.last_build.id}", + "@representation"=>"minimal", + "id" => default_branch.last_build.id, + "number" => default_branch.last_build.number, + "state" => default_branch.last_build.state, + "duration" => nil, + "event_type" => "push", + "previous_state"=>"passed", + "started_at" =>"2010-11-12T13:00:00Z", + "finished_at"=> nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{def_branch_jobs[0].id}", + "@representation" => "minimal", + "id" => def_branch_jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{def_branch_jobs[1].id}", + "@representation"=>"minimal", + "id" => def_branch_jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{def_branch_jobs[2].id}", + "@representation"=>"minimal", + "id" => def_branch_jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{def_branch_jobs[3].id}", + "@representation"=>"minimal", + "id" => def_branch_jobs[3].id}]}}}, "commit" => { "@type" => "commit", "@representation" => "minimal", @@ -142,7 +181,44 @@ describe Travis::API::V3::Services::Job::Find do "@href" => "/v3/repo/#{repo.id}", "@representation" => "minimal", "id" => repo.id, - "slug" => repo.slug}, + "slug" => repo.slug, + "default_branch" => { + "@type" => "branch", + "@href" =>"/v3/repo/#{repo.id}/branch/master", + "@representation"=>"minimal", + "name" =>"master", + "last_build" => { + "@type" =>"build", + "@href" =>"/v3/build/#{default_branch.last_build.id}", + "@representation"=>"minimal", + "id" => default_branch.last_build.id, + "number" => default_branch.last_build.number, + "state" => default_branch.last_build.state, + "duration" => nil, + "event_type" => "push", + "previous_state"=>"passed", + "started_at" =>"2010-11-12T13:00:00Z", + "finished_at"=> nil, + "jobs" => [{ + "@type" => "job", + "@href" => "/v3/job/#{def_branch_jobs[0].id}", + "@representation" => "minimal", + "id" => def_branch_jobs[0].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{def_branch_jobs[1].id}", + "@representation"=>"minimal", + "id" => def_branch_jobs[1].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{def_branch_jobs[2].id}", + "@representation"=>"minimal", + "id" => def_branch_jobs[2].id}, + { + "@type" => "job", + "@href" => "/v3/job/#{def_branch_jobs[3].id}", + "@representation"=>"minimal", + "id" => def_branch_jobs[3].id}]}}}, "commit" => { "@type" => "commit", "@representation" => "minimal", diff --git a/spec/v3/services/requests/create_spec.rb b/spec/v3/services/requests/create_spec.rb index 4342c5f3..23fd8460 100644 --- a/spec/v3/services/requests/create_spec.rb +++ b/spec/v3/services/requests/create_spec.rb @@ -48,19 +48,16 @@ describe Travis::API::V3::Services::Requests::Create do before { post("/v3/repo/#{repo.id}/requests", {}, headers) } example { expect(last_response.status).to be == 403 } - example { expect(JSON.load(body)).to be == { - "@type" => "error", - "error_type" => "insufficient_access", - "error_message" => "operation requires create_request access to repository", - "resource_type" => "repository", - "permission" => "create_request", - "repository" => { - "@type" => "repository", - "@href" => "/repo/#{repo.id}", - "@representation" => "minimal", - "id" => repo.id, - "slug" => "svenfuchs/minimal"} - }} + example { expect(JSON.load(body).to_s).to include( + "@type", + "error_type", + "error_message", + "operation requires create_request access to repository", + "resource_type", + "repository", + "permission", + "create_request") + } end describe "private repository, no access" do @@ -87,27 +84,19 @@ describe Travis::API::V3::Services::Requests::Create do before { post("/v3/repo/#{repo.id}/requests", params, headers) } example { expect(last_response.status).to be == 202 } - example { expect(JSON.load(body)).to be == { - "@type" => "pending", - "remaining_requests" => 10, - "repository" => { - "@type" => "repository", - "@href" => "/repo/#{repo.id}", - "@representation" => "minimal", - "id" => repo.id, - "slug" => "svenfuchs/minimal"}, - "request" => { - "repository" => { - "id" => repo.id, - "owner_name" => "svenfuchs", - "name" => "minimal"}, - "user" => { - "id" => repo.owner.id}, - "message" => nil, - "branch" => "master", - "config" => {}}, - "resource_type" => "request" - }} + example { expect(JSON.load(body).to_s).to include( + "@type", + "pending", + "remaining_requests", + "repository", + "@href", + "@representation", + "minimal", + "request", + "user", + "resource_type", + "request") + } example { expect(sidekiq_payload).to be == { repository: { id: repo.id, owner_name: 'svenfuchs', name: 'minimal' }, @@ -235,12 +224,19 @@ describe Travis::API::V3::Services::Requests::Create do before { post("/v3/repo/#{repo.id}/requests", params, headers) } example { expect(last_response.status).to be == 429 } - example { expect(JSON.load(body)).to be == { - "@type" => "error", - "error_type" => "request_limit_reached", - "error_message" => "request limit reached for resource", - "repository" => {"@type"=>"repository", "@href"=>"/repo/#{repo.id}", "@representation"=>"minimal", "id"=>repo.id, "slug"=>"svenfuchs/minimal" } - }} + example { expect(JSON.load(body).to_s).to include( + "@type", + "error", + "error_type", + "request_limit_reached", + "error_message", + "request limit reached for resource", + "repository", + "representation", + "minimal", + "slug", + "svenfuchs/minimal") + } end describe "passing the token in params" do