-
Notifications
You must be signed in to change notification settings - Fork 8.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
FEATURE: Basic backend support for muted and watched categories
- Loading branch information
1 parent
126433c
commit b482b28
Showing
6 changed files
with
106 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
class CategoryUser < ActiveRecord::Base | ||
belongs_to :category | ||
belongs_to :user | ||
|
||
# same for now | ||
def self.notification_levels | ||
TopicUser.notification_levels | ||
end | ||
|
||
def self.auto_watch_new_topic(topic) | ||
apply_default_to_topic( | ||
topic, | ||
TopicUser.notification_levels[:watching], | ||
TopicUser.notification_reasons[:auto_watch_category] | ||
) | ||
end | ||
|
||
def self.auto_mute_new_topic(topic) | ||
apply_default_to_topic( | ||
topic, | ||
TopicUser.notification_levels[:muted], | ||
TopicUser.notification_reasons[:auto_mute_category] | ||
) | ||
end | ||
|
||
private | ||
|
||
def self.apply_default_to_topic(topic, level, reason) | ||
# Can not afford to slow down creation of topics when a pile of users are watching new topics, reverting to SQL for max perf here | ||
sql = <<SQL | ||
INSERT INTO topic_users(user_id, topic_id, notification_level, notifications_reason_id) | ||
SELECT user_id, :topic_id, :level, :reason | ||
FROM category_users | ||
WHERE notification_level = :level AND | ||
category_id = :category_id AND | ||
NOT EXISTS(SELECT 1 FROM topic_users WHERE topic_id = :topic_id AND user_id = category_users.user_id) | ||
SQL | ||
|
||
exec_sql( | ||
sql, | ||
topic_id: topic.id, | ||
category_id: topic.category_id, | ||
level: level, | ||
reason: reason | ||
|
||
) | ||
end | ||
|
||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
class AddCategoryUsers < ActiveRecord::Migration | ||
def change | ||
create_table :category_users do |t| | ||
t.column :category_id, :integer, null: false | ||
t.column :user_id, :integer, null: false | ||
t.column :notification_level, :integer, null: false | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# encoding: utf-8 | ||
|
||
require 'spec_helper' | ||
require_dependency 'post_creator' | ||
|
||
describe CategoryUser do | ||
context 'integration' do | ||
before do | ||
ActiveRecord::Base.observers.enable :all | ||
end | ||
|
||
it 'should operate correctly' do | ||
watched_category = Fabricate(:category) | ||
muted_category = Fabricate(:category) | ||
user = Fabricate(:user) | ||
|
||
CategoryUser.create!(user: user, category: watched_category, notification_level: CategoryUser.notification_levels[:watching]) | ||
CategoryUser.create!(user: user, category: muted_category, notification_level: CategoryUser.notification_levels[:muted]) | ||
|
||
watched_post = create_post(category: watched_category) | ||
muted_post = create_post(category: muted_category) | ||
|
||
Notification.where(user_id: user.id, topic_id: watched_post.topic_id).count.should == 1 | ||
|
||
tu = TopicUser.get(muted_post.topic, user) | ||
tu.notification_level.should == TopicUser.notification_levels[:muted] | ||
tu.notifications_reason_id.should == TopicUser.notification_reasons[:auto_mute_category] | ||
end | ||
|
||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters