"""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