added delete option
This commit is contained in:
@@ -22,6 +22,8 @@ from src.server.models.anime import (
|
||||
AnimeSettingsRegenerateNfoResponse,
|
||||
AnimeSettingsResponse,
|
||||
AnimeSettingsUpdateRequest,
|
||||
DeleteSeriesRequest,
|
||||
DeleteSeriesResult,
|
||||
TMDBSearchResult,
|
||||
)
|
||||
from src.server.services.anime_service import AnimeService, AnimeServiceError
|
||||
@@ -1755,3 +1757,83 @@ async def regenerate_anime_nfo(
|
||||
nfo_path=db_series.nfo_path,
|
||||
repaired_tags=repaired_tags,
|
||||
)
|
||||
|
||||
|
||||
@router.delete(
|
||||
"/{anime_key}",
|
||||
response_model=DeleteSeriesResult,
|
||||
)
|
||||
async def delete_anime(
|
||||
anime_key: str,
|
||||
request: DeleteSeriesRequest,
|
||||
_auth: dict = Depends(require_auth),
|
||||
anime_service: AnimeService = Depends(get_anime_service),
|
||||
) -> DeleteSeriesResult:
|
||||
"""Delete an anime series from database, filesystem, or both.
|
||||
|
||||
Requires typing exactly 'delete' in the confirm_text field to prevent
|
||||
accidental deletions. Users can choose to remove the series from the
|
||||
database only, delete the folder only, or both.
|
||||
|
||||
Args:
|
||||
anime_key: Series key from URL path (primary identifier)
|
||||
request: DeleteSeriesRequest with delete options and confirmation
|
||||
_auth: Ensures the caller is authenticated
|
||||
anime_service: AnimeService dependency
|
||||
|
||||
Returns:
|
||||
DeleteSeriesResult with outcome details
|
||||
|
||||
Raises:
|
||||
HTTPException(400): confirm_text != "delete" or no options selected
|
||||
HTTPException(404): Series not found
|
||||
HTTPException(500): Unexpected error
|
||||
"""
|
||||
# Validate confirm_text
|
||||
if request.confirm_text != "delete":
|
||||
logger.warning(
|
||||
"Delete anime rejected - invalid confirm_text: key=%s",
|
||||
anime_key,
|
||||
)
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=(
|
||||
"Confirmation text must be exactly 'delete'. "
|
||||
f"Got '{request.confirm_text}'."
|
||||
),
|
||||
)
|
||||
|
||||
# Validate at least one option is selected
|
||||
if not request.delete_database and not request.delete_folder:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="At least one of delete_database or delete_folder must be True.",
|
||||
)
|
||||
|
||||
try:
|
||||
result = await anime_service.delete_series(
|
||||
key=anime_key,
|
||||
delete_database=request.delete_database,
|
||||
delete_folder=request.delete_folder,
|
||||
)
|
||||
|
||||
if not result.success and not result.deleted_from_database:
|
||||
# This means series was not found (key="" was passed as name)
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail=result.message,
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as exc:
|
||||
logger.error(
|
||||
"Delete anime failed: key=%s error=%s",
|
||||
anime_key, str(exc),
|
||||
)
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail=f"Delete failed: {exc}",
|
||||
) from exc
|
||||
|
||||
Reference in New Issue
Block a user