github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/serializer/error.go (about)

     1  package serializer
     2  
     3  import (
     4  	"errors"
     5  	"github.com/gin-gonic/gin"
     6  )
     7  
     8  // AppError 应用错误,实现了error接口
     9  type AppError struct {
    10  	Code     int
    11  	Msg      string
    12  	RawError error
    13  }
    14  
    15  // NewError 返回新的错误对象
    16  func NewError(code int, msg string, err error) AppError {
    17  	return AppError{
    18  		Code:     code,
    19  		Msg:      msg,
    20  		RawError: err,
    21  	}
    22  }
    23  
    24  // NewErrorFromResponse 从 serializer.Response 构建错误
    25  func NewErrorFromResponse(resp *Response) AppError {
    26  	return AppError{
    27  		Code:     resp.Code,
    28  		Msg:      resp.Msg,
    29  		RawError: errors.New(resp.Error),
    30  	}
    31  }
    32  
    33  // WithError 将应用error携带标准库中的error
    34  func (err *AppError) WithError(raw error) AppError {
    35  	err.RawError = raw
    36  	return *err
    37  }
    38  
    39  // Error 返回业务代码确定的可读错误信息
    40  func (err AppError) Error() string {
    41  	return err.Msg
    42  }
    43  
    44  // 三位数错误编码为复用http原本含义
    45  // 五位数错误编码为应用自定义错误
    46  // 五开头的五位数错误编码为服务器端错误,比如数据库操作失败
    47  // 四开头的五位数错误编码为客户端错误,有时候是客户端代码写错了,有时候是用户操作错误
    48  const (
    49  	// CodeNotFullySuccess 未完全成功
    50  	CodeNotFullySuccess = 203
    51  	// CodeCheckLogin 未登录
    52  	CodeCheckLogin = 401
    53  	// CodeNoPermissionErr 未授权访问
    54  	CodeNoPermissionErr = 403
    55  	// CodeNotFound 资源未找到
    56  	CodeNotFound = 404
    57  	// CodeConflict 资源冲突
    58  	CodeConflict = 409
    59  	// CodeUploadFailed 上传出错
    60  	CodeUploadFailed = 40002
    61  	// CodeCreateFolderFailed 目录创建失败
    62  	CodeCreateFolderFailed = 40003
    63  	// CodeObjectExist 对象已存在
    64  	CodeObjectExist = 40004
    65  	// CodeSignExpired 签名过期
    66  	CodeSignExpired = 40005
    67  	// CodePolicyNotAllowed 当前存储策略不允许
    68  	CodePolicyNotAllowed = 40006
    69  	// CodeGroupNotAllowed 用户组无法进行此操作
    70  	CodeGroupNotAllowed = 40007
    71  	// CodeAdminRequired 非管理用户组
    72  	CodeAdminRequired = 40008
    73  	// CodeMasterNotFound 主机节点未注册
    74  	CodeMasterNotFound = 40009
    75  	// CodeUploadSessionExpired 上传会话已过期
    76  	CodeUploadSessionExpired = 40011
    77  	// CodeInvalidChunkIndex 无效的分片序号
    78  	CodeInvalidChunkIndex = 40012
    79  	// CodeInvalidContentLength 无效的正文长度
    80  	CodeInvalidContentLength = 40013
    81  	// CodeBatchSourceSize 超出批量获取外链限制
    82  	CodeBatchSourceSize = 40014
    83  	// CodeBatchAria2Size 超出最大 Aria2 任务数量限制
    84  	CodeBatchAria2Size = 40015
    85  	// CodeParentNotExist 父目录不存在
    86  	CodeParentNotExist = 40016
    87  	// CodeUserBaned 用户不活跃
    88  	CodeUserBaned = 40017
    89  	// CodeUserNotActivated 用户不活跃
    90  	CodeUserNotActivated = 40018
    91  	// CodeFeatureNotEnabled 此功能未开启
    92  	CodeFeatureNotEnabled = 40019
    93  	// CodeCredentialInvalid 凭证无效
    94  	CodeCredentialInvalid = 40020
    95  	// CodeUserNotFound 用户不存在
    96  	CodeUserNotFound = 40021
    97  	// Code2FACodeErr 二步验证代码错误
    98  	Code2FACodeErr = 40022
    99  	// CodeLoginSessionNotExist 登录会话不存在
   100  	CodeLoginSessionNotExist = 40023
   101  	// CodeInitializeAuthn 无法初始化 WebAuthn
   102  	CodeInitializeAuthn = 40024
   103  	// CodeWebAuthnCredentialError WebAuthn 凭证无效
   104  	CodeWebAuthnCredentialError = 40025
   105  	// CodeCaptchaError 验证码错误
   106  	CodeCaptchaError = 40026
   107  	// CodeCaptchaRefreshNeeded 验证码需要刷新
   108  	CodeCaptchaRefreshNeeded = 40027
   109  	// CodeFailedSendEmail 邮件发送失败
   110  	CodeFailedSendEmail = 40028
   111  	// CodeInvalidTempLink 临时链接无效
   112  	CodeInvalidTempLink = 40029
   113  	// CodeTempLinkExpired 临时链接过期
   114  	CodeTempLinkExpired = 40030
   115  	// CodeEmailExisted 邮箱已被使用
   116  	CodeEmailExisted = 40032
   117  	// CodeEmailSent 邮箱已重新发送
   118  	CodeEmailSent = 40033
   119  	// CodeUserCannotActivate 用户无法激活
   120  	CodeUserCannotActivate = 40034
   121  	// 存储策略不存在
   122  	CodePolicyNotExist = 40035
   123  	// 无法删除默认存储策略
   124  	CodeDeleteDefaultPolicy = 40036
   125  	// 存储策略下还有文件
   126  	CodePolicyUsedByFiles = 40037
   127  	// 存储策略绑定了用户组
   128  	CodePolicyUsedByGroups = 40038
   129  	// 用户组不存在
   130  	CodeGroupNotFound = 40039
   131  	// 对系统用户组执行非法操作
   132  	CodeInvalidActionOnSystemGroup = 40040
   133  	// 用户组正在被使用
   134  	CodeGroupUsedByUser = 40041
   135  	// 为初始用户更改用户组
   136  	CodeChangeGroupForDefaultUser = 40042
   137  	// 对系统用户执行非法操作
   138  	CodeInvalidActionOnDefaultUser = 40043
   139  	// 文件不存在
   140  	CodeFileNotFound = 40044
   141  	// 列取文件失败
   142  	CodeListFilesError = 40045
   143  	// 对系统节点进行非法操作
   144  	CodeInvalidActionOnSystemNode = 40046
   145  	// 创建文件系统出错
   146  	CodeCreateFSError = 40047
   147  	// 创建任务出错
   148  	CodeCreateTaskError = 40048
   149  	// 文件尺寸太大
   150  	CodeFileTooLarge = 40049
   151  	// 文件类型不允许
   152  	CodeFileTypeNotAllowed = 40050
   153  	// 用户容量不足
   154  	CodeInsufficientCapacity = 40051
   155  	// 对象名非法
   156  	CodeIllegalObjectName = 40052
   157  	// 不支持对根目录执行此操作
   158  	CodeRootProtected = 40053
   159  	// 当前目录下已经有同名文件正在上传中
   160  	CodeConflictUploadOngoing = 40054
   161  	// 文件信息不一致
   162  	CodeMetaMismatch = 40055
   163  	// 不支持该格式的压缩文件
   164  	CodeUnsupportedArchiveType = 40056
   165  	// 可用存储策略发生变化
   166  	CodePolicyChanged = 40057
   167  	// 分享链接无效
   168  	CodeShareLinkNotFound = 40058
   169  	// 不能转存自己的分享
   170  	CodeSaveOwnShare = 40059
   171  	// 从机无法向主机发送回调请求
   172  	CodeSlavePingMaster = 40060
   173  	// Cloudreve 版本不一致
   174  	CodeVersionMismatch = 40061
   175  	// 积分不足
   176  	CodeInsufficientCredit = 40062
   177  	// 用户组冲突
   178  	CodeGroupConflict = 40063
   179  	// 当前已处于此用户组中
   180  	CodeGroupInvalid = 40064
   181  	// 兑换码无效
   182  	CodeInvalidGiftCode = 40065
   183  	// 已绑定了QQ账号
   184  	CodeQQBindConflict = 40066
   185  	// QQ账号已被绑定其他账号
   186  	CodeQQBindOtherAccount = 40067
   187  	// QQ 未绑定对应账号
   188  	CodeQQNotLinked = 40068
   189  	// 密码不正确
   190  	CodeIncorrectPassword = 40069
   191  	// 分享无法预览
   192  	CodeDisabledSharePreview = 40070
   193  	// 签名无效
   194  	CodeInvalidSign = 40071
   195  	// CodeDBError 数据库操作失败
   196  	CodeDBError = 50001
   197  	// CodeEncryptError 加密失败
   198  	CodeEncryptError = 50002
   199  	// CodeIOFailed IO操作失败
   200  	CodeIOFailed = 50004
   201  	// CodeInternalSetting 内部设置参数错误
   202  	CodeInternalSetting = 50005
   203  	// CodeCacheOperation 缓存操作失败
   204  	CodeCacheOperation = 50006
   205  	// CodeCallbackError 回调失败
   206  	CodeCallbackError = 50007
   207  	// 后台设置更新失败
   208  	CodeUpdateSetting = 50008
   209  	// 跨域策略添加失败
   210  	CodeAddCORS = 50009
   211  	// 节点不可用
   212  	CodeNodeOffline = 50010
   213  	// 文件元信息查询失败
   214  	CodeQueryMetaFailed = 50011
   215  	//CodeParamErr 各种奇奇怪怪的参数错误
   216  	CodeParamErr = 40001
   217  	// CodeNotSet 未定错误,后续尝试从error中获取
   218  	CodeNotSet = -1
   219  )
   220  
   221  // DBErr 数据库操作失败
   222  func DBErr(msg string, err error) Response {
   223  	if msg == "" {
   224  		msg = "Database operation failed."
   225  	}
   226  	return Err(CodeDBError, msg, err)
   227  }
   228  
   229  // ParamErr 各种参数错误
   230  func ParamErr(msg string, err error) Response {
   231  	if msg == "" {
   232  		msg = "Invalid parameters."
   233  	}
   234  	return Err(CodeParamErr, msg, err)
   235  }
   236  
   237  // Err 通用错误处理
   238  func Err(errCode int, msg string, err error) Response {
   239  	// 底层错误是AppError,则尝试从AppError中获取详细信息
   240  	var appError AppError
   241  	if errors.As(err, &appError) {
   242  		errCode = appError.Code
   243  		err = appError.RawError
   244  		msg = appError.Msg
   245  	}
   246  
   247  	res := Response{
   248  		Code: errCode,
   249  		Msg:  msg,
   250  	}
   251  	// 生产环境隐藏底层报错
   252  	if err != nil && gin.Mode() != gin.ReleaseMode {
   253  		res.Error = err.Error()
   254  	}
   255  	return res
   256  }