v3: move find repos logic to query object, allow filtering by private and active

This commit is contained in:
Konstantin Haase 2015-01-27 14:30:12 +01:00
parent 1712204321
commit 2e4771ccd2
4 changed files with 56 additions and 9 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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