tydata-server/common/ctxdata/ctxData.go

50 lines
1.1 KiB
Go
Raw Normal View History

2025-01-10 00:09:25 +08:00
package ctxdata
import (
"context"
"encoding/json"
"errors"
2025-01-10 00:09:25 +08:00
"fmt"
)
const CtxKeyJwtUserId = "userId"
// 定义错误类型
var (
ErrNoUserIdInCtx = errors.New("上下文中没有用户ID") // 未登录
ErrInvalidUserId = errors.New("用户ID格式无效") // 数据异常
)
2025-01-10 00:09:25 +08:00
// GetUidFromCtx 从 context 中获取用户 ID
func GetUidFromCtx(ctx context.Context) (int64, error) {
// 尝试从上下文中获取 jwtUserId
value := ctx.Value(CtxKeyJwtUserId)
if value == nil {
return 0, ErrNoUserIdInCtx
}
// 尝试转换为 json.Number
jsonUid, ok := value.(json.Number)
2025-01-10 00:09:25 +08:00
if !ok {
return 0, fmt.Errorf("%w: 期望类型 json.Number, 实际类型 %T", ErrInvalidUserId, value)
2025-01-10 00:09:25 +08:00
}
2025-01-10 00:09:25 +08:00
// 转换为 int64
uid, err := jsonUid.Int64()
if err != nil {
return 0, fmt.Errorf("%w: %v", ErrInvalidUserId, err)
2025-01-10 00:09:25 +08:00
}
return uid, nil
}
// IsNoUserIdError 判断是否是未登录错误
func IsNoUserIdError(err error) bool {
return errors.Is(err, ErrNoUserIdInCtx)
}
// IsInvalidUserIdError 判断是否是用户ID格式错误
func IsInvalidUserIdError(err error) bool {
return errors.Is(err, ErrInvalidUserId)
}