fix: resolve all 64 mypy errors across backend

- Add dict[str, Any] / list[Any] type params throughout (fingerprint, models, schemas, scanner, status_checker)
- Add return type annotations to all route functions (nodes, edges, canvas, scan, auth, status, main)
- Fix no-any-return in security.py: cast pwd/jwt results to bool/str explicitly
- Fix canvas.py: use model_validate() for NodeResponse/EdgeResponse, rename db_node/db_edge upsert vars
- Fix scheduler.py: rename 'result' → 'check_result' to avoid type collision
- Fix get_db() return type: AsyncGenerator[AsyncSession, None]
- Add types-PyYAML for yaml import stubs
- Fix scanner.py: remove unnecessary type: ignore comment (nmap has stubs)
- Fix scan.py: wrap scalars().all() with list() for Sequence→list compatibility
This commit is contained in:
Pouzor
2026-03-07 15:48:41 +01:00
parent 1811afa749
commit 974e782057
17 changed files with 94 additions and 71 deletions
+19 -10
View File
@@ -1,4 +1,5 @@
from datetime import UTC, datetime
from typing import Any
from fastapi import APIRouter, Depends
from sqlalchemy import select
@@ -8,21 +9,29 @@ from app.api.deps import get_current_user
from app.db.database import get_db
from app.db.models import CanvasState, Edge, Node
from app.schemas.canvas import CanvasSaveRequest, CanvasStateResponse
from app.schemas.edges import EdgeResponse
from app.schemas.nodes import NodeResponse
router = APIRouter()
@router.get("", response_model=CanvasStateResponse)
async def load_canvas(db: AsyncSession = Depends(get_db), _: str = Depends(get_current_user)):
async def load_canvas(db: AsyncSession = Depends(get_db), _: str = Depends(get_current_user)) -> CanvasStateResponse:
nodes = (await db.execute(select(Node))).scalars().all()
edges = (await db.execute(select(Edge))).scalars().all()
state = await db.get(CanvasState, 1)
viewport = state.viewport if state else {"x": 0, "y": 0, "zoom": 1}
return CanvasStateResponse(nodes=list(nodes), edges=list(edges), viewport=viewport)
viewport: dict[str, Any] = state.viewport if state else {"x": 0, "y": 0, "zoom": 1}
return CanvasStateResponse(
nodes=[NodeResponse.model_validate(n) for n in nodes],
edges=[EdgeResponse.model_validate(e) for e in edges],
viewport=viewport,
)
@router.post("/save")
async def save_canvas(body: CanvasSaveRequest, db: AsyncSession = Depends(get_db), _: str = Depends(get_current_user)):
async def save_canvas(
body: CanvasSaveRequest, db: AsyncSession = Depends(get_db), _: str = Depends(get_current_user)
) -> dict[str, bool]:
incoming_node_ids = {n.id for n in body.nodes}
incoming_edge_ids = {e.id for e in body.edges}
@@ -42,19 +51,19 @@ async def save_canvas(body: CanvasSaveRequest, db: AsyncSession = Depends(get_db
# Upsert nodes
for node_data in body.nodes:
node = await db.get(Node, node_data.id)
if node:
db_node = await db.get(Node, node_data.id)
if db_node:
for field, value in node_data.model_dump().items():
setattr(node, field, value)
setattr(db_node, field, value)
else:
db.add(Node(**node_data.model_dump()))
# Upsert edges
for edge_data in body.edges:
edge = await db.get(Edge, edge_data.id)
if edge:
db_edge = await db.get(Edge, edge_data.id)
if db_edge:
for field, value in edge_data.model_dump().items():
setattr(edge, field, value)
setattr(db_edge, field, value)
else:
db.add(Edge(**edge_data.model_dump()))