admin.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from fastapi import APIRouter, Depends, HTTPException, Query
  2. from typing import List, Optional
  3. import db
  4. import auth_utils
  5. router = APIRouter(prefix="/admin", tags=["admin"])
  6. @router.get("/audit-logs")
  7. async def get_audit_logs(
  8. page: int = Query(1, ge=1),
  9. size: int = Query(50, ge=1, le=100),
  10. action: Optional[str] = None,
  11. token: str = Depends(auth_utils.oauth2_scheme)
  12. ):
  13. payload = auth_utils.decode_token(token)
  14. if not payload or payload.get("role") != 'admin':
  15. raise HTTPException(status_code=403, detail="Admin role required")
  16. offset = (page - 1) * size
  17. query = """
  18. SELECT a.*, u.email as user_email
  19. FROM audit_logs a
  20. LEFT JOIN users u ON a.user_id = u.id
  21. """
  22. params = []
  23. if action:
  24. query += " WHERE a.action = %s"
  25. params.append(action)
  26. query += " ORDER BY a.created_at DESC LIMIT %s OFFSET %s"
  27. params.extend([size, offset])
  28. logs = db.execute_query(query, tuple(params))
  29. # Total count for pagination
  30. count_query = "SELECT COUNT(*) as total FROM audit_logs"
  31. if action:
  32. count_query += " WHERE action = %s"
  33. total = db.execute_query(count_query, (action,))
  34. else:
  35. total = db.execute_query(count_query)
  36. return {
  37. "logs": logs,
  38. "total": total[0]['total'],
  39. "page": page,
  40. "size": size
  41. }