From e6cc4cba8be51f934bcb300244e3d15587b8214a Mon Sep 17 00:00:00 2001 From: Sam <sam.saffron@gmail.com> Date: Sat, 18 Oct 2014 15:34:05 +1100 Subject: [PATCH] FEATURE: in:tracking and in:watching search filters --- config/locales/server.en.yml | 2 ++ lib/search.rb | 14 ++++++++++++++ spec/components/search_spec.rb | 4 ++++ 3 files changed, 20 insertions(+) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 2c74ea32b..329439702 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -2134,5 +2134,7 @@ en: `user:foo` Only show posts by the user `foo` `in:likes` Only show posts you liked `in:posted` Only show posts you created + `in:watching` Only show watched topics + `in:tracking` Only show tracking topics Example: `bears category:test status:open order:latest` will search for topics in the category bears that are not closed or archived ordered by last post date. diff --git a/lib/search.rb b/lib/search.rb index 2a722de71..392c8e8dd 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -171,6 +171,12 @@ class Search elsif word == 'in:posted' @posted_only = true nil + elsif word == 'in:watching' + @notification_level = TopicUser.notification_levels[:watching] + nil + elsif word == 'in:tracking' + @notification_level = TopicUser.notification_levels[:tracking] + nil else word end @@ -306,6 +312,14 @@ class Search posts = posts.where("posts.user_id = #{@guardian.user.id}") end + if @notification_level + posts = posts.where("posts.topic_id IN ( + SELECT tu.topic_id FROM topic_users tu + WHERE tu.user_id = #{@guardian.user.id} AND + tu.notification_level >= #{@notification_level} + )") + end + end # If we have a search context, prioritize those posts first diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb index 25c002976..8ec653172 100644 --- a/spec/components/search_spec.rb +++ b/spec/components/search_spec.rb @@ -328,6 +328,10 @@ describe Search do Search.execute('test in:posted', guardian: Guardian.new(topic.user)).posts.length.should == 1 + TopicUser.change(topic.user.id, topic.id, notification_level: TopicUser.notification_levels[:tracking]) + Search.execute('test in:watching', guardian: Guardian.new(topic.user)).posts.length.should == 0 + Search.execute('test in:tracking', guardian: Guardian.new(topic.user)).posts.length.should == 1 + end it 'can find by latest' do