Fix run deletion crash and transfer modal initialization error

Run deletion now properly cleans up boss_results, genlocke_transfers,
and genlocke_leg references before deleting the run. Also fix
showTransferModal being referenced before initialization in
RunEncounters by moving its useState declaration above useLegSurvivors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Julian Tabel
2026-02-09 11:28:22 +01:00
parent c5910ec75c
commit e1dac10d27
3 changed files with 35 additions and 4 deletions

View File

@@ -6,9 +6,11 @@ from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import joinedload, selectinload
from app.core.database import get_session
from app.models.boss_result import BossResult
from app.models.encounter import Encounter
from app.models.game import Game
from app.models.genlocke import Genlocke, GenlockeLeg
from app.models.genlocke_transfer import GenlockeTransfer
from app.models.nuzlocke_run import NuzlockeRun
from app.schemas.run import RunCreate, RunDetailResponse, RunGenlockeContext, RunResponse, RunUpdate
@@ -198,13 +200,42 @@ async def delete_run(
if run is None:
raise HTTPException(status_code=404, detail="Run not found")
# Delete associated encounters first
# Delete associated boss results first
boss_results = await session.execute(
select(BossResult).where(BossResult.run_id == run_id)
)
for br in boss_results.scalars():
await session.delete(br)
# Delete genlocke transfers referencing this run's encounters
encounter_ids_result = await session.execute(
select(Encounter.id).where(Encounter.run_id == run_id)
)
encounter_ids = [row[0] for row in encounter_ids_result]
if encounter_ids:
transfers = await session.execute(
select(GenlockeTransfer).where(
GenlockeTransfer.source_encounter_id.in_(encounter_ids)
| GenlockeTransfer.target_encounter_id.in_(encounter_ids)
)
)
for t in transfers.scalars():
await session.delete(t)
# Delete associated encounters
encounters = await session.execute(
select(Encounter).where(Encounter.run_id == run_id)
)
for enc in encounters.scalars():
await session.delete(enc)
# Unlink from any genlocke leg
leg_result = await session.execute(
select(GenlockeLeg).where(GenlockeLeg.run_id == run_id)
)
for leg in leg_result.scalars():
leg.run_id = None
await session.delete(run)
await session.commit()
return Response(status_code=204)