""" admin_routes.py - Admin Panel Endpoints for HF Space Accessed via admin proxy with X-Admin-Authenticated header """ from flask import jsonify, request, render_template_string import logging from datetime import datetime from auth_middleware import require_auth, admin_required, get_current_user_id, is_admin from user_storage import ( get_all_user_ids, load_conversations, load_user_profile, get_user_storage_stats, delete_user_data, get_user_generated_images_dir, get_user_uploads_dir, get_user_dir ) import os logger = logging.getLogger(__name__) # =========================================== # ADMIN DASHBOARD HTML (Minimal - served via proxy) # =========================================== ADMIN_DASHBOARD_TEMPLATE = ''' HenAi Admin Dashboard

HenAi Admin Dashboard

-
Total Users
-
Total Conversations
-
Workspace Files
-
Generated Images
''' # =========================================== # REGISTER ADMIN ROUTES # =========================================== def register_admin_routes(app): """Register all admin routes with the Flask app""" @app.route('/admin') @require_auth @admin_required def admin_dashboard(): """Admin dashboard HTML page""" return render_template_string(ADMIN_DASHBOARD_TEMPLATE) @app.route('/admin/api/stats') @require_auth @admin_required def admin_api_stats(): """Get system statistics""" from user_storage import ( get_all_user_ids, load_conversations, get_user_workspace_stats, list_user_generated_images ) user_ids = get_all_user_ids() total_users = len(user_ids) total_conversations = 0 total_workspace_files = 0 total_generated_images = 0 for user_id in user_ids: conversations = load_conversations(user_id) total_conversations += len(conversations) # Count workspace files (simplified) try: from user_storage import load_workspace workspace = load_workspace(user_id) def count_files(node): count = 0 for folder in node.get('folders', []): count += count_files(folder) count += len(node.get('files', [])) return count total_workspace_files += count_files(workspace) except: pass # Count generated images try: images_dir = get_user_generated_images_dir(user_id) if os.path.exists(images_dir): total_generated_images += len([f for f in os.listdir(images_dir) if f.endswith(('.png', '.jpg', '.jpeg'))]) except: pass return jsonify({ 'success': True, 'stats': { 'total_users': total_users, 'total_conversations': total_conversations, 'total_workspace_files': total_workspace_files, 'total_generated_images': total_generated_images } }) @app.route('/admin/api/users') @require_auth @admin_required def admin_api_users(): """Get list of all users""" from user_storage import get_all_user_ids, load_user_profile user_ids = get_all_user_ids() users = [] for user_id in user_ids: profile = load_user_profile(user_id) users.append({ 'user_id': user_id, 'username': profile.get('username', user_id[:8]), 'email': profile.get('email', ''), 'created_at': profile.get('created_at', ''), 'last_active': profile.get('last_active', '') }) return jsonify({ 'success': True, 'users': users }) @app.route('/admin/api/storage') @require_auth @admin_required def admin_api_storage(): """Get storage details for all users""" from user_storage import get_all_user_ids, get_user_storage_stats user_ids = get_all_user_ids() storage = [] for user_id in user_ids: stats = get_user_storage_stats(user_id) storage.append({ 'user_id': user_id, 'conversations': stats['conversations'], 'workspace_files': stats['workspace_files'], 'uploaded_files': stats['uploaded_files'], 'generated_images': stats['generated_images'], 'total_size_mb': f"{stats['total_size_bytes'] / (1024 * 1024):.2f} MB" }) return jsonify({ 'success': True, 'storage': storage }) @app.route('/admin/api/users/', methods=['DELETE']) @require_auth @admin_required def admin_api_delete_user(user_id): """Delete a user and all their data""" from user_storage import delete_user_data if delete_user_data(user_id): return jsonify({'success': True}) else: return jsonify({'success': False, 'error': 'Failed to delete user'}), 500 @app.route('/admin/api/health') def admin_health(): """Health check for admin endpoints""" return jsonify({ 'status': 'ok', 'service': 'HenAi Admin API', 'timestamp': datetime.now().isoformat() }) logger.info("Admin routes registered")