"""Admin blueprint.""" from flask import Blueprint, flash, jsonify, redirect, render_template, request, session, url_for from ..helpers import _api, admin_required admin_bp = Blueprint("admin", __name__) @admin_bp.get("/admin") @admin_required def index(): token = session["access_token"] stats_resp = _api("GET", "/admin/stats", token=token) users_resp = _api("GET", "/users", token=token) stats = stats_resp.json() if stats_resp.status_code == 200 else {} users = users_resp.json() if users_resp.status_code == 200 else [] return render_template("admin.html", stats=stats, users=users) @admin_bp.post("/admin/users//role") @admin_required def set_role(user_id: str): role = request.form.get("role", "user") _api("PUT", f"/users/{user_id}/role", token=session["access_token"], json={"role": role}) flash(f"Role updated to '{role}'.", "success") return redirect(url_for("admin.index")) @admin_bp.post("/admin/users//delete") @admin_required def delete_user(user_id: str): _api("DELETE", f"/users/{user_id}", token=session["access_token"]) flash("User deleted.", "success") return redirect(url_for("admin.index")) @admin_bp.get("/admin/models") @admin_required def models(): """Show model cache status and list all models.""" return render_template("admin/models.html") # ── Admin API proxies (same-origin for browser JS) ──────────────────────── @admin_bp.get("/api/admin/videos") @admin_required def list_videos(): resp = _api("GET", "/admin/videos", token=session["access_token"]) return jsonify(resp.json()), resp.status_code @admin_bp.post("/api/admin/videos//retry") @admin_required def retry_video(job_id: str): resp = _api( "POST", f"/admin/videos/{job_id}/retry", token=session["access_token"]) return jsonify(resp.json()), resp.status_code @admin_bp.post("/api/admin/videos//cancel") @admin_required def cancel_video(job_id: str): resp = _api( "POST", f"/admin/videos/{job_id}/cancel", token=session["access_token"]) return jsonify(resp.json()), resp.status_code @admin_bp.delete("/api/admin/videos/") @admin_required def delete_video(job_id: str): resp = _api( "DELETE", f"/admin/videos/{job_id}", token=session["access_token"]) return jsonify(resp.json()), resp.status_code