gateway.py 2.3 KB

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