From d8f10754919598af5bdb58c1f4a5dfafb655399c Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Mon, 27 Apr 2015 17:01:06 +0200 Subject: [PATCH] start working on repos by owner endpoint --- lib/travis/api/v3/access_control/anonymous.rb | 5 ++++ lib/travis/api/v3/access_control/generic.rb | 6 +++++ lib/travis/api/v3/access_control/user.rb | 4 ++++ lib/travis/api/v3/queries/repositories.rb | 23 +++++++++++-------- lib/travis/api/v3/routes.rb | 1 + .../api/v3/services/owner/repositories.rb | 10 ++++++++ 6 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 lib/travis/api/v3/services/owner/repositories.rb diff --git a/lib/travis/api/v3/access_control/anonymous.rb b/lib/travis/api/v3/access_control/anonymous.rb index f2229bc5..c41df37f 100644 --- a/lib/travis/api/v3/access_control/anonymous.rb +++ b/lib/travis/api/v3/access_control/anonymous.rb @@ -9,6 +9,11 @@ module Travis::API::V3 new end + def visible_repositories(list) + return [] unless unrestricted_api? + list.where(private: false) + end + def admin_for(repository) raise LoginRequired end diff --git a/lib/travis/api/v3/access_control/generic.rb b/lib/travis/api/v3/access_control/generic.rb index 8220d653..c4883ff3 100644 --- a/lib/travis/api/v3/access_control/generic.rb +++ b/lib/travis/api/v3/access_control/generic.rb @@ -30,6 +30,12 @@ module Travis::API::V3 false end + def visible_repositories(list) + # naïve implementation, replaced with smart implementation in specific subclasses + return list if full_access? + list.select { |r| visible?(r) } + end + protected def build_visible?(build) diff --git a/lib/travis/api/v3/access_control/user.rb b/lib/travis/api/v3/access_control/user.rb index 38529f8a..ff8eff44 100644 --- a/lib/travis/api/v3/access_control/user.rb +++ b/lib/travis/api/v3/access_control/user.rb @@ -19,6 +19,10 @@ module Travis::API::V3 permission?(:admin, repository) ? user : super end + def visible_repositories(list) + list.where('repositories.private = false OR repositories.id IN ?'.freeze, permissions.map(&:repository_id)) + end + protected def repository_writable?(repository) diff --git a/lib/travis/api/v3/queries/repositories.rb b/lib/travis/api/v3/queries/repositories.rb index 7872e8d4..61cf3a60 100644 --- a/lib/travis/api/v3/queries/repositories.rb +++ b/lib/travis/api/v3/queries/repositories.rb @@ -6,16 +6,21 @@ module Travis::API::V3 all.joins(:users).where(users: user_condition(user)) end + def for_owner(owner) + filter(owner.repositories) + end + def all - @all ||= begin - all = Models::Repository - all = all.where(active: bool(active)) unless active.nil? - all = all.where(private: bool(private)) unless private.nil? - all = all.includes(:owner) if includes? 'repository.owner'.freeze - all = all.includes(:last_build) if includes? 'repository.last_build'.freeze - all = all.includes(:default_branch) - all - end + @all ||= filter(Models::Repository) + end + + def filter(list) + list = list.where(active: bool(active)) unless active.nil? + list = list.where(private: bool(private)) unless private.nil? + list = list.includes(:owner) if includes? 'repository.owner'.freeze + list = list.includes(:last_build) if includes? 'repository.last_build'.freeze + list = list.includes(:default_branch) + list end end end diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index 18ea5ddc..66c13dde 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -11,6 +11,7 @@ module Travis::API::V3 resource :owner do route '/owner/({owner.login}|{user.login}|{organization.login})' get :find + get :repositories, '/repos' end resource :repository do diff --git a/lib/travis/api/v3/services/owner/repositories.rb b/lib/travis/api/v3/services/owner/repositories.rb new file mode 100644 index 00000000..77579ffd --- /dev/null +++ b/lib/travis/api/v3/services/owner/repositories.rb @@ -0,0 +1,10 @@ +module Travis::API::V3 + class Services::Owner::Repositories < Service + result_type :repositories + + def run! + unfiltered = query(:repositories).for_owner(find) + access_control.visible_repositories(unfiltered) + end + end +end