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 }