package errors import ( "errors" "fmt" "time" pb "github.com/topfans/backend/pkg/proto/common" ) // 业务错误类型 var ( ErrUserNotFound = errors.New("user not found") ErrUserAlreadyExists = errors.New("user already exists") ErrInvalidPassword = errors.New("invalid password") ErrInvalidToken = errors.New("invalid token") ErrTokenExpired = errors.New("token expired") ErrTokenMismatch = errors.New("token mismatch") ErrUserInactive = errors.New("user is inactive") ErrFanProfileNotFound = errors.New("fan profile not found") ErrFanProfileAlreadyExists = errors.New("fan profile already exists") ErrNicknameAlreadyExists = errors.New("该昵称已被注册") ErrInvalidNickname = errors.New("invalid nickname format") ErrStarNotFound = errors.New("star not found") ErrInvalidMobile = errors.New("invalid mobile format") ErrPasswordTooShort = errors.New("password too short") ErrInvalidStarID = errors.New("invalid star_id") ErrInvalidUserID = errors.New("invalid user_id") ErrMaxIdentitiesReached = errors.New("maximum number of identities reached") ErrInternalServer = errors.New("internal server error") // 社交服务相关错误 ErrCannotAddSelf = errors.New("不能添加自己为好友") ErrCannotSearchSelf = errors.New("不能查找自己") ErrNotFanOfStar = errors.New("对方不是该明星的粉丝") ErrAlreadyFriends = errors.New("你们已经是好友了") ErrRequestAlreadyPending = errors.New("已有待处理的好友请求") ErrRequestInCooldown = errors.New("请求已被拒绝,请稍后再试") ErrInvalidFriendUserID = errors.New("friend_user_id不能为空") ErrFriendRequestNotFound = errors.New("好友请求不存在") ErrCannotProcessOwnRequest = errors.New("不能处理自己发送的请求") ErrRequestAlreadyProcessed = errors.New("该请求已被处理") ErrRequestExpired = errors.New("好友请求已过期") ErrInvalidAction = errors.New("无效的操作") ErrNotFriends = errors.New("你们不是好友") ErrMaxFriendsReached = errors.New("已达到最大好友数量限制") // 资产服务相关错误 ErrAssetNotFound = errors.New("资产不存在") ErrMintOrderNotFound = errors.New("铸造订单不存在") ErrInsufficientCrystal = errors.New("水晶余额不足") ErrInsufficientMintTimes = errors.New("铸造次数不足") ErrAssetAccessDenied = errors.New("无权访问该资产") ErrMintOrderAccessDenied = errors.New("无权访问该订单") ErrInvalidAssetStatus = errors.New("资产状态无效") ErrInvalidMintOrderStatus = errors.New("订单状态无效") // 账号状态相关错误 ErrAccountFrozen = errors.New("账号已被冻结") ErrAccountBanned = errors.New("账号已被封禁") // 活动服务相关错误 ErrActivityNotFound = errors.New("活动不存在") ErrActivityItemNotFound = errors.New("活动道具不存在") // 星册服务相关错误 ErrCollectionAssetNotFound = errors.New("典藏藏品不存在") ErrActivityAssetNotFound = errors.New("活动藏品不存在") ErrAssetRegistryNotFound = errors.New("资产索引不存在") ErrInvalidAssetType = errors.New("无效的资产类型") ) // ToStatusCode 将错误转换为Proto状态码 func ToStatusCode(err error) pb.StatusCode { if err == nil { return pb.StatusCode_STATUS_OK } switch err { case ErrUserNotFound, ErrFanProfileNotFound, ErrStarNotFound: return pb.StatusCode_STATUS_NOT_FOUND case ErrUserAlreadyExists, ErrFanProfileAlreadyExists, ErrNicknameAlreadyExists: return pb.StatusCode_STATUS_BAD_REQUEST case ErrInvalidPassword, ErrInvalidToken, ErrTokenExpired, ErrTokenMismatch: return pb.StatusCode_STATUS_UNAUTHORIZED case ErrAccountFrozen, ErrAccountBanned: return pb.StatusCode_STATUS_FORBIDDEN case ErrInvalidMobile, ErrPasswordTooShort, ErrInvalidStarID, ErrInvalidUserID, ErrMaxIdentitiesReached, ErrInvalidNickname: return pb.StatusCode_STATUS_BAD_REQUEST case ErrCannotAddSelf, ErrCannotSearchSelf, ErrNotFanOfStar, ErrAlreadyFriends, ErrRequestAlreadyPending, ErrInvalidFriendUserID, ErrCannotProcessOwnRequest, ErrRequestAlreadyProcessed, ErrRequestExpired, ErrInvalidAction, ErrNotFriends: return pb.StatusCode_STATUS_BAD_REQUEST case ErrRequestInCooldown: return pb.StatusCode_STATUS_TOO_MANY_REQUESTS case ErrFriendRequestNotFound, ErrAssetNotFound, ErrMintOrderNotFound: return pb.StatusCode_STATUS_NOT_FOUND case ErrInsufficientCrystal, ErrInsufficientMintTimes, ErrInvalidAssetStatus, ErrInvalidMintOrderStatus: return pb.StatusCode_STATUS_BAD_REQUEST case ErrAssetAccessDenied, ErrMintOrderAccessDenied: return pb.StatusCode_STATUS_FORBIDDEN case ErrActivityNotFound, ErrActivityItemNotFound, ErrCollectionAssetNotFound, ErrActivityAssetNotFound, ErrAssetRegistryNotFound: return pb.StatusCode_STATUS_NOT_FOUND case ErrInvalidAssetType: return pb.StatusCode_STATUS_BAD_REQUEST default: return pb.StatusCode_STATUS_INTERNAL_ERROR } } // FormatErrorResponse 格式化错误响应 func FormatErrorResponse(err error) *pb.BaseResponse { if err == nil { return &pb.BaseResponse{ Code: pb.StatusCode_STATUS_OK, Message: "", Timestamp: getCurrentTimestamp(), } } return &pb.BaseResponse{ Code: ToStatusCode(err), Message: err.Error(), Timestamp: getCurrentTimestamp(), } } // FormatSuccessResponse 格式化成功响应 func FormatSuccessResponse() *pb.BaseResponse { return &pb.BaseResponse{ Code: pb.StatusCode_STATUS_OK, Message: "", Timestamp: getCurrentTimestamp(), } } // BuildBaseResponse 构建基础响应(FormatErrorResponse的别名) func BuildBaseResponse(err error) *pb.BaseResponse { return FormatErrorResponse(err) } // NewError 创建新的业务错误 func NewError(code pb.StatusCode, message string) error { return fmt.Errorf("%s", message) } // NewRequestInCooldownError 创建冷静期错误,包含剩余天数 func NewRequestInCooldownError(days int) error { return fmt.Errorf("请求已被拒绝,请 %d 天后再试", days) } // BuildBaseResponseWithMessage 构建带有自定义消息的响应 func BuildBaseResponseWithMessage(code pb.StatusCode, message string) *pb.BaseResponse { return &pb.BaseResponse{ Code: code, Message: message, Timestamp: getCurrentTimestamp(), } } // getCurrentTimestamp 获取当前时间戳(毫秒) func getCurrentTimestamp() int64 { return time.Now().UnixMilli() }