v3: find repos for current user (used for dashboard)
This commit is contained in:
parent
c9fc88fa9a
commit
a6da78ad83
|
@ -21,6 +21,7 @@ module Travis
|
||||||
NotFound = ClientError .create(:resource, status: 404, template: '%s not found (or insufficient access)')
|
NotFound = ClientError .create(:resource, status: 404, template: '%s not found (or insufficient access)')
|
||||||
EnitityMissing = NotFound .create(type: 'not_found')
|
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')
|
WrongParams = ClientError .create('wrong parameters')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -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
|
raise ArgumentError, 'cannot use %p without a user' % application_name if config.requires_user and not user
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
def logged_in?
|
def logged_in?
|
||||||
!!user
|
full_access? or !!user
|
||||||
end
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
def full_access?
|
def full_access?
|
||||||
config.full_access
|
config.full_access
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,6 +11,13 @@ module Travis::API::V3
|
||||||
full_access? or dispatch(object)
|
full_access? or dispatch(object)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def user
|
||||||
|
end
|
||||||
|
|
||||||
|
def logged_in?
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def repository_visible?(repository)
|
def repository_visible?(repository)
|
||||||
|
@ -26,10 +33,6 @@ module Travis::API::V3
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
def logged_in?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def public_api?
|
def public_api?
|
||||||
!Travis.config.private_api
|
!Travis.config.private_api
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,6 +10,10 @@ module Travis::API::V3
|
||||||
super()
|
super()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def logged_in?
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def private_repository_visible?(repository)
|
def private_repository_visible?(repository)
|
||||||
|
|
|
@ -27,7 +27,7 @@ module Travis::API::V3
|
||||||
|
|
||||||
def initialize(message = self.class.default_message, status: self.class.status, type: self.class.type, **payload)
|
def initialize(message = self.class.default_message, status: self.class.status, type: self.class.type, **payload)
|
||||||
if message.is_a? Symbol
|
if message.is_a? Symbol
|
||||||
payload[:resource_type] ||= message
|
payload[:resource_type] ||= message unless message == :resource
|
||||||
message = self.class.template % message
|
message = self.class.template % message
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
11
lib/travis/api/v3/renderer/collection.rb
Normal file
11
lib/travis/api/v3/renderer/collection.rb
Normal 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
|
9
lib/travis/api/v3/renderer/repositories.rb
Normal file
9
lib/travis/api/v3/renderer/repositories.rb
Normal 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
|
|
@ -14,7 +14,7 @@ module Travis::API::V3
|
||||||
def nested_resources(repository)
|
def nested_resources(repository)
|
||||||
{
|
{
|
||||||
owner: {
|
owner: {
|
||||||
:@type => repository.owner_type.downcase,
|
:@type => repository.owner_type && repository.owner_type.downcase,
|
||||||
:id => repository.owner_id,
|
:id => repository.owner_id,
|
||||||
:login => repository.owner_name
|
:login => repository.owner_name
|
||||||
},
|
},
|
||||||
|
|
|
@ -7,5 +7,10 @@ module Travis::API::V3
|
||||||
route '/repo/{repository.id}'
|
route '/repo/{repository.id}'
|
||||||
get :find_repository
|
get :find_repository
|
||||||
end
|
end
|
||||||
|
|
||||||
|
resource :repositories do
|
||||||
|
route '/repos'
|
||||||
|
get :repositories_for_current_user
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -30,5 +30,9 @@ module Travis::API::V3
|
||||||
def required_params
|
def required_params
|
||||||
self.class.required_params
|
self.class.required_params
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def run_service(name, added_params = {})
|
||||||
|
Services[name].new(access_control, params: params.merge(added_params)).run
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -27,7 +27,7 @@ module Travis::API::V3
|
||||||
routes.resources.each do |resource|
|
routes.resources.each do |resource|
|
||||||
resources[resource.identifier] ||= {}
|
resources[resource.identifier] ||= {}
|
||||||
resource.services.each do |(request_method, sub_route), service|
|
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] ||= []
|
list = resources[resource.identifier][service] ||= []
|
||||||
pattern = sub_route ? resource.route + sub_route : resource.route
|
pattern = sub_route ? resource.route + sub_route : resource.route
|
||||||
pattern.to_templates.each do |template|
|
pattern.to_templates.each do |template|
|
||||||
|
|
10
lib/travis/api/v3/services/repositories_for_current_user.rb
Normal file
10
lib/travis/api/v3/services/repositories_for_current_user.rb
Normal 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
|
|
@ -9,8 +9,9 @@ describe Travis::API::V3::ServiceIndex do
|
||||||
describe "custom json entry point" do
|
describe "custom json entry point" do
|
||||||
let(:expected_resources) {{
|
let(:expected_resources) {{
|
||||||
"repository" => {
|
"repository" => {
|
||||||
"find" => [{"request-method"=>"GET", "uri-template"=>"#{path}repo/{repository.id}"}]
|
"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
|
describe 'with /v3 prefix' do
|
||||||
|
|
38
spec/v3/services/repositories_for_current_user_spec.rb
Normal file
38
spec/v3/services/repositories_for_current_user_spec.rb
Normal 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
|
Loading…
Reference in New Issue
Block a user