logs.py 1000 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from typing import List, Optional
  4. from fastapi import APIRouter, Query
  5. from pydantic import BaseModel
  6. from app.db import get_pool
  7. router = APIRouter(tags=["logs"])
  8. class AccessLogOut(BaseModel):
  9. id: int
  10. ip: str
  11. method: str
  12. path: str
  13. status_code: int
  14. latency_ms: float
  15. country: str
  16. city: str
  17. latitude: Optional[float]
  18. longitude: Optional[float]
  19. created_at: datetime
  20. @router.get("/logs", response_model=List[AccessLogOut])
  21. async def get_logs(
  22. page: int = Query(default=1, ge=1),
  23. page_size: int = Query(default=50, ge=1, le=500),
  24. ) -> List[AccessLogOut]:
  25. offset = (page - 1) * page_size
  26. pool = get_pool()
  27. async with pool.acquire() as conn:
  28. rows = await conn.fetch(
  29. "SELECT * FROM access_logs ORDER BY created_at DESC LIMIT $1 OFFSET $2",
  30. page_size,
  31. offset,
  32. )
  33. return [AccessLogOut(**dict(row)) for row in rows]