# SPDX-License-Identifier: AGPL-3.0-or-later from __future__ import annotations from typing import Any, Optional, Protocol from decnet.web.db.models.topology import DeckyRow, EdgeRow, LANRow, TopologySummary class TopologyRepository(Protocol): """Structural contract for the topology subsystem's repo dependency. Declares only the 10 methods the topology package actually calls. Any object with matching async signatures satisfies this Protocol without inheritance — including BaseRepository and test stubs. """ async def create_topology(self, data: dict[str, Any]) -> str: ... async def get_topology(self, topology_id: str) -> Optional[TopologySummary]: ... async def update_topology_status( self, topology_id: str, new_status: str, reason: Optional[str] = None ) -> None: ... async def list_topologies( self, status: Optional[str] = None ) -> list[TopologySummary]: ... async def add_lan(self, data: dict[str, Any]) -> str: ... async def list_lans_for_topology(self, topology_id: str) -> list[LANRow]: ... async def add_topology_decky(self, data: dict[str, Any]) -> str: ... async def list_topology_deckies(self, topology_id: str) -> list[DeckyRow]: ... async def add_topology_edge(self, data: dict[str, Any]) -> str: ... async def list_topology_edges(self, topology_id: str) -> list[EdgeRow]: ...