66 lines
1.4 KiB
Python
66 lines
1.4 KiB
Python
"""Typed contracts for the Repairs domain."""
|
|
|
|
from datetime import datetime
|
|
from typing import Literal
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
RepairReason = Literal[
|
|
"HARDWARE_FAILURE",
|
|
"LOW_HASHRATE",
|
|
"CONTROL_BOARD",
|
|
"HASHBOARD",
|
|
"PSU",
|
|
"FAN",
|
|
"OVERHEATING",
|
|
"NETWORKING",
|
|
"PREVENTIVE_MAINTENANCE",
|
|
"INSPECTION",
|
|
"OTHER",
|
|
]
|
|
RepairStatus = Literal[
|
|
"OPEN",
|
|
"IN_PROGRESS",
|
|
"WAITING_FOR_PARTS",
|
|
"READY_FOR_TEST",
|
|
"COMPLETED",
|
|
"CANCELLED",
|
|
]
|
|
RepairEventType = Literal["REPAIR_STARTED", "INITIAL_NOTE"]
|
|
RepairEligibleLifecycle = Literal["active", "spare"]
|
|
|
|
|
|
class BeginRepairRequest(BaseModel):
|
|
model_config = ConfigDict(extra="forbid")
|
|
|
|
miner_id: UUID
|
|
reason: RepairReason
|
|
notes: str | None = Field(default=None, max_length=4000)
|
|
|
|
|
|
class RepairStartedPayload(BaseModel):
|
|
reason: RepairReason
|
|
from_lifecycle: RepairEligibleLifecycle
|
|
to_lifecycle: Literal["in_repair"] = "in_repair"
|
|
|
|
|
|
class InitialRepairNotePayload(BaseModel):
|
|
note: str = Field(min_length=1, max_length=4000)
|
|
|
|
|
|
class BeginRepairResult(BaseModel):
|
|
repair_id: UUID
|
|
miner_id: UUID
|
|
status: Literal["OPEN"]
|
|
reason: RepairReason
|
|
opened_at: datetime
|
|
opened_by: UUID
|
|
|
|
|
|
class BeginRepairResponse(BaseModel):
|
|
data: BeginRepairResult
|
|
meta: dict[str, object] = Field(default_factory=dict)
|
|
error: None = None
|