device_api.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. """
  2. Pydantic schemas for Device API (hardware devices).
  3. """
  4. from datetime import datetime
  5. from typing import Any
  6. from pydantic import BaseModel, Field
  7. class DeviceAuthRequest(BaseModel):
  8. """Device authentication request."""
  9. mac_address: str = Field(
  10. ...,
  11. description="MAC address of the device",
  12. pattern=r"^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$",
  13. )
  14. class DeviceAuthResponse(BaseModel):
  15. """Device authentication response."""
  16. access_token: str
  17. token_type: str = "bearer"
  18. device_id: int
  19. simple_id: int
  20. organization_id: int | None
  21. class DeviceConfigResponse(BaseModel):
  22. """Device configuration response."""
  23. device_id: int
  24. simple_id: int
  25. organization_id: int | None
  26. config: dict[str, Any]
  27. status: str
  28. class HeartbeatRequest(BaseModel):
  29. """Device heartbeat request."""
  30. status: str = Field(..., description="Device status: online, offline, error")
  31. metadata: dict[str, Any] | None = Field(
  32. None, description="Additional device metadata"
  33. )
  34. class HeartbeatResponse(BaseModel):
  35. """Device heartbeat response."""
  36. success: bool
  37. last_seen_at: datetime
  38. class DeviceEvent(BaseModel):
  39. """Single device event."""
  40. event_type: str = Field(
  41. ..., description="Event type: wifi_probe, ble_scan, etc."
  42. )
  43. timestamp: datetime
  44. data: dict[str, Any]
  45. class DeviceEventsRequest(BaseModel):
  46. """Batch device events request."""
  47. events: list[DeviceEvent] = Field(
  48. ..., description="List of events to process", max_length=1000
  49. )
  50. class DeviceEventsResponse(BaseModel):
  51. """Device events response."""
  52. success: bool
  53. processed: int
  54. failed: int = 0
  55. errors: list[str] | None = None