gateway.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from datetime import datetime
  2. from typing import TYPE_CHECKING, Literal
  3. from pydantic import BaseModel
  4. if TYPE_CHECKING:
  5. from app.db.models import ApiKey, GatewayRequestAudit
  6. class DownstreamServiceHealth(BaseModel):
  7. service: str
  8. status: str
  9. url: str
  10. status_code: int | None = None
  11. error_message: str | None = None
  12. class GatewayServicesHealthResponse(BaseModel):
  13. service: str = "api-gateway"
  14. status: str
  15. downstream_services: list[DownstreamServiceHealth]
  16. class GatewayRequestAuditResponse(BaseModel):
  17. id: str
  18. request_id: str
  19. method: str
  20. path: str
  21. query_string: str | None = None
  22. target_service: str | None = None
  23. target_url: str | None = None
  24. status_code: int | None = None
  25. duration_ms: int
  26. client_host: str | None = None
  27. user_agent: str | None = None
  28. error_message: str | None = None
  29. created_time: datetime
  30. @classmethod
  31. def from_entity(cls, entity: "GatewayRequestAudit") -> "GatewayRequestAuditResponse":
  32. return cls.model_validate(entity, from_attributes=True)
  33. class GatewayAuditServiceStats(BaseModel):
  34. target_service: str
  35. request_count: int
  36. error_count: int
  37. average_duration_ms: float
  38. class GatewayAuditStatsResponse(BaseModel):
  39. total_request_count: int
  40. total_error_count: int
  41. services: list[GatewayAuditServiceStats]
  42. class ApiKeyCreateRequest(BaseModel):
  43. name: str
  44. scopes: str | None = None
  45. expires_time: datetime | None = None
  46. class ApiKeyCreateResponse(BaseModel):
  47. id: str
  48. name: str
  49. key_prefix: str
  50. api_key: str
  51. status: str
  52. scopes: str | None = None
  53. expires_time: datetime | None = None
  54. created_time: datetime
  55. class ApiKeyResponse(BaseModel):
  56. id: str
  57. name: str
  58. key_prefix: str
  59. status: str
  60. scopes: str | None = None
  61. expires_time: datetime | None = None
  62. last_used_time: datetime | None = None
  63. created_time: datetime
  64. @classmethod
  65. def from_entity(cls, entity: "ApiKey") -> "ApiKeyResponse":
  66. return cls.model_validate(entity, from_attributes=True)
  67. ApiKeyStatus = Literal["active", "disabled", "revoked"]
  68. class ApiKeyStatusUpdateRequest(BaseModel):
  69. status: ApiKeyStatus