2025-01-10 00:09:25 +08:00
|
|
|
package ctxdata
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"encoding/json"
|
2025-05-11 20:45:48 +08:00
|
|
|
"errors"
|
2025-01-10 00:09:25 +08:00
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
|
|
|
const CtxKeyJwtUserId = "userId"
|
|
|
|
|
2025-05-11 20:45:48 +08:00
|
|
|
// 定义错误类型
|
|
|
|
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
|
2025-05-11 20:45:48 +08:00
|
|
|
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 {
|
2025-05-11 20:45:48 +08:00
|
|
|
return 0, fmt.Errorf("%w: 期望类型 json.Number, 实际类型 %T", ErrInvalidUserId, value)
|
2025-01-10 00:09:25 +08:00
|
|
|
}
|
2025-05-11 20:45:48 +08:00
|
|
|
|
2025-01-10 00:09:25 +08:00
|
|
|
// 转换为 int64
|
|
|
|
uid, err := jsonUid.Int64()
|
|
|
|
if err != nil {
|
2025-05-11 20:45:48 +08:00
|
|
|
return 0, fmt.Errorf("%w: %v", ErrInvalidUserId, err)
|
2025-01-10 00:09:25 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return uid, nil
|
|
|
|
}
|
2025-05-11 20:45:48 +08:00
|
|
|
|
|
|
|
// IsNoUserIdError 判断是否是未登录错误
|
|
|
|
func IsNoUserIdError(err error) bool {
|
|
|
|
return errors.Is(err, ErrNoUserIdInCtx)
|
|
|
|
}
|
|
|
|
|
|
|
|
// IsInvalidUserIdError 判断是否是用户ID格式错误
|
|
|
|
func IsInvalidUserIdError(err error) bool {
|
|
|
|
return errors.Is(err, ErrInvalidUserId)
|
|
|
|
}
|