refactor: Introduce utility functions for exception handling and database operations; update auth and playlist services to use new exception methods
All checks were successful
Backend CI / test (push) Successful in 3m58s
All checks were successful
Backend CI / test (push) Successful in 3m58s
This commit is contained in:
121
app/utils/exceptions.py
Normal file
121
app/utils/exceptions.py
Normal file
@@ -0,0 +1,121 @@
|
||||
"""Utility functions for common HTTP exception patterns."""
|
||||
|
||||
from fastapi import HTTPException, status
|
||||
|
||||
|
||||
def raise_not_found(resource: str, identifier: str = None) -> None:
|
||||
"""Raise a standardized 404 Not Found exception.
|
||||
|
||||
Args:
|
||||
resource: Name of the resource that wasn't found
|
||||
identifier: Optional identifier for the specific resource
|
||||
|
||||
Raises:
|
||||
HTTPException with 404 status code
|
||||
"""
|
||||
if identifier:
|
||||
detail = f"{resource} with ID {identifier} not found"
|
||||
else:
|
||||
detail = f"{resource} not found"
|
||||
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail=detail,
|
||||
)
|
||||
|
||||
|
||||
def raise_unauthorized(detail: str = "Could not validate credentials") -> None:
|
||||
"""Raise a standardized 401 Unauthorized exception.
|
||||
|
||||
Args:
|
||||
detail: Error message detail
|
||||
|
||||
Raises:
|
||||
HTTPException with 401 status code
|
||||
"""
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail=detail,
|
||||
)
|
||||
|
||||
|
||||
def raise_bad_request(detail: str) -> None:
|
||||
"""Raise a standardized 400 Bad Request exception.
|
||||
|
||||
Args:
|
||||
detail: Error message detail
|
||||
|
||||
Raises:
|
||||
HTTPException with 400 status code
|
||||
"""
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=detail,
|
||||
)
|
||||
|
||||
|
||||
def raise_internal_server_error(detail: str, cause: Exception = None) -> None:
|
||||
"""Raise a standardized 500 Internal Server Error exception.
|
||||
|
||||
Args:
|
||||
detail: Error message detail
|
||||
cause: Optional underlying exception
|
||||
|
||||
Raises:
|
||||
HTTPException with 500 status code
|
||||
"""
|
||||
if cause:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail=detail,
|
||||
) from cause
|
||||
else:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||||
detail=detail,
|
||||
)
|
||||
|
||||
|
||||
def raise_payment_required(detail: str = "Insufficient credits") -> None:
|
||||
"""Raise a standardized 402 Payment Required exception.
|
||||
|
||||
Args:
|
||||
detail: Error message detail
|
||||
|
||||
Raises:
|
||||
HTTPException with 402 status code
|
||||
"""
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_402_PAYMENT_REQUIRED,
|
||||
detail=detail,
|
||||
)
|
||||
|
||||
|
||||
def raise_forbidden(detail: str = "Access forbidden") -> None:
|
||||
"""Raise a standardized 403 Forbidden exception.
|
||||
|
||||
Args:
|
||||
detail: Error message detail
|
||||
|
||||
Raises:
|
||||
HTTPException with 403 status code
|
||||
"""
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
detail=detail,
|
||||
)
|
||||
|
||||
|
||||
def raise_conflict(detail: str) -> None:
|
||||
"""Raise a standardized 409 Conflict exception.
|
||||
|
||||
Args:
|
||||
detail: Error message detail
|
||||
|
||||
Raises:
|
||||
HTTPException with 409 status code
|
||||
"""
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_409_CONFLICT,
|
||||
detail=detail,
|
||||
)
|
||||
Reference in New Issue
Block a user