22
33module SolidQueueMonitor
44 class QueuesController < BaseController
5+ SORTABLE_COLUMNS = %w[ queue_name job_count ] . freeze
6+ QUEUE_DETAILS_SORTABLE_COLUMNS = %w[ class_name created_at ] . freeze
7+
58 def index
6- @queues = SolidQueue ::Job . group ( :queue_name )
7- . select ( 'queue_name, COUNT(*) as job_count' )
8- . order ( 'job_count DESC' )
9+ base_query = SolidQueue ::Job . group ( :queue_name )
10+ . select ( 'queue_name, COUNT(*) as job_count' )
11+ @queues = apply_queue_sorting ( base_query )
912 @paused_queues = QueuePauseService . paused_queues
1013
11- render_page ( 'Queues' , SolidQueueMonitor ::QueuesPresenter . new ( @queues , @paused_queues ) . render )
14+ render_page ( 'Queues' , SolidQueueMonitor ::QueuesPresenter . new ( @queues , @paused_queues , sort : sort_params ) . render )
1215 end
1316
1417 def show
1518 @queue_name = params [ :queue_name ]
1619 @paused = QueuePauseService . paused_queues . include? ( @queue_name )
1720
1821 # Get all jobs for this queue with filtering and pagination
19- base_query = SolidQueue ::Job . where ( queue_name : @queue_name ) . order ( created_at : :desc )
20- filtered_query = filter_queue_jobs ( base_query )
21- @jobs = paginate ( filtered_query )
22+ base_query = SolidQueue ::Job . where ( queue_name : @queue_name )
23+ sorted_query = apply_sorting ( filter_queue_jobs ( base_query ) , QUEUE_DETAILS_SORTABLE_COLUMNS , 'created_at' , :desc )
24+ @jobs = paginate ( sorted_query )
2225 preload_job_statuses ( @jobs [ :records ] )
2326
2427 @counts = calculate_queue_counts ( @queue_name )
@@ -31,7 +34,8 @@ def show
3134 counts : @counts ,
3235 current_page : @jobs [ :current_page ] ,
3336 total_pages : @jobs [ :total_pages ] ,
34- filters : queue_filter_params
37+ filters : queue_filter_params ,
38+ sort : sort_params
3539 ) . render )
3640 end
3741
@@ -97,5 +101,14 @@ def queue_filter_params
97101 status : params [ :status ]
98102 }
99103 end
104+
105+ def apply_queue_sorting ( relation )
106+ column = sort_params [ :sort_by ]
107+ direction = sort_params [ :sort_direction ]
108+ column = 'job_count' unless SORTABLE_COLUMNS . include? ( column )
109+ direction = 'desc' unless %w[ asc desc ] . include? ( direction )
110+
111+ relation . order ( "#{ column } #{ direction } " )
112+ end
100113 end
101114end
0 commit comments