55 lines
2.1 KiB
Python
55 lines
2.1 KiB
Python
"""
|
||
Обработчики ошибок для API.
|
||
"""
|
||
|
||
from typing import Optional, Dict, Any
|
||
from fastapi import HTTPException
|
||
|
||
from .error_model.error_types import ServerError, AccessError, OperationError, ValidationError, ErrorType
|
||
|
||
|
||
def handle_api_error(
|
||
error_type: ErrorType, message: str, status_code: int, details: Optional[Dict[str, Any]] = None
|
||
) -> HTTPException:
|
||
"""
|
||
Функция для создания HTTPException с правильной структурой ошибки.
|
||
|
||
"""
|
||
match error_type:
|
||
case ErrorType.SERVER:
|
||
error = ServerError(message=message, details=details)
|
||
case ErrorType.ACCESS:
|
||
error = AccessError(message=message, details=details)
|
||
case ErrorType.OPERATION:
|
||
error = OperationError(message=message, details=details)
|
||
case ErrorType.VALIDATION:
|
||
error = ValidationError(message=message, details=details)
|
||
case _:
|
||
error = ServerError(message=message, details=details)
|
||
|
||
return HTTPException(status_code=status_code, detail=error.model_dump(mode="json"))
|
||
|
||
|
||
def create_server_error(
|
||
message: str, status_code: int = 500, details: Optional[Dict[str, Any]] = None
|
||
) -> HTTPException:
|
||
return handle_api_error(error_type=ErrorType.SERVER, message=message, status_code=status_code, details=details)
|
||
|
||
|
||
def create_access_error(
|
||
message: str, status_code: int = 403, details: Optional[Dict[str, Any]] = None
|
||
) -> HTTPException:
|
||
return handle_api_error(error_type=ErrorType.ACCESS, message=message, status_code=status_code, details=details)
|
||
|
||
|
||
def create_operation_error(
|
||
message: str, status_code: int = 400, details: Optional[Dict[str, Any]] = None
|
||
) -> HTTPException:
|
||
return handle_api_error(error_type=ErrorType.OPERATION, message=message, status_code=status_code, details=details)
|
||
|
||
|
||
def create_validation_error(
|
||
message: str, status_code: int = 422, details: Optional[Dict[str, Any]] = None
|
||
) -> HTTPException:
|
||
return handle_api_error(error_type=ErrorType.VALIDATION, message=message, status_code=status_code, details=details)
|