|
17 | 17 | Page, |
18 | 18 | Repository, |
19 | 19 | ) |
20 | | -from repowise.server.deps import get_db_session, verify_api_key |
| 20 | +from repowise.server.deps import get_db_session, get_fts, verify_api_key |
21 | 21 | from repowise.server.job_executor import execute_job |
22 | 22 | from repowise.server.schemas import RepoCreate, RepoResponse, RepoStatsResponse, RepoUpdate |
23 | 23 |
|
@@ -94,6 +94,30 @@ async def update_repo( |
94 | 94 | return RepoResponse.from_orm(repo) |
95 | 95 |
|
96 | 96 |
|
| 97 | +@router.delete("/{repo_id}") |
| 98 | +async def delete_repo( |
| 99 | + repo_id: str, |
| 100 | + session: AsyncSession = Depends(get_db_session), # noqa: B008 |
| 101 | + fts=Depends(get_fts), # noqa: B008 |
| 102 | +) -> dict: |
| 103 | + """Delete a repository and all its data.""" |
| 104 | + repo = await crud.get_repository(session, repo_id) |
| 105 | + if repo is None: |
| 106 | + raise HTTPException(status_code=404, detail="Repository not found") |
| 107 | + |
| 108 | + # Collect page IDs before CASCADE deletes the Page rows |
| 109 | + page_ids = await crud.list_page_ids(session, repo_id) |
| 110 | + |
| 111 | + # Clean up FTS index (FTS5 virtual table has no FK cascade) |
| 112 | + if fts is not None: |
| 113 | + await fts.delete_many(page_ids) |
| 114 | + |
| 115 | + # Delete repository — CASCADE handles all child ORM tables |
| 116 | + await crud.delete_repository(session, repo_id) |
| 117 | + |
| 118 | + return {"ok": True, "deleted_pages": len(page_ids)} |
| 119 | + |
| 120 | + |
97 | 121 | @router.get("/{repo_id}/stats", response_model=RepoStatsResponse) |
98 | 122 | async def get_repo_stats( |
99 | 123 | repo_id: str, |
|
0 commit comments