@@ -5,6 +5,12 @@ def index
55 @projects = Project . includes ( :user )
66 . where ( status : [ "submitted" , "pending_voting" , "waiting_for_review" , "finished" ] )
77
8+ # Filter out hidden projects by default, unless super admin explicitly shows them
9+ @show_hidden = current_user &.super_admin? && params [ :show_hidden ] == 'true'
10+ unless @show_hidden
11+ @projects = @projects . where ( hidden : false )
12+ end
13+
814 # Default to showing only sus projects
915 fraud_status_filter = params [ :fraud_status ] . presence || "sus"
1016
@@ -120,6 +126,46 @@ def update_fraud_status
120126 end
121127 end
122128
129+ def hide_project
130+ unless current_user &.super_admin?
131+ render json : { success : false , error : "Access denied. Super admin privileges required." }
132+ return
133+ end
134+
135+ @project = Project . find ( params [ :id ] )
136+
137+ # Skip screenshot validation when hiding project
138+ @project . skip_screenshot_validation!
139+
140+ if @project . update ( hidden : true )
141+ render json : { success : true , message : "Project '#{ @project . name } ' has been hidden." }
142+ else
143+ render json : { success : false , error : "Failed to hide project." }
144+ end
145+ rescue ActiveRecord ::RecordNotFound
146+ render json : { success : false , error : "Project not found." }
147+ end
148+
149+ def unhide_project
150+ unless current_user &.super_admin?
151+ render json : { success : false , error : "Access denied. Super admin privileges required." }
152+ return
153+ end
154+
155+ @project = Project . find ( params [ :id ] )
156+
157+ # Skip screenshot validation when unhiding project
158+ @project . skip_screenshot_validation!
159+
160+ if @project . update ( hidden : false )
161+ render json : { success : true , message : "Project '#{ @project . name } ' has been unhidden." }
162+ else
163+ render json : { success : false , error : "Failed to unhide project." }
164+ end
165+ rescue ActiveRecord ::RecordNotFound
166+ render json : { success : false , error : "Project not found." }
167+ end
168+
123169 private
124170
125171 def generate_fraud_leaderboard ( week_number )
@@ -172,13 +218,19 @@ def require_fraud_access
172218 def get_project_navigation ( current_project , filter_params )
173219 # Convert params to hash safely
174220 safe_params = filter_params . respond_to? ( :permit ) ?
175- filter_params . permit ( :name , :author , :week , :fraud_status , :reasoning ) . to_h :
221+ filter_params . permit ( :name , :author , :week , :fraud_status , :reasoning , :show_hidden ) . to_h :
176222 filter_params . to_h
177223
178224 # Build the same query as index action to get the filtered list
179225 projects = Project . includes ( :user )
180226 . where ( status : [ "submitted" , "pending_voting" , "waiting_for_review" , "finished" ] )
181227
228+ # Apply hidden filter (same logic as index action)
229+ show_hidden = current_user &.super_admin? && ( safe_params [ :show_hidden ] == 'true' || safe_params [ "show_hidden" ] == 'true' )
230+ unless show_hidden
231+ projects = projects . where ( hidden : false )
232+ end
233+
182234 # Apply the same filters as index action
183235 fraud_status_filter = safe_params [ :fraud_status ] . presence || safe_params [ "fraud_status" ] . presence || "sus"
184236
0 commit comments