admin.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from fastapi import APIRouter, Depends, HTTPException, Query
  2. from typing import List, Optional
  3. import db
  4. import auth_utils
  5. from dependencies import require_admin
  6. router = APIRouter(prefix="/admin", tags=["admin"])
  7. @router.get("/audit-logs")
  8. async def get_audit_logs(
  9. page: int = Query(1, ge=1),
  10. size: int = Query(50, ge=1, le=100),
  11. action: Optional[str] = None,
  12. admin: dict = Depends(require_admin)
  13. ):
  14. offset = (page - 1) * size
  15. query = """
  16. SELECT a.*, u.email as user_email,
  17. u2.email as target_user_email,
  18. o.first_name as target_order_name
  19. FROM audit_logs a
  20. LEFT JOIN users u ON a.user_id = u.id
  21. LEFT JOIN users u2 ON (a.target_type = 'user' AND a.target_id = u2.id)
  22. LEFT JOIN orders o ON (a.target_type = 'order' AND a.target_id = o.id)
  23. """
  24. params = []
  25. if action:
  26. query += " WHERE a.action = %s"
  27. params.append(action)
  28. query += " ORDER BY a.created_at DESC LIMIT %s OFFSET %s"
  29. params.extend([size, offset])
  30. logs = db.execute_query(query, tuple(params))
  31. # Total count for pagination
  32. count_query = "SELECT COUNT(*) as total FROM audit_logs"
  33. if action:
  34. count_query += " WHERE action = %s"
  35. total = db.execute_query(count_query, (action,))
  36. else:
  37. total = db.execute_query(count_query)
  38. return {
  39. "logs": logs,
  40. "total": total[0]['total'],
  41. "page": page,
  42. "size": size
  43. }
  44. @router.get("/reviews")
  45. async def get_admin_reviews(
  46. page: int = Query(1, ge=1),
  47. size: int = Query(50, ge=1, le=100),
  48. admin: dict = Depends(require_admin)
  49. ):
  50. offset = (page - 1) * size
  51. query = """
  52. SELECT id, first_name, last_name, email, rating, review_text, review_approved, created_at
  53. FROM orders
  54. WHERE review_text IS NOT NULL AND review_text != ''
  55. ORDER BY created_at DESC
  56. LIMIT %s OFFSET %s
  57. """
  58. results = db.execute_query(query, (size, offset))
  59. count_res = db.execute_query("SELECT COUNT(*) as total FROM orders WHERE review_text IS NOT NULL AND review_text != ''")
  60. results_total = count_res[0]['total'] if count_res else 0
  61. return {"reviews": results, "total": results_total}