From 45fb390cb7a78b44d0a0f25e5d81921229691d13 Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 6 Aug 2026 16:08:26 +0000 Subject: [PATCH] feat(crud): add NetObjectCreate, NetObjectUpdate, RelationCreate, RelationUpdate schemas --- backend/app/schemas.py | 70 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/backend/app/schemas.py b/backend/app/schemas.py index fb58ec8..69494d6 100644 --- a/backend/app/schemas.py +++ b/backend/app/schemas.py @@ -36,6 +36,10 @@ class HealthResponse(BaseModel): checks: Dict[str, HealthCheck] = Field(default_factory=dict) +# --------------------------------------------------------------------------- +# NetObject +# --------------------------------------------------------------------------- + class NetObject(BaseModel): id: str name: str @@ -51,6 +55,32 @@ class NetObject(BaseModel): updated_at: datetime +class NetObjectCreate(BaseModel): + name: str + type: ObjectType + parent_id: Optional[str] = None + status: ObjectStatus = 'active' + vendor: Optional[str] = None + model: Optional[str] = None + serial: Optional[str] = None + notes: Optional[str] = None + + +class NetObjectUpdate(BaseModel): + name: Optional[str] = None + type: Optional[ObjectType] = None + parent_id: Optional[str] = None + status: Optional[ObjectStatus] = None + vendor: Optional[str] = None + model: Optional[str] = None + serial: Optional[str] = None + notes: Optional[str] = None + + +# --------------------------------------------------------------------------- +# IPAddress / Subnet / Link (read-only for now) +# --------------------------------------------------------------------------- + class IPAddress(BaseModel): id: str address: str @@ -83,6 +113,10 @@ class Link(BaseModel): source: Literal['manual', 'snmp', 'lldp', 'arp', 'import', 'inference'] +# --------------------------------------------------------------------------- +# Relation +# --------------------------------------------------------------------------- + class Relation(BaseModel): id: str type: RelationType @@ -98,6 +132,34 @@ class Relation(BaseModel): updated_at: datetime +class RelationCreate(BaseModel): + type: RelationType + layer: RelationLayer + source_id: str + target_id: str + direction: RelationDirection = 'forward' + source: RelationSource = 'manual' + confidence: float = Field(ge=0, le=1, default=1.0) + status: RelationStatus = 'active' + attributes: Dict[str, Any] = Field(default_factory=dict) + + +class RelationUpdate(BaseModel): + type: Optional[RelationType] = None + layer: Optional[RelationLayer] = None + source_id: Optional[str] = None + target_id: Optional[str] = None + direction: Optional[RelationDirection] = None + source: Optional[RelationSource] = None + confidence: Optional[float] = Field(ge=0, le=1, default=None) + status: Optional[RelationStatus] = None + attributes: Optional[Dict[str, Any]] = None + + +# --------------------------------------------------------------------------- +# Tree / Context +# --------------------------------------------------------------------------- + class InventoryTreeNode(BaseModel): id: str name: str @@ -120,6 +182,10 @@ class NodeContext(BaseModel): relations: NodeContextRelations = Field(default_factory=NodeContextRelations) +# --------------------------------------------------------------------------- +# Jobs / Discovery +# --------------------------------------------------------------------------- + class Job(BaseModel): id: str type: str @@ -158,6 +224,10 @@ class DiscoveryRun(BaseModel): finished_at: Optional[datetime] = None +# --------------------------------------------------------------------------- +# Generic wrappers +# --------------------------------------------------------------------------- + class ListResponse(BaseModel, Generic[T]): count: int items: List[T]