feat: 完善依赖注入改造
完成所有Handler的依赖注入改造: - AuthHandler: 认证相关功能 - UserHandler: 用户管理功能 - TextureHandler: 材质管理功能 - ProfileHandler: 档案管理功能 - CaptchaHandler: 验证码功能 - YggdrasilHandler: Yggdrasil API功能 新增错误类型定义: - internal/errors/errors.go: 统一的错误类型和工厂函数 更新main.go: - 使用container.NewContainer创建依赖容器 - 使用handler.RegisterRoutesWithDI注册路由 代码遵循Go最佳实践: - 依赖通过构造函数注入 - Handler通过结构体方法实现 - 统一的错误处理模式 - 清晰的分层架构
This commit is contained in:
127
internal/errors/errors.go
Normal file
127
internal/errors/errors.go
Normal file
@@ -0,0 +1,127 @@
|
||||
// Package errors 定义应用程序的错误类型
|
||||
package errors
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// 预定义错误
|
||||
var (
|
||||
// 用户相关错误
|
||||
ErrUserNotFound = errors.New("用户不存在")
|
||||
ErrUserAlreadyExists = errors.New("用户已存在")
|
||||
ErrEmailAlreadyExists = errors.New("邮箱已被注册")
|
||||
ErrInvalidPassword = errors.New("密码错误")
|
||||
ErrAccountDisabled = errors.New("账号已被禁用")
|
||||
|
||||
// 认证相关错误
|
||||
ErrUnauthorized = errors.New("未授权")
|
||||
ErrInvalidToken = errors.New("无效的令牌")
|
||||
ErrTokenExpired = errors.New("令牌已过期")
|
||||
ErrInvalidSignature = errors.New("签名验证失败")
|
||||
|
||||
// 档案相关错误
|
||||
ErrProfileNotFound = errors.New("档案不存在")
|
||||
ErrProfileNameExists = errors.New("角色名已被使用")
|
||||
ErrProfileLimitReached = errors.New("已达档案数量上限")
|
||||
ErrProfileNoPermission = errors.New("无权操作此档案")
|
||||
|
||||
// 材质相关错误
|
||||
ErrTextureNotFound = errors.New("材质不存在")
|
||||
ErrTextureExists = errors.New("该材质已存在")
|
||||
ErrTextureLimitReached = errors.New("已达材质数量上限")
|
||||
ErrTextureNoPermission = errors.New("无权操作此材质")
|
||||
ErrInvalidTextureType = errors.New("无效的材质类型")
|
||||
|
||||
// 验证码相关错误
|
||||
ErrInvalidVerificationCode = errors.New("验证码错误或已过期")
|
||||
ErrTooManyAttempts = errors.New("尝试次数过多")
|
||||
ErrSendTooFrequent = errors.New("发送过于频繁")
|
||||
|
||||
// URL验证相关错误
|
||||
ErrInvalidURL = errors.New("无效的URL格式")
|
||||
ErrDomainNotAllowed = errors.New("URL域名不在允许的列表中")
|
||||
|
||||
// 存储相关错误
|
||||
ErrStorageUnavailable = errors.New("存储服务不可用")
|
||||
ErrUploadFailed = errors.New("上传失败")
|
||||
|
||||
// 通用错误
|
||||
ErrBadRequest = errors.New("请求参数错误")
|
||||
ErrInternalServer = errors.New("服务器内部错误")
|
||||
ErrNotFound = errors.New("资源不存在")
|
||||
ErrForbidden = errors.New("权限不足")
|
||||
)
|
||||
|
||||
// AppError 应用错误类型,包含错误码和消息
|
||||
type AppError struct {
|
||||
Code int // HTTP状态码
|
||||
Message string // 用户可见的错误消息
|
||||
Err error // 原始错误(用于日志)
|
||||
}
|
||||
|
||||
// Error 实现error接口
|
||||
func (e *AppError) Error() string {
|
||||
if e.Err != nil {
|
||||
return fmt.Sprintf("%s: %v", e.Message, e.Err)
|
||||
}
|
||||
return e.Message
|
||||
}
|
||||
|
||||
// Unwrap 支持errors.Is和errors.As
|
||||
func (e *AppError) Unwrap() error {
|
||||
return e.Err
|
||||
}
|
||||
|
||||
// NewAppError 创建新的应用错误
|
||||
func NewAppError(code int, message string, err error) *AppError {
|
||||
return &AppError{
|
||||
Code: code,
|
||||
Message: message,
|
||||
Err: err,
|
||||
}
|
||||
}
|
||||
|
||||
// NewBadRequest 创建400错误
|
||||
func NewBadRequest(message string, err error) *AppError {
|
||||
return NewAppError(400, message, err)
|
||||
}
|
||||
|
||||
// NewUnauthorized 创建401错误
|
||||
func NewUnauthorized(message string) *AppError {
|
||||
return NewAppError(401, message, nil)
|
||||
}
|
||||
|
||||
// NewForbidden 创建403错误
|
||||
func NewForbidden(message string) *AppError {
|
||||
return NewAppError(403, message, nil)
|
||||
}
|
||||
|
||||
// NewNotFound 创建404错误
|
||||
func NewNotFound(message string) *AppError {
|
||||
return NewAppError(404, message, nil)
|
||||
}
|
||||
|
||||
// NewInternalError 创建500错误
|
||||
func NewInternalError(message string, err error) *AppError {
|
||||
return NewAppError(500, message, err)
|
||||
}
|
||||
|
||||
// Is 检查错误是否匹配
|
||||
func Is(err, target error) bool {
|
||||
return errors.Is(err, target)
|
||||
}
|
||||
|
||||
// As 尝试将错误转换为指定类型
|
||||
func As(err error, target interface{}) bool {
|
||||
return errors.As(err, target)
|
||||
}
|
||||
|
||||
// Wrap 包装错误
|
||||
func Wrap(err error, message string) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("%s: %w", message, err)
|
||||
}
|
||||
Reference in New Issue
Block a user