37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
"""Typed contracts for the minimal component registry."""
|
|
|
|
from typing import Literal
|
|
from uuid import UUID
|
|
|
|
from pydantic import AwareDatetime, BaseModel, ConfigDict, Field
|
|
|
|
|
|
ComponentType = Literal["control_board", "hashboard", "power_supply", "fan"]
|
|
|
|
|
|
class ComponentCreateRequest(BaseModel):
|
|
model_config = ConfigDict(extra="forbid", str_strip_whitespace=True)
|
|
|
|
component_type: ComponentType
|
|
asset_id: str | None = Field(default=None, max_length=255)
|
|
manufacturer: str | None = Field(default=None, max_length=255)
|
|
model: str | None = Field(default=None, max_length=255)
|
|
manufacturer_serial: str | None = Field(default=None, max_length=255)
|
|
|
|
|
|
class ComponentDetail(BaseModel):
|
|
component_id: UUID
|
|
component_type: ComponentType
|
|
asset_id: str | None = None
|
|
manufacturer: str | None = None
|
|
model: str | None = None
|
|
manufacturer_serial: str | None = None
|
|
created_at: AwareDatetime
|
|
created_by: UUID
|
|
|
|
|
|
class ComponentResponse(BaseModel):
|
|
data: ComponentDetail
|
|
meta: dict[str, object] = Field(default_factory=dict)
|
|
error: None = None
|