Fix API compatibility and add user/role/permission and asset import/export
This commit is contained in:
155
backend_new/app/core/exceptions.py
Normal file
155
backend_new/app/core/exceptions.py
Normal file
@@ -0,0 +1,155 @@
|
||||
"""
|
||||
自定义异常类
|
||||
"""
|
||||
from typing import Any, Dict, Optional
|
||||
from fastapi import HTTPException, status
|
||||
|
||||
|
||||
class BusinessException(Exception):
|
||||
"""业务逻辑异常基类"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
message: str,
|
||||
code: int = status.HTTP_400_BAD_REQUEST,
|
||||
error_code: Optional[str] = None,
|
||||
data: Optional[Dict[str, Any]] = None
|
||||
):
|
||||
"""
|
||||
初始化业务异常
|
||||
|
||||
Args:
|
||||
message: 错误消息
|
||||
code: HTTP状态码
|
||||
error_code: 业务错误码
|
||||
data: 附加数据
|
||||
"""
|
||||
self.message = message
|
||||
self.code = code
|
||||
self.error_code = error_code
|
||||
self.data = data
|
||||
super().__init__(self.message)
|
||||
|
||||
|
||||
class NotFoundException(BusinessException):
|
||||
"""资源不存在异常"""
|
||||
|
||||
def __init__(self, resource: str = "资源"):
|
||||
super().__init__(
|
||||
message=f"{resource}不存在",
|
||||
code=status.HTTP_404_NOT_FOUND,
|
||||
error_code="RESOURCE_NOT_FOUND"
|
||||
)
|
||||
|
||||
|
||||
class AlreadyExistsException(BusinessException):
|
||||
"""资源已存在异常"""
|
||||
|
||||
def __init__(self, resource: str = "资源"):
|
||||
super().__init__(
|
||||
message=f"{resource}已存在",
|
||||
code=status.HTTP_409_CONFLICT,
|
||||
error_code="RESOURCE_ALREADY_EXISTS"
|
||||
)
|
||||
|
||||
|
||||
class PermissionDeniedException(BusinessException):
|
||||
"""权限不足异常"""
|
||||
|
||||
def __init__(self, message: str = "权限不足"):
|
||||
super().__init__(
|
||||
message=message,
|
||||
code=status.HTTP_403_FORBIDDEN,
|
||||
error_code="PERMISSION_DENIED"
|
||||
)
|
||||
|
||||
|
||||
class AuthenticationFailedException(BusinessException):
|
||||
"""认证失败异常"""
|
||||
|
||||
def __init__(self, message: str = "认证失败"):
|
||||
super().__init__(
|
||||
message=message,
|
||||
code=status.HTTP_401_UNAUTHORIZED,
|
||||
error_code="AUTHENTICATION_FAILED"
|
||||
)
|
||||
|
||||
|
||||
class ValidationFailedException(BusinessException):
|
||||
"""验证失败异常"""
|
||||
|
||||
def __init__(self, message: str = "数据验证失败", errors: Optional[Dict] = None):
|
||||
super().__init__(
|
||||
message=message,
|
||||
code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
||||
error_code="VALIDATION_FAILED",
|
||||
data=errors
|
||||
)
|
||||
|
||||
|
||||
class InvalidCredentialsException(AuthenticationFailedException):
|
||||
"""无效凭据异常"""
|
||||
|
||||
def __init__(self, message: str = "用户名或密码错误"):
|
||||
super().__init__(message)
|
||||
self.error_code = "INVALID_CREDENTIALS"
|
||||
|
||||
|
||||
class TokenExpiredException(AuthenticationFailedException):
|
||||
"""令牌过期异常"""
|
||||
|
||||
def __init__(self, message: str = "令牌已过期,请重新登录"):
|
||||
super().__init__(message)
|
||||
self.error_code = "TOKEN_EXPIRED"
|
||||
|
||||
|
||||
class InvalidTokenException(AuthenticationFailedException):
|
||||
"""无效令牌异常"""
|
||||
|
||||
def __init__(self, message: str = "无效的令牌"):
|
||||
super().__init__(message)
|
||||
self.error_code = "INVALID_TOKEN"
|
||||
|
||||
|
||||
class CaptchaException(BusinessException):
|
||||
"""验证码异常"""
|
||||
|
||||
def __init__(self, message: str = "验证码错误"):
|
||||
super().__init__(
|
||||
message=message,
|
||||
code=status.HTTP_400_BAD_REQUEST,
|
||||
error_code="CAPTCHA_ERROR"
|
||||
)
|
||||
|
||||
|
||||
class UserLockedException(BusinessException):
|
||||
"""用户被锁定异常"""
|
||||
|
||||
def __init__(self, message: str = "用户已被锁定,请联系管理员"):
|
||||
super().__init__(
|
||||
message=message,
|
||||
code=status.HTTP_403_FORBIDDEN,
|
||||
error_code="USER_LOCKED"
|
||||
)
|
||||
|
||||
|
||||
class UserDisabledException(BusinessException):
|
||||
"""用户被禁用异常"""
|
||||
|
||||
def __init__(self, message: str = "用户已被禁用"):
|
||||
super().__init__(
|
||||
message=message,
|
||||
code=status.HTTP_403_FORBIDDEN,
|
||||
error_code="USER_DISABLED"
|
||||
)
|
||||
|
||||
|
||||
class StateTransitionException(BusinessException):
|
||||
"""状态转换异常"""
|
||||
|
||||
def __init__(self, current_state: str, target_state: str):
|
||||
super().__init__(
|
||||
message=f"无法从状态 '{current_state}' 转换到 '{target_state}'",
|
||||
code=status.HTTP_400_BAD_REQUEST,
|
||||
error_code="INVALID_STATE_TRANSITION"
|
||||
)
|
||||
Reference in New Issue
Block a user