topfans/backend/pkg/errors/errors.go
2026-04-27 12:59:19 +08:00

165 lines
6.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
}