From 95d4e4be75c79342ab7e7055c3a60459a570be59 Mon Sep 17 00:00:00 2001 From: Roberto Date: Wed, 10 Jun 2026 18:16:59 +0200 Subject: [PATCH] fix(scouts): delete cloud scout via Core delete to avoid varchar=uuid cascade error The run_logs relationship joins scout_run_logs.scout_id (varchar) to cloud_scout_configs.id (uuid); Postgres has no varchar=uuid operator so the ORM cascade on db.delete(scout) 500'd. Core deletes bypass it; triage queue rows cascade via FK ondelete. --- app/api/routes/scouts.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/api/routes/scouts.py b/app/api/routes/scouts.py index 81e6552..68a64b4 100644 --- a/app/api/routes/scouts.py +++ b/app/api/routes/scouts.py @@ -26,7 +26,7 @@ from datetime import datetime, timezone from fastapi import APIRouter, Depends, HTTPException, status from fastapi.responses import RedirectResponse -from sqlalchemy import func, select +from sqlalchemy import delete as sa_delete, func, select from sqlalchemy.ext.asyncio import AsyncSession from pydantic import BaseModel @@ -371,7 +371,12 @@ async def delete_cloud_scout( scout = await db.get(CloudScoutConfig, scout_id) if scout is None or scout.user_id != current_user.id: raise HTTPException(status.HTTP_404_NOT_FOUND, "Scout not found") - await db.delete(scout) + # Core deletes bypass the polymorphic ScoutRunLog relationship whose + # varchar scout_id vs uuid id join is not directly comparable in Postgres. + # scout_run_logs.scout_id is a plain string (matches the str scout_id); + # scout_triage_queue rows cascade automatically via their FK ondelete. + await db.execute(sa_delete(ScoutRunLog).where(ScoutRunLog.scout_id == scout_id)) + await db.execute(sa_delete(CloudScoutConfig).where(CloudScoutConfig.id == scout_id)) await db.commit() return {"ok": True}