@@ -2011,7 +2011,7 @@ def put(self, project_id, submission_id):
20112011@project_ns .route ('/<string:project_id>/submissions/<string:submission_id>/isolates' )
20122012class ProjectSubmissionIsolates2 (Resource ):
20132013
2014- ### GET /projects/<project_id>/submissions2 /<submission_id>/isolates
2014+ ### GET /projects/<project_id>/submissions /<submission_id>/isolates
20152015
20162016 @api .doc ('list_submission_isolates_v2' )
20172017 @require_auth (keycloak_auth )
@@ -2912,17 +2912,54 @@ def post(self):
29122912 return {'error' : f'Reindexing error: { str (e )} ' }, 500
29132913
29142914##########################
2915- ### JOBS MONITORING
2915+ ### ADMIN STATS
29162916##########################
29172917
2918- jobs_ns = api .namespace ('jobs' , description = 'Job monitoring endpoints' )
2918+ admin_ns = api .namespace ('admin' , description = 'Admin statistics endpoints' )
2919+ @admin_ns .route ('/stats' )
29192920
2920- @jobs_ns .route ('/' )
2921+ class AdminStats (Resource ):
2922+ ### GET /admin/stats ###
2923+
2924+ @api .doc ('get_admin_stats' )
2925+ @require_auth (keycloak_auth )
2926+ @require_permission ('system_admin_access' )
2927+ def get (self ):
2928+ """Get system-wide statistics for admin dashboard"""
2929+
2930+ try :
2931+ stats = {}
2932+
2933+ with get_db_cursor () as cursor :
2934+ # Total users
2935+ cursor .execute ("SELECT COUNT(*) as total_users FROM users" )
2936+ stats ['total_users' ] = cursor .fetchone ()['total_users' ]
2937+
2938+ # Total projects
2939+ cursor .execute ("SELECT COUNT(*) as total_projects FROM projects" )
2940+ stats ['total_projects' ] = cursor .fetchone ()['total_projects' ]
2941+
2942+ # Total submissions
2943+ cursor .execute ("SELECT COUNT(*) as total_submissions FROM submissions" )
2944+ stats ['total_submissions' ] = cursor .fetchone ()['total_submissions' ]
2945+
2946+ # Total isolates
2947+ cursor .execute ("SELECT COUNT(*) as total_isolates FROM isolates" )
2948+ stats ['total_isolates' ] = cursor .fetchone ()['total_isolates' ]
2949+
2950+ return stats , 200
2951+
2952+ except Exception as e :
2953+ logger .exception (f"Error retrieving admin stats: { str (e )} " )
2954+ return {'error' : f'Statistics retrieval error: { str (e )} ' }, 500
2955+
2956+
2957+ @admin_ns .route ('/jobs' )
29212958class JobsList (Resource ):
29222959
29232960 ### GET /jobs ###
29242961
2925- @jobs_ns .doc ('list_jobs' )
2962+ @admin_ns .doc ('list_jobs' )
29262963 @require_auth (keycloak_auth )
29272964 @require_permission ('system_admin_access' )
29282965 def get (self ):
0 commit comments