Skip to content

Commit

Permalink
[webui] Add notifications for projects in watchlist.
Browse files Browse the repository at this point in the history
  • Loading branch information
Evan Rolfe committed Oct 13, 2017
1 parent 0aa3261 commit c5bf75a
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 14 deletions.
5 changes: 5 additions & 0 deletions src/api/app/models/event/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,11 @@ def readers
ret
end

def watchers
project = ::Project.find_by_name(payload['project'])
project.watched_projects.map(&:user)
end

def _roles(role, project, package = nil)
return [] unless project
p = nil
Expand Down
2 changes: 1 addition & 1 deletion src/api/app/models/event/build.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class Event::BuildFail < Event::Build

self.raw_type = 'BUILD_FAIL'
self.description = 'Package has failed to build'
receiver_roles :maintainer, :bugowner, :reader
receiver_roles :maintainer, :bugowner, :reader, :watcher
after_commit :send_to_bus

def self.message_bus_queue
Expand Down
6 changes: 3 additions & 3 deletions src/api/app/models/event/comment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def custom_headers

class Event::CommentForProject < ::Event::Project
include CommentEvent
receiver_roles :maintainer
receiver_roles :maintainer, :watcher
after_commit :send_to_bus

def self.message_bus_queue
Expand All @@ -47,7 +47,7 @@ def subject

class Event::CommentForPackage < ::Event::Package
include CommentEvent
receiver_roles :maintainer
receiver_roles :maintainer, :watcher
after_commit :send_to_bus

def self.message_bus_queue
Expand All @@ -65,7 +65,7 @@ class Event::CommentForRequest < ::Event::Request
include CommentEvent
self.description = 'New comment for request created'
payload_keys :request_number
receiver_roles :source_maintainer, :target_maintainer, :creator, :reviewer
receiver_roles :source_maintainer, :target_maintainer, :creator, :reviewer, :source_watcher, :target_watcher
after_commit :send_to_bus

def self.message_bus_queue
Expand Down
20 changes: 18 additions & 2 deletions src/api/app/models/event/request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,22 @@ def target_maintainers
def source_maintainers
action_maintainers('sourceproject', 'sourcepackage')
end

def target_watchers
find_watchers('targetproject')
end

def source_watchers
find_watchers('sourceproject')
end

private

def find_watchers(project_key)
project_names = payload['actions'].map { |action| action[project_key] }.uniq
projects = Project.where(name: project_names).joins(watched_projects: :user)
projects.flat_map { |project| project.watched_projects.map(&:user) }
end
end

class Event::RequestChange < Event::Request
Expand All @@ -134,7 +150,7 @@ def self.message_bus_queue
class Event::RequestCreate < Event::Request
self.raw_type = 'SRCSRV_REQUEST_CREATE'
self.description = 'Request created'
receiver_roles :source_maintainer, :target_maintainer
receiver_roles :source_maintainer, :target_maintainer, :source_watcher, :target_watcher
after_commit :send_to_bus

def self.message_bus_queue
Expand Down Expand Up @@ -172,7 +188,7 @@ class Event::RequestStatechange < Event::Request
self.raw_type = 'SRCSRV_REQUEST_STATECHANGE'
self.description = 'Request state was changed'
payload_keys :oldstate
receiver_roles :source_maintainer, :target_maintainer, :creator, :reviewer
receiver_roles :source_maintainer, :target_maintainer, :creator, :reviewer, :source_watcher, :target_watcher
after_commit :send_to_bus

def self.message_bus_queue
Expand Down
14 changes: 13 additions & 1 deletion src/api/app/models/event_subscription.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,19 @@ class EventSubscription < ApplicationRecord
belongs_to :user, inverse_of: :event_subscriptions
belongs_to :group, inverse_of: :event_subscriptions

validates :receiver_role, inclusion: { in: %i(maintainer bugowner reader source_maintainer target_maintainer reviewer commenter creator) }
validates :receiver_role, inclusion: {
in: %i(maintainer
bugowner
reader
source_maintainer
target_maintainer
reviewer
commenter
creator
watcher
source_watcher
target_watcher)
}

scope :for_eventtype, ->(eventtype) { where(eventtype: eventtype) }
scope :defaults, ->{ where(user_id: nil, group_id: nil) }
Expand Down
75 changes: 72 additions & 3 deletions src/api/spec/models/event_subscription/find_for_event_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,59 @@

RSpec.describe EventSubscription::FindForEvent do
describe '#subscribers' do
subject do
event = Event::CommentForProject.first
EventSubscription::FindForEvent.new(event).subscriptions
context 'with a request' do
let!(:watcher) { create(:confirmed_user) }
let!(:watcher2) { create(:confirmed_user) }
let!(:source_project) { create(:project, name: 'TheSource') }
let!(:target_project) { create(:project, name: 'TheTarget') }
let!(:source_package) { create(:package) }
let!(:target_package) { create(:package) }
let(:request) do
create(
:bs_request_with_submit_action,
source_project: source_project.name,
target_project: target_project.name,
source_package: source_package.name,
target_package: target_package.name
)
end
let!(:default_subscription) do
create(
:event_subscription,
eventtype: 'Event::RequestCreate',
receiver_role: 'source_watcher',
user: nil,
group: nil,
channel: :instant_email
)
end

before do
watcher.add_watched_project(source_project.name)
request
end

subject do
event = Event::RequestCreate.first
EventSubscription::FindForEvent.new(event).subscriptions
end

it 'returns a new subscription for the watcher based on the default subscription' do
result_subscription = subject.find { |subscription| subscription.subscriber == watcher }

expect(result_subscription.id).to be_nil
expect(result_subscription.eventtype).to eq(default_subscription.eventtype)
expect(result_subscription.channel).to eq(default_subscription.channel)
expect(result_subscription.receiver_role).to eq(default_subscription.receiver_role)
end
end

context 'with a comment for a project' do
subject do
event = Event::CommentForProject.first
EventSubscription::FindForEvent.new(event).subscriptions
end

context 'with no maintainers' do
let!(:project) { create(:project) }
let!(:comment) { create(:comment_project, commentable: project) }
Expand All @@ -111,6 +158,28 @@
let!(:maintainer) { create(:group) }
end

context 'with a user who watching the project' do
let!(:watcher) { create(:confirmed_user) }
let!(:project) { create(:project) }
let!(:comment) { create(:comment_project, commentable: project) }

let!(:default_subscription) do
create(:event_subscription_comment_for_project, receiver_role: 'watcher', user: nil, group: nil)
end

before do
watcher.add_watched_project(project.name)
end

it 'returns a new subscription for the watcher based on the default subscription' do
result_subscription = subject.find { |subscription| subscription.subscriber == watcher }

expect(result_subscription.id).to be_nil
expect(result_subscription.eventtype).to eq(default_subscription.eventtype)
expect(result_subscription.channel).to eq(default_subscription.channel)
end
end

context 'with a user who is a maintainer and a commenter' do
context 'and the user has a maintainer and commenter subscriptions, which are both enabled' do
let!(:maintainer) { create(:confirmed_user) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
it 'includes the users subscriptions first' do
subscriptions = subject[Event::CommentForProject]

expect(subscriptions.count).to eq(2)
expect(subscriptions.count).to eq(3)
expect(subscriptions).to include(user_subscription1, user_subscription2)
end

it 'includes the default subscriptions second' do
subscriptions = subject[Event::CommentForRequest]

expect(subscriptions.count).to eq(5)
expect(subscriptions.count).to eq(7)
expect(subscriptions).to include(default_subscription3, default_subscription4)
end

Expand All @@ -41,10 +41,10 @@
let(:subscriber) { nil }

it 'includes the default subscriptions first' do
expect(subject[Event::CommentForProject].count).to eq(2)
expect(subject[Event::CommentForProject].count).to eq(3)
expect(subject[Event::CommentForProject]).to include(default_subscription1, default_subscription2)

expect(subject[Event::CommentForRequest].count).to eq(5)
expect(subject[Event::CommentForRequest].count).to eq(7)
expect(subject[Event::CommentForRequest]).to include(default_subscription3, default_subscription4)
end

Expand Down

0 comments on commit c5bf75a

Please sign in to comment.