import db import auth_utils import subprocess import os from fastapi import APIRouter, Depends, HTTPException, Query, BackgroundTasks, Request from dependencies import require_admin router = APIRouter(prefix="/admin", tags=["admin"]) @router.get("/audit-logs") async def get_audit_logs( page: int = Query(1, ge=1), size: int = Query(50, ge=1, le=100), action: Optional[str] = None, admin: dict = Depends(require_admin) ): offset = (page - 1) * size query = """ SELECT a.*, u.email as user_email FROM audit_logs a LEFT JOIN users u ON a.user_id = u.id """ params = [] if action: query += " WHERE a.action = %s" params.append(action) query += " ORDER BY a.created_at DESC LIMIT %s OFFSET %s" params.extend([size, offset]) logs = db.execute_query(query, tuple(params)) # Total count for pagination count_query = "SELECT COUNT(*) as total FROM audit_logs" if action: count_query += " WHERE action = %s" total = db.execute_query(count_query, (action,)) else: total = db.execute_query(count_query) "page": page, "size": size } def run_deploy(): """Фоновая задача для обновления сайта""" try: # Путь к корню проекта root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Выполняем цепочку команд cmd = f"cd {root_dir} && git pull && npm install && ./build_frontend.sh && sudo systemctl restart radionica-backend" subprocess.run(cmd, shell=True, check=True, capture_output=True) print("✅ Auto-deploy finished successfully") except Exception as e: print(f"❌ Auto-deploy failed: {e}") @router.post("/webhook/deploy") async def deploy_webhook( secret: str, background_tasks: BackgroundTasks ): # Секретный ключ для защиты от спама if secret != "NY9B9VLifDC9ehZ": raise HTTPException(status_code=403, detail="Invalid secret") background_tasks.add_task(run_deploy) return {"message": "Deployment triggered"}