Spaces:
Running
Running
| from fastapi import APIRouter, HTTPException, Request | |
| from config.database import get_supabase_admin | |
| from middleware.admin_guard import get_admin_user | |
| from services.email import send_ticket_reply_to_user | |
| router = APIRouter(prefix="/api/cn-admin-nc-0947", tags=["admin"]) | |
| async def get_stats(request: Request): | |
| await get_admin_user(request) | |
| db = get_supabase_admin() | |
| users = db.table("users").select("id", count="exact").execute() | |
| analyses = db.table("analyses").select("id", count="exact").execute() | |
| tickets = db.table("support_tickets").select("id", count="exact").eq("status", "open").execute() | |
| subs = db.table("challenge_submissions").select("id", count="exact").execute() | |
| return { | |
| "total_users": users.count or 0, | |
| "total_analyses": analyses.count or 0, | |
| "open_tickets": tickets.count or 0, | |
| "total_submissions": subs.count or 0, | |
| } | |
| async def get_users(request: Request, page: int = 1): | |
| await get_admin_user(request) | |
| db = get_supabase_admin() | |
| offset = (page - 1) * 50 | |
| result = db.table("users").select("*").order("created_at", desc=True).range(offset, offset + 49).execute() | |
| return result.data or [] | |
| async def ban_user(user_id: str, request: Request): | |
| await get_admin_user(request) | |
| body = await request.json() | |
| db = get_supabase_admin() | |
| db.table("users").update({"is_banned": body.get("is_banned", True)}).eq("id", user_id).execute() | |
| return {"message": "User ban status updated"} | |
| async def change_role(user_id: str, request: Request): | |
| await get_admin_user(request) | |
| body = await request.json() | |
| db = get_supabase_admin() | |
| db.table("users").update({"role": body.get("role", "free")}).eq("id", user_id).execute() | |
| return {"message": "Role updated"} | |
| async def delete_user(user_id: str, request: Request): | |
| await get_admin_user(request) | |
| db = get_supabase_admin() | |
| db.table("analyses").delete().eq("user_id", user_id).execute() | |
| db.table("challenge_submissions").delete().eq("user_id", user_id).execute() | |
| db.table("users").delete().eq("id", user_id).execute() | |
| try: | |
| db.auth.admin.delete_user(user_id) | |
| except Exception: | |
| pass | |
| return {"message": "User deleted"} | |
| async def create_challenge(request: Request): | |
| user = await get_admin_user(request) | |
| body = await request.json() | |
| db = get_supabase_admin() | |
| body["created_by"] = str(user.id) | |
| body.setdefault("status", "published") | |
| body.setdefault("starter_code", {}) | |
| body.setdefault("test_cases", []) | |
| result = db.table("challenges").insert(body).execute() | |
| return result.data[0] if result.data else {} | |
| async def update_challenge(challenge_id: str, request: Request): | |
| await get_admin_user(request) | |
| body = await request.json() | |
| db = get_supabase_admin() | |
| db.table("challenges").update(body).eq("id", challenge_id).execute() | |
| return {"message": "Challenge updated"} | |
| async def delete_challenge(challenge_id: str, request: Request): | |
| await get_admin_user(request) | |
| db = get_supabase_admin() | |
| db.table("challenges").delete().eq("id", challenge_id).execute() | |
| return {"message": "Challenge deleted"} | |
| async def get_tickets(request: Request, status: str = ""): | |
| await get_admin_user(request) | |
| db = get_supabase_admin() | |
| query = db.table("support_tickets").select("*").order("created_at", desc=True) | |
| if status: | |
| query = query.eq("status", status) | |
| return query.execute().data or [] | |
| async def reply_ticket(ticket_id: str, request: Request): | |
| await get_admin_user(request) | |
| body = await request.json() | |
| reply = body.get("reply", "") | |
| db = get_supabase_admin() | |
| ticket = db.table("support_tickets").select("*").eq("id", ticket_id).single().execute() | |
| if not ticket.data: | |
| raise HTTPException(status_code=404, detail="Ticket not found") | |
| db.table("support_tickets").update({"admin_reply": reply, "status": "resolved"}).eq("id", ticket_id).execute() | |
| try: | |
| await send_ticket_reply_to_user(ticket.data["user_email"], reply) | |
| except Exception: | |
| pass | |
| return {"message": "Reply sent"} | |
| async def create_blog_post(request: Request): | |
| user = await get_admin_user(request) | |
| body = await request.json() | |
| db = get_supabase_admin() | |
| body["author_id"] = str(user.id) | |
| body.setdefault("status", "draft") | |
| result = db.table("blog_posts").insert(body).execute() | |
| return result.data[0] if result.data else {} | |
| async def update_blog_post(post_id: str, request: Request): | |
| await get_admin_user(request) | |
| body = await request.json() | |
| db = get_supabase_admin() | |
| db.table("blog_posts").update(body).eq("id", post_id).execute() | |
| return {"message": "Post updated"} | |
| async def delete_blog_post(post_id: str, request: Request): | |
| await get_admin_user(request) | |
| db = get_supabase_admin() | |
| db.table("blog_posts").delete().eq("id", post_id).execute() | |
| return {"message": "Post deleted"} | |
| async def create_announcement(request: Request): | |
| await get_admin_user(request) | |
| body = await request.json() | |
| db = get_supabase_admin() | |
| db.table("announcements").update({"is_active": False}).eq("is_active", True).execute() | |
| result = db.table("announcements").insert({"message": body.get("message"), "is_active": True}).execute() | |
| return result.data[0] if result.data else {} | |
| async def get_security_logs(request: Request): | |
| await get_admin_user(request) | |
| db = get_supabase_admin() | |
| result = db.table("security_logs").select("*").order("created_at", desc=True).limit(200).execute() | |
| return result.data or [] | |
| async def get_site_settings(request: Request): | |
| await get_admin_user(request) | |
| db = get_supabase_admin() | |
| result = db.table("site_settings").select("*").execute() | |
| return result.data or [] | |
| async def update_site_setting(key: str, request: Request): | |
| await get_admin_user(request) | |
| body = await request.json() | |
| db = get_supabase_admin() | |
| db.table("site_settings").update({"value": body.get("value")}).eq("key", key).execute() | |
| return {"message": f"Setting {key} updated"} | |