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