diff --git a/lib/travis/api/v3/queries/repositories.rb b/lib/travis/api/v3/queries/repositories.rb new file mode 100644 index 00000000..cb8fe209 --- /dev/null +++ b/lib/travis/api/v3/queries/repositories.rb @@ -0,0 +1,29 @@ +module Travis::API::V3 + class Queries::Repositories < Query + params :active, :private, prefix: :repository + + def for_member(user) + all.joins(:users).where(users: user_condition(user)) + end + + private + + def user_condition(value) + case value + when String then { login: value } + when Integer then { id: value } + when ::User then { id: value.id } + else raise WrongParams + end + end + + def all + @all ||= begin + all = ::Repository + all = all.where(active: bool(active)) unless active.nil? + all = all.where(private: bool(private)) unless private.nil? + all + end + end + end +end diff --git a/lib/travis/api/v3/query.rb b/lib/travis/api/v3/query.rb index 8692620d..271187af 100644 --- a/lib/travis/api/v3/query.rb +++ b/lib/travis/api/v3/query.rb @@ -10,5 +10,10 @@ module Travis::API::V3 def initialize(params) @params = params end + + def bool(value) + return false if value == 'false'.freeze + !!value + end end end diff --git a/lib/travis/api/v3/services/repositories_for_current_user.rb b/lib/travis/api/v3/services/repositories_for_current_user.rb index 56ff97f2..1f69de4f 100644 --- a/lib/travis/api/v3/services/repositories_for_current_user.rb +++ b/lib/travis/api/v3/services/repositories_for_current_user.rb @@ -3,7 +3,7 @@ module Travis::API::V3 def run raise LoginRequired unless access_control.logged_in? raise NotFound, :repositories unless access_control.user - repositories = ::Repository::joins(:users).where(users: { id: access_control.user.id }) + repositories = query(:repositories).for_member(access_control.user) Result.new(:repositories, repositories) end end diff --git a/spec/v3/services/repositories_for_current_user_spec.rb b/spec/v3/services/repositories_for_current_user_spec.rb index 49b7c53b..1d02bedd 100644 --- a/spec/v3/services/repositories_for_current_user_spec.rb +++ b/spec/v3/services/repositories_for_current_user_spec.rb @@ -3,15 +3,16 @@ require 'spec_helper' describe Travis::API::V3::Services::FindRepository do let(:repo) { Repository.by_slug('svenfuchs/minimal').first } + let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } + let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} + before { Permission.create(repository: repo, user: repo.owner, pull: true) } + before { repo.update_attribute(:private, true) } + after { repo.update_attribute(:private, false) } + describe "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 { Permission.create(repository: repo, user: repo.owner, pull: true) } - before { repo.update_attribute(:private, true) } - before { get("/v3/repos", {}, headers) } - before { repo.update_attribute(:private, false) } - example { expect(last_response).to be_ok } - example { expect(JSON.load(body)).to be == { + before { get("/v3/repos", {}, headers) } + example { expect(last_response).to be_ok } + example { expect(JSON.load(body)).to be == { "@type" => "repositories", "repositories" => [{ "@type" => "repository", @@ -35,4 +36,16 @@ describe Travis::API::V3::Services::FindRepository do "finished_at" => "2010-11-12T12:30:20Z"}}] }} end + + describe "filter: private=false" do + before { get("/v3/repos", {"repository.private" => "false"}, headers) } + example { expect(last_response) .to be_ok } + example { expect(JSON.load(body)['repositories']) .to be == [] } + end + + describe "filter: active=false" do + before { get("/v3/repos", {"repository.active" => "false"}, headers) } + example { expect(last_response) .to be_ok } + example { expect(JSON.load(body)['repositories']) .to be == [] } + end end \ No newline at end of file