@@ -4,10 +4,10 @@ class TopicsController < ApplicationController
44
55 def index
66 @search_query = nil
7- base_query = Topic . includes ( :creator )
8- base_query = apply_filters ( base_query )
7+ base_query = apply_filters ( Topic . includes ( :creator ) )
98
109 apply_cursor_pagination ( base_query )
10+ @new_topics_count = 0
1111
1212 preload_topic_states if user_signed_in?
1313 preload_note_counts if user_signed_in?
@@ -20,6 +20,15 @@ def index
2020 end
2121 end
2222
23+ def new_topics_count
24+ @viewing_since = viewing_since_param
25+ base_query = topics_base_query ( search_query : params [ :q ] )
26+ @new_topics_count = count_new_topics ( base_query , @viewing_since )
27+ refresh_path = params [ :q ] . present? ? search_topics_path ( q : params [ :q ] ) : topics_path
28+
29+ render partial : "new_topics_banner" , locals : { count : @new_topics_count , viewing_since : @viewing_since , refresh_path : refresh_path }
30+ end
31+
2332 def show
2433 messages_scope = @topic . messages . includes ( :sender , reply_to : :sender )
2534
@@ -81,20 +90,10 @@ def read_all
8190 def search
8291 @search_query = params [ :q ] . to_s . strip
8392
84- base_query = if @search_query . present?
85- search_pattern = "%#{ ActiveRecord ::Base . sanitize_sql_like ( @search_query ) } %"
86-
87- title_sql = Topic . select ( :id ) . where ( "title ILIKE ?" , search_pattern ) . to_sql
88- message_sql = Message . select ( :topic_id ) . where ( "body ILIKE ?" , search_pattern ) . to_sql
89- union_sql = "(#{ title_sql } ) UNION (#{ message_sql } )"
90-
91- Topic . where ( "topics.id IN (#{ union_sql } )" )
92- . includes ( :creator )
93- else
94- Topic . none
95- end
93+ base_query = topics_base_query ( search_query : @search_query )
9694
9795 apply_cursor_pagination ( base_query )
96+ @new_topics_count = 0
9897
9998 preload_participation_flags if user_signed_in?
10099
@@ -220,11 +219,7 @@ def assign_branch_segments!
220219 end
221220
222221 def apply_cursor_pagination ( base_query )
223- @viewing_since = if params [ :viewing_since ] . present?
224- Time . zone . parse ( params [ :viewing_since ] )
225- else
226- Time . current
227- end
222+ @viewing_since = viewing_since_param
228223
229224 query_with_window = base_query . joins ( :messages )
230225 . group ( 'topics.id' )
@@ -242,12 +237,6 @@ def apply_cursor_pagination(base_query)
242237 @topics = @topics . order ( 'MAX(messages.created_at) DESC, topics.id DESC' )
243238 . limit ( 25 )
244239 . load
245-
246- @new_topics_count = base_query . joins ( :messages )
247- . group ( 'topics.id' )
248- . having ( 'MAX(messages.created_at) > ?' , @viewing_since )
249- . count
250- . size
251240 end
252241
253242 def preload_topic_states
@@ -551,6 +540,45 @@ def filter_team_readers(topic, team_id:)
551540 readers . select { |r | r [ :team_id ] == team_id }
552541 end
553542
543+ def topics_base_query ( search_query : nil )
544+ return apply_filters ( Topic . includes ( :creator ) ) if search_query . nil?
545+
546+ cleaned_query = search_query . to_s . strip
547+ return Topic . none if cleaned_query . blank?
548+
549+ build_search_query ( cleaned_query )
550+ end
551+
552+ def build_search_query ( query )
553+ cleaned_query = query . to_s . strip
554+ return Topic . none if cleaned_query . blank?
555+
556+ search_pattern = "%#{ ActiveRecord ::Base . sanitize_sql_like ( cleaned_query ) } %"
557+
558+ title_sql = Topic . select ( :id ) . where ( "title ILIKE ?" , search_pattern ) . to_sql
559+ message_sql = Message . select ( :topic_id ) . where ( "body ILIKE ?" , search_pattern ) . to_sql
560+ union_sql = "(#{ title_sql } ) UNION (#{ message_sql } )"
561+
562+ Topic . where ( "topics.id IN (#{ union_sql } )" )
563+ . includes ( :creator )
564+ end
565+
566+ def viewing_since_param
567+ if params [ :viewing_since ] . present?
568+ Time . zone . parse ( params [ :viewing_since ] )
569+ else
570+ Time . current
571+ end
572+ end
573+
574+ def count_new_topics ( base_query , viewing_since )
575+ base_query . joins ( :messages )
576+ . group ( 'topics.id' )
577+ . having ( 'MAX(messages.created_at) > ?' , viewing_since )
578+ . count
579+ . size
580+ end
581+
554582 def load_notes
555583 notes = Note . active . visible_to ( current_user )
556584 . where ( topic : @topic )
0 commit comments