v3: find repos for current user (used for dashboard)

This commit is contained in:
Konstantin Haase 2015-01-23 19:27:01 +01:00
parent c9fc88fa9a
commit a6da78ad83
14 changed files with 100 additions and 14 deletions

View File

@ -20,7 +20,8 @@ module Travis
ClientError = Error .create(status: 400)
NotFound = ClientError .create(:resource, status: 404, template: '%s not found (or insufficient access)')
EnitityMissing = NotFound .create(type: 'not_found')
WrongCredentials = ClientError .create('access denied', status: 403)
WrongCredentials = ClientError .create('access denied', status: 403)
LoginRequired = ClientError .create('login required', status: 403)
WrongParams = ClientError .create('wrong parameters')
end
end

View File

@ -12,12 +12,12 @@ module Travis::API::V3
raise ArgumentError, 'cannot use %p without a user' % application_name if config.requires_user and not user
end
protected
def logged_in?
!!user
full_access? or !!user
end
protected
def full_access?
config.full_access
end

View File

@ -11,6 +11,13 @@ module Travis::API::V3
full_access? or dispatch(object)
end
def user
end
def logged_in?
false
end
protected
def repository_visible?(repository)
@ -26,10 +33,6 @@ module Travis::API::V3
false
end
def logged_in?
false
end
def public_api?
!Travis.config.private_api
end

View File

@ -10,6 +10,10 @@ module Travis::API::V3
super()
end
def logged_in?
true
end
protected
def private_repository_visible?(repository)

View File

@ -27,7 +27,7 @@ module Travis::API::V3
def initialize(message = self.class.default_message, status: self.class.status, type: self.class.type, **payload)
if message.is_a? Symbol
payload[:resource_type] ||= message
payload[:resource_type] ||= message unless message == :resource
message = self.class.template % message
end

View File

@ -0,0 +1,11 @@
module Travis::API::V3
module Renderer::Collection
extend self
def render(collection_type, entry_type, entries, **additional)
entries &&= entries.map { |entry| Renderer[entry_type].render(entry) }
{ :@type => collection_type, collection_type => entries, **additional }
end
end
end

View File

@ -0,0 +1,9 @@
module Travis::API::V3
module Renderer::Repositories
extend self
def render(repositories)
Renderer[:collection].render(:repositories, :repository, repositories)
end
end
end

View File

@ -14,7 +14,7 @@ module Travis::API::V3
def nested_resources(repository)
{
owner: {
:@type => repository.owner_type.downcase,
:@type => repository.owner_type && repository.owner_type.downcase,
:id => repository.owner_id,
:login => repository.owner_name
},

View File

@ -7,5 +7,10 @@ module Travis::API::V3
route '/repo/{repository.id}'
get :find_repository
end
resource :repositories do
route '/repos'
get :repositories_for_current_user
end
end
end

View File

@ -30,5 +30,9 @@ module Travis::API::V3
def required_params
self.class.required_params
end
def run_service(name, added_params = {})
Services[name].new(access_control, params: params.merge(added_params)).run
end
end
end

View File

@ -27,7 +27,7 @@ module Travis::API::V3
routes.resources.each do |resource|
resources[resource.identifier] ||= {}
resource.services.each do |(request_method, sub_route), service|
service &&= service.to_s.sub(/_#{resource.identifier}$/, ''.freeze)
service &&= service.to_s.sub(/^#{resource.identifier}_|_#{resource.identifier}$/, ''.freeze)
list = resources[resource.identifier][service] ||= []
pattern = sub_route ? resource.route + sub_route : resource.route
pattern.to_templates.each do |template|

View File

@ -0,0 +1,10 @@
module Travis::API::V3
class Services::RepositoriesForCurrentUser < Service
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 })
Result.new(:repositories, repositories)
end
end
end

View File

@ -8,9 +8,10 @@ describe Travis::API::V3::ServiceIndex do
describe "custom json entry point" do
let(:expected_resources) {{
"repository" => {
"find" => [{"request-method"=>"GET", "uri-template"=>"#{path}repo/{repository.id}"}]
}
"repository" => {
"find" => [{"request-method"=>"GET", "uri-template"=>"#{path}repo/{repository.id}"}] },
"repositories" => {
"for_current_user" => [{"request-method"=>"GET", "uri-template"=>"#{path}repos"}] }
}}
describe 'with /v3 prefix' do

View File

@ -0,0 +1,38 @@
require 'spec_helper'
describe Travis::API::V3::Services::FindRepository do
let(:repo) { Repository.by_slug('svenfuchs/minimal').first }
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 == {
"@type" => "repositories",
"repositories" => [{
"@type" => "repository",
"id" => repo.id,
"name" => "minimal",
"slug" => "svenfuchs/minimal",
"description" => nil,
"github_language" => nil,
"private" => true,
"owner" => {
"@type" => "user",
"id" => repo.owner_id,
"login" => "svenfuchs" },
"last_build" => {
"@type" => "build",
"id" => repo.last_build_id,
"number" => "2",
"state" => "passed",
"duration" => nil,
"started_at" => "2010-11-12T12:30:00Z",
"finished_at" => "2010-11-12T12:30:20Z"}}]
}}
end
end