77 lines
2.0 KiB
Python
77 lines
2.0 KiB
Python
"""Typed contracts for the Internal Alpha Miner Detail overview."""
|
|
|
|
from datetime import datetime
|
|
from typing import Literal
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
from app.inventory.models import InventoryMinerDetail
|
|
from app.locations.models import MinerLocationDetail
|
|
|
|
|
|
OperationalState = Literal[
|
|
"online", "offline", "unknown", "unstable", "repair", "spare", "retired"
|
|
]
|
|
|
|
|
|
class MinerDetailAccess(BaseModel):
|
|
can_view_locations: bool = False
|
|
can_read_repairs: bool = False
|
|
can_view_repairs: bool = False
|
|
can_read_components: bool = False
|
|
|
|
|
|
class MinerDetailLocationSection(BaseModel):
|
|
available: bool
|
|
restricted: bool
|
|
location: MinerLocationDetail | None = None
|
|
|
|
|
|
class MinerDetailRepairEpisode(BaseModel):
|
|
repair_id: UUID | None = None
|
|
source: Literal["modular", "legacy"]
|
|
active: bool
|
|
status: str
|
|
reason: str | None = None
|
|
opened_at: datetime | None = None
|
|
closed_at: datetime | None = None
|
|
latest_context: str | None = None
|
|
latest_context_at: datetime | None = None
|
|
parts_count: int | None = None
|
|
parts_summary: list[str] = Field(default_factory=list)
|
|
|
|
|
|
class MinerDetailRepairSection(BaseModel):
|
|
available: bool
|
|
restricted: bool
|
|
active_repair: MinerDetailRepairEpisode | None = None
|
|
episodes: list[MinerDetailRepairEpisode] = Field(default_factory=list)
|
|
|
|
|
|
class MinerDetailCapabilities(BaseModel):
|
|
can_view_map: bool = False
|
|
can_open_repair_center: bool = False
|
|
can_read_repair_history: bool = False
|
|
can_read_components: bool = False
|
|
|
|
|
|
class MinerDetailOverviewData(BaseModel):
|
|
miner: InventoryMinerDetail
|
|
operational_state: OperationalState
|
|
location: MinerDetailLocationSection
|
|
repair: MinerDetailRepairSection
|
|
capabilities: MinerDetailCapabilities
|
|
|
|
|
|
class MinerDetailOverviewMeta(BaseModel):
|
|
generated_at: datetime
|
|
database_query_count: int = Field(ge=1, le=3)
|
|
|
|
|
|
class MinerDetailOverviewResponse(BaseModel):
|
|
data: MinerDetailOverviewData
|
|
meta: MinerDetailOverviewMeta
|
|
error: None = None
|
|
|