From 26b1d85d432febf73f591de1e921bb021b8bfbb5 Mon Sep 17 00:00:00 2001 From: carlad Date: Thu, 29 Oct 2015 17:57:30 +0100 Subject: [PATCH] V3 add user/:id/sync endpoint --- lib/travis/api/v3.rb | 1 + lib/travis/api/v3/access_control/generic.rb | 4 ++++ lib/travis/api/v3/queries/user.rb | 9 ++++++++- lib/travis/api/v3/routes.rb | 1 + lib/travis/api/v3/services/user/sync.rb | 12 ++++++++++++ 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 lib/travis/api/v3/services/user/sync.rb diff --git a/lib/travis/api/v3.rb b/lib/travis/api/v3.rb index 221df59b..8c8be745 100644 --- a/lib/travis/api/v3.rb +++ b/lib/travis/api/v3.rb @@ -34,6 +34,7 @@ module Travis ServerError = Error .create(status: 500) NotImplemented = ServerError .create('request not (yet) implemented', status: 501) RequestLimitReached = ClientError .create('request limit reached for resource', status: 429) + AlreadySyncing = ClientError .create('sync already in progress', status: 409) end end end diff --git a/lib/travis/api/v3/access_control/generic.rb b/lib/travis/api/v3/access_control/generic.rb index a8a6dab5..048ff7ec 100644 --- a/lib/travis/api/v3/access_control/generic.rb +++ b/lib/travis/api/v3/access_control/generic.rb @@ -75,6 +75,10 @@ module Travis::API::V3 unrestricted_api? end + def user_writable?(user) + self.user == user + end + def repository_visible?(repository) return true if unrestricted_api? and not repository.private? private_repository_visible?(repository) diff --git a/lib/travis/api/v3/queries/user.rb b/lib/travis/api/v3/queries/user.rb index 47bd7f02..e65846b2 100644 --- a/lib/travis/api/v3/queries/user.rb +++ b/lib/travis/api/v3/queries/user.rb @@ -1,6 +1,6 @@ module Travis::API::V3 class Queries::User < Query - params :id, :login, :email, :github_id + params :id, :login, :email, :github_id, :is_syncing def find return Models::User.find_by_id(id) if id @@ -17,5 +17,12 @@ module Travis::API::V3 User.find_by_email(email) end end + + def sync(user) + raise AlreadySyncing if user.is_syncing? + perform_async(:user_sync, user.id) + user.update_column(:is_syncing, true) + user + end end end diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index 988a5e96..0f80050a 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -97,6 +97,7 @@ module Travis::API::V3 route '/user' get :current get :find, '/{user.id}' + post :sync, '/{user.id}/sync' end end diff --git a/lib/travis/api/v3/services/user/sync.rb b/lib/travis/api/v3/services/user/sync.rb new file mode 100644 index 00000000..5ece301b --- /dev/null +++ b/lib/travis/api/v3/services/user/sync.rb @@ -0,0 +1,12 @@ +module Travis::API::V3 + class Services::User::Sync < Service + + def run! + raise LoginRequired unless access_control.logged_in? or access_control.full_access? + raise NotFound unless user = find(:user) + access_control.permissions(user).sync! + + query.sync(user) + end + end +end