diff --git a/lib/travis/api/v3/queries/broadcasts.rb b/lib/travis/api/v3/queries/broadcasts.rb index 229e89c9..04cac2ba 100644 --- a/lib/travis/api/v3/queries/broadcasts.rb +++ b/lib/travis/api/v3/queries/broadcasts.rb @@ -1,11 +1,13 @@ module Travis::API::V3 class Queries::Broadcasts < Query - def for_repo(repository) - Models::Broadcast.where(recipient_id: repository.id) - end - def for_user(user) - Models::Broadcast.where(recipient_id: user.id) + query = %( + recipient_type IS NULL OR + recipient_type = ? AND recipient_id IN(?) OR + recipient_type = ? AND recipient_id = ? OR + recipient_type = ? AND recipient_id IN (?) + ) + Models::Broadcast.where(query, 'Organization', user.organization_ids, 'User', user.id, 'Repository', user.repository_ids) end end end diff --git a/lib/travis/api/v3/routes.rb b/lib/travis/api/v3/routes.rb index 19b705e8..811b153a 100644 --- a/lib/travis/api/v3/routes.rb +++ b/lib/travis/api/v3/routes.rb @@ -8,6 +8,11 @@ module Travis::API::V3 get :for_current_user end + resource :broadcasts do + route '/broadcasts' + get :for_current_user + end + resource :build do capture id: :digit route '/build/{build.id}' @@ -63,11 +68,6 @@ module Travis::API::V3 get :find end - resource :broadcasts do - route '/broadcasts' - get :for_current_repo - end - resource :builds do route '/builds' get :find @@ -85,11 +85,6 @@ module Travis::API::V3 route '/user' get :current get :find, '/{user.id}' - - resource :broadcasts do - route '/broadcasts' - get :for_current_user - end end end diff --git a/lib/travis/api/v3/services/broadcasts/for_current_repo.rb b/lib/travis/api/v3/services/broadcasts/for_current_repo.rb deleted file mode 100644 index 52d8df7f..00000000 --- a/lib/travis/api/v3/services/broadcasts/for_current_repo.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Travis::API::V3 - class Services::Broadcasts::ForCurrentRepo < Service - def run! - query.for_repo(find(:repository)) - end - end -end diff --git a/lib/travis/api/v3/services/broadcasts/for_current_user.rb b/lib/travis/api/v3/services/broadcasts/for_current_user.rb index 980b7c62..0393fb98 100644 --- a/lib/travis/api/v3/services/broadcasts/for_current_user.rb +++ b/lib/travis/api/v3/services/broadcasts/for_current_user.rb @@ -1,7 +1,8 @@ module Travis::API::V3 class Services::Broadcasts::ForCurrentUser < Service def run! - query.for_user(find(:user)) + raise LoginRequired unless access_control.logged_in? + query.for_user(access_control.user) end end end diff --git a/spec/v3/services/broadcasts/for_current_user_spec.rb b/spec/v3/services/broadcasts/for_current_user_spec.rb new file mode 100644 index 00000000..59a6743e --- /dev/null +++ b/spec/v3/services/broadcasts/for_current_user_spec.rb @@ -0,0 +1,41 @@ +require 'spec_helper' + +describe Travis::API::V3::Services::Broadcasts::ForCurrentUser do + let(:user) { Travis::API::V3::Models::User.where(login: 'svenfuchs').first } + let(:broadcast) { Travis::API::V3::Models::Broadcast.where(recipient_id: user.id) } + + let(:token) { Travis::Api::App::AccessToken.create(user: user, app_id: 1) } + let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} + before { Travis::API::V3::Models::Permission.create(user: user, pull: true) } + # before { Travis::API::V3::Models::Broadcast.create(recipient_id: repo.id, recipient_type: "Organization", message: "This is a test!") } + # before { repo.update_attribute(:private, true) } + # after { repo.update_attribute(:private, false) } + + # let(:org) { Travis::API::V3::Models::Organization.new(login: 'example-org') } + # before { org.save! } + # before { org.memberships.create(user: user.login) } + # after { org.delete } + + describe "authenticated as user with access" do + before { get("/v3/broadcasts", {}, headers) } + example { expect(last_response).to be_ok } + example { expect(JSON.load(body)).to be == { + "@type" => "broadcasts", + "@href" => "/v3/broadcasts", + "@representation" => "standard", + "broadcasts" => [{ + "@type" => "broadcast", + "@representation" => "standard", + "@permissions" => { "read"=>true, "sync"=>true }, + "id" => broadcasts[0].id, + "recipient_id" => broadcasts[0].recipient_id, + "recipient_type" => broadcasts[0].recipient_type, + "kind" => broadcast[0].kind, + "message" => broadcast[0].message, + "expired" => nil, + "created_at" => "2015-09-10T11:05:21Z", + "updated_at" => "2015-09-10T11:05:21Z" + }] + }} + end +end