admin.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import db
  2. import auth_utils
  3. import subprocess
  4. import os
  5. from fastapi import APIRouter, Depends, HTTPException, Query, BackgroundTasks, Request
  6. from dependencies import require_admin
  7. router = APIRouter(prefix="/admin", tags=["admin"])
  8. @router.get("/audit-logs")
  9. async def get_audit_logs(
  10. page: int = Query(1, ge=1),
  11. size: int = Query(50, ge=1, le=100),
  12. action: Optional[str] = None,
  13. admin: dict = Depends(require_admin)
  14. ):
  15. offset = (page - 1) * size
  16. query = """
  17. SELECT a.*, u.email as user_email
  18. FROM audit_logs a
  19. LEFT JOIN users u ON a.user_id = u.id
  20. """
  21. params = []
  22. if action:
  23. query += " WHERE a.action = %s"
  24. params.append(action)
  25. query += " ORDER BY a.created_at DESC LIMIT %s OFFSET %s"
  26. params.extend([size, offset])
  27. logs = db.execute_query(query, tuple(params))
  28. # Total count for pagination
  29. count_query = "SELECT COUNT(*) as total FROM audit_logs"
  30. if action:
  31. count_query += " WHERE action = %s"
  32. total = db.execute_query(count_query, (action,))
  33. else:
  34. total = db.execute_query(count_query)
  35. "page": page,
  36. "size": size
  37. }
  38. def run_deploy():
  39. """Фоновая задача для обновления сайта"""
  40. try:
  41. # Путь к корню проекта
  42. root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  43. # Выполняем цепочку команд
  44. cmd = f"cd {root_dir} && git pull && npm install && ./build_frontend.sh && sudo systemctl restart radionica-backend"
  45. subprocess.run(cmd, shell=True, check=True, capture_output=True)
  46. print("✅ Auto-deploy finished successfully")
  47. except Exception as e:
  48. print(f"❌ Auto-deploy failed: {e}")
  49. @router.post("/webhook/deploy")
  50. async def deploy_webhook(
  51. secret: str,
  52. background_tasks: BackgroundTasks
  53. ):
  54. # Секретный ключ для защиты от спама
  55. if secret != "NY9B9VLifDC9ehZ":
  56. raise HTTPException(status_code=403, detail="Invalid secret")
  57. background_tasks.add_task(run_deploy)
  58. return {"message": "Deployment triggered"}