refactor(topology): introduce TopologyRepository protocol with DTO return types
Replace repo: BaseRepository with a structural TopologyRepository protocol in persistence.py and allocator.py. All read methods now return typed DTOs (TopologySummary, LANRow, DeckyRow, EdgeRow) instead of raw dicts, eliminating silent field-shape regressions across the topology subsystem. TopologySummary gains email_personas and language_default so api_personas.py can continue reading those fields via attribute access. hydrate() converts DTOs to dicts before passing to _backfill_decky_configs, keeping the mutable working-state function dict-based at its boundary. All production callers (router handlers, mutator, CLI, heartbeat) migrated from dict/get access to attribute access. 134 tests pass.
This commit is contained in:
@@ -6,6 +6,7 @@ from typing import Any, Optional
|
||||
from sqlalchemy import desc, select, text
|
||||
|
||||
from decnet.web.db.models import TopologyEdge, TopologyStatusEvent
|
||||
from decnet.web.db.models.topology import EdgeRow
|
||||
|
||||
|
||||
class TopologyEdgesMixin:
|
||||
@@ -60,12 +61,12 @@ class TopologyEdgesMixin:
|
||||
|
||||
async def list_topology_edges(
|
||||
self, topology_id: str
|
||||
) -> list[dict[str, Any]]:
|
||||
) -> list[EdgeRow]:
|
||||
async with self._session() as session:
|
||||
result = await session.execute(
|
||||
select(TopologyEdge).where(TopologyEdge.topology_id == topology_id)
|
||||
)
|
||||
return [r.model_dump(mode="json") for r in result.scalars().all()]
|
||||
return [EdgeRow.model_validate(r.model_dump(mode="json")) for r in result.scalars().all()]
|
||||
|
||||
async def list_topology_status_events(
|
||||
self, topology_id: str, limit: int = 100
|
||||
|
||||
Reference in New Issue
Block a user