| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- 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"}
|