"""Admin routes for the application.""" from flask import Blueprint, request from app.services.decorators import ( get_current_user, require_auth, require_role, ) from app.services.scheduler_service import scheduler_service from app.services.sound_normalizer_service import SoundNormalizerService from app.services.sound_scanner_service import SoundScannerService bp = Blueprint("admin", __name__) @bp.route("/") @require_auth @require_role("admin") def admin_only() -> dict[str, str]: """Admin-only endpoint to demonstrate role-based access.""" user = get_current_user() return { "message": f"Hello admin {user['name']}, you have admin access!", "user": user, "admin_info": "This endpoint is only accessible to admin users", } @bp.route("/scheduler/status") @require_auth @require_role("admin") def scheduler_status() -> dict: """Get scheduler status (admin only).""" return scheduler_service.get_scheduler_status() @bp.route("/credits/refill", methods=["POST"]) @require_auth @require_role("admin") def manual_credit_refill() -> dict: """Manually trigger credit refill for all users (admin only).""" return scheduler_service.trigger_credit_refill_now() @bp.route("/sounds/scan", methods=["POST"]) @require_auth @require_role("admin") def manual_sound_scan() -> dict: """Manually trigger sound directory scan (admin only).""" return scheduler_service.trigger_sound_scan_now() @bp.route("/sounds/stats") @require_auth @require_role("admin") def sound_statistics() -> dict: """Get sound database statistics (admin only).""" return SoundScannerService.get_scan_statistics() @bp.route("/sounds/normalize/", methods=["POST"]) @require_auth @require_role("admin") def normalize_sound(sound_id: int) -> dict: """Normalize a specific sound file (admin only).""" overwrite = request.args.get("overwrite", "false").lower() == "true" return SoundNormalizerService.normalize_sound(sound_id, overwrite) @bp.route("/sounds/normalize-all", methods=["POST"]) @require_auth @require_role("admin") def normalize_all_sounds() -> dict: """Normalize all soundboard files (admin only).""" overwrite = request.args.get("overwrite", "false").lower() == "true" limit_str = request.args.get("limit") limit = int(limit_str) if limit_str else None return SoundNormalizerService.normalize_all_sounds(overwrite, limit) @bp.route("/sounds/normalization-status") @require_auth @require_role("admin") def normalization_status() -> dict: """Get normalization status statistics (admin only).""" return SoundNormalizerService.get_normalization_status() @bp.route("/sounds/ffmpeg-check") @require_auth @require_role("admin") def ffmpeg_check() -> dict: """Check ffmpeg availability and capabilities (admin only).""" return SoundNormalizerService.check_ffmpeg_availability()