243 lines
5.8 KiB
Go
243 lines
5.8 KiB
Go
package provider
|
||
|
||
import (
|
||
"context"
|
||
|
||
appErrors "github.com/topfans/backend/pkg/errors"
|
||
"github.com/topfans/backend/pkg/logger"
|
||
pbCommon "github.com/topfans/backend/pkg/proto/common"
|
||
pb "github.com/topfans/backend/pkg/proto/user"
|
||
"github.com/topfans/backend/services/userService/service"
|
||
"go.uber.org/zap"
|
||
)
|
||
|
||
// AuthProvider 认证Provider实现
|
||
type AuthProvider struct {
|
||
authService service.AuthService
|
||
}
|
||
|
||
// NewAuthProvider 创建认证Provider实例
|
||
func NewAuthProvider(authService service.AuthService) *AuthProvider {
|
||
return &AuthProvider{
|
||
authService: authService,
|
||
}
|
||
}
|
||
|
||
// Register 用户注册
|
||
func (p *AuthProvider) Register(ctx context.Context, req *pb.RegisterRequest) (*pb.RegisterResponse, error) {
|
||
// 记录请求日志
|
||
logger.Logger.Info("Received Register request",
|
||
zap.String("mobile", req.Mobile),
|
||
zap.Int64("star_id", req.StarId),
|
||
)
|
||
|
||
// 调用Service层
|
||
resp, err := p.authService.Register(req)
|
||
if err != nil {
|
||
logger.Logger.Error("Register failed",
|
||
zap.String("mobile", req.Mobile),
|
||
zap.Error(err),
|
||
)
|
||
|
||
// 如果响应为空,构建错误响应
|
||
if resp == nil {
|
||
resp = &pb.RegisterResponse{
|
||
Base: &pbCommon.BaseResponse{
|
||
Code: appErrors.ToStatusCode(err),
|
||
Message: err.Error(),
|
||
Timestamp: 0, // 时间戳将在Service层设置
|
||
},
|
||
}
|
||
}
|
||
|
||
return resp, err
|
||
}
|
||
|
||
logger.Logger.Info("Register successful",
|
||
zap.String("mobile", req.Mobile),
|
||
zap.Int64("user_id", resp.User.Id),
|
||
)
|
||
|
||
return resp, nil
|
||
}
|
||
|
||
// Login 用户登录
|
||
func (p *AuthProvider) Login(ctx context.Context, req *pb.LoginRequest) (*pb.LoginResponse, error) {
|
||
// 记录请求日志
|
||
logger.Logger.Info("Received Login request",
|
||
zap.String("mobile", req.Mobile),
|
||
)
|
||
|
||
// 调用Service层
|
||
resp, err := p.authService.Login(req)
|
||
if err != nil {
|
||
logger.Logger.Error("Login failed",
|
||
zap.String("mobile", req.Mobile),
|
||
zap.Error(err),
|
||
)
|
||
|
||
// 如果响应为空,构建错误响应
|
||
if resp == nil {
|
||
resp = &pb.LoginResponse{
|
||
Base: &pbCommon.BaseResponse{
|
||
Code: appErrors.ToStatusCode(err),
|
||
Message: err.Error(),
|
||
Timestamp: 0, // 时间戳将在Service层设置
|
||
},
|
||
}
|
||
}
|
||
|
||
return resp, err
|
||
}
|
||
|
||
logger.Logger.Info("Login successful",
|
||
zap.String("mobile", req.Mobile),
|
||
zap.Int64("user_id", resp.User.Id),
|
||
)
|
||
|
||
return resp, nil
|
||
}
|
||
|
||
// Logout 用户登出
|
||
func (p *AuthProvider) Logout(ctx context.Context, req *pb.LogoutRequest) (*pb.LogoutResponse, error) {
|
||
// 记录请求日志
|
||
logger.Logger.Info("Received Logout request")
|
||
|
||
// 从 attachments 获取用户信息(网关已验证 Token)
|
||
userID, _, err := extractUserInfoFromDubboAttachments(ctx)
|
||
if err != nil {
|
||
logger.Logger.Error("Failed to extract user info from attachments",
|
||
zap.Error(err),
|
||
)
|
||
return &pb.LogoutResponse{
|
||
Base: &pbCommon.BaseResponse{
|
||
Code: pbCommon.StatusCode_STATUS_UNAUTHORIZED,
|
||
Message: err.Error(),
|
||
Timestamp: 0,
|
||
},
|
||
}, nil
|
||
}
|
||
|
||
logger.Logger.Info("Extracted user info from attachments",
|
||
zap.Int64("user_id", userID),
|
||
)
|
||
|
||
// 调用Service层(传递 userID)
|
||
resp, err := p.authService.Logout(userID)
|
||
if err != nil {
|
||
logger.Logger.Error("Logout failed",
|
||
zap.Int64("user_id", userID),
|
||
zap.Error(err),
|
||
)
|
||
|
||
// 如果响应为空,构建错误响应
|
||
if resp == nil {
|
||
resp = &pb.LogoutResponse{
|
||
Base: &pbCommon.BaseResponse{
|
||
Code: appErrors.ToStatusCode(err),
|
||
Message: err.Error(),
|
||
Timestamp: 0, // 时间戳将在Service层设置
|
||
},
|
||
}
|
||
}
|
||
|
||
return resp, err
|
||
}
|
||
|
||
logger.Logger.Info("Logout successful",
|
||
zap.Int64("user_id", userID),
|
||
)
|
||
|
||
return resp, nil
|
||
}
|
||
|
||
// RefreshToken 刷新Token
|
||
func (p *AuthProvider) RefreshToken(ctx context.Context, req *pb.RefreshTokenRequest) (*pb.RefreshTokenResponse, error) {
|
||
// 记录请求日志
|
||
logger.Logger.Info("Received RefreshToken request")
|
||
|
||
// 从 attachments 获取用户信息(网关已验证 Token)
|
||
userID, starID, err := extractUserInfoFromDubboAttachments(ctx)
|
||
if err != nil {
|
||
logger.Logger.Error("Failed to extract user info from attachments",
|
||
zap.Error(err),
|
||
)
|
||
return &pb.RefreshTokenResponse{
|
||
Base: &pbCommon.BaseResponse{
|
||
Code: pbCommon.StatusCode_STATUS_UNAUTHORIZED,
|
||
Message: err.Error(),
|
||
Timestamp: 0,
|
||
},
|
||
}, nil
|
||
}
|
||
|
||
logger.Logger.Info("Extracted user info from attachments",
|
||
zap.Int64("user_id", userID),
|
||
zap.Int64("star_id", starID),
|
||
)
|
||
|
||
// 调用Service层(传递 userID 和 starID)
|
||
resp, err := p.authService.RefreshToken(userID, starID)
|
||
if err != nil {
|
||
logger.Logger.Error("RefreshToken failed",
|
||
zap.Int64("user_id", userID),
|
||
zap.Int64("star_id", starID),
|
||
zap.Error(err),
|
||
)
|
||
|
||
// 如果响应为空,构建错误响应
|
||
if resp == nil {
|
||
resp = &pb.RefreshTokenResponse{
|
||
Base: &pbCommon.BaseResponse{
|
||
Code: appErrors.ToStatusCode(err),
|
||
Message: err.Error(),
|
||
Timestamp: 0, // 时间戳将在Service层设置
|
||
},
|
||
}
|
||
}
|
||
|
||
return resp, err
|
||
}
|
||
|
||
logger.Logger.Info("RefreshToken successful",
|
||
zap.Int64("user_id", userID),
|
||
zap.Int64("star_id", starID),
|
||
)
|
||
|
||
return resp, nil
|
||
}
|
||
|
||
// ValidateToken 验证Token
|
||
func (p *AuthProvider) ValidateToken(ctx context.Context, req *pb.ValidateTokenRequest) (*pb.ValidateTokenResponse, error) {
|
||
// 记录请求日志
|
||
logger.Logger.Debug("Received ValidateToken request")
|
||
|
||
// 调用Service层
|
||
resp, err := p.authService.ValidateToken(req)
|
||
if err != nil {
|
||
logger.Logger.Error("ValidateToken failed",
|
||
zap.Error(err),
|
||
)
|
||
|
||
// 如果响应为空,构建错误响应
|
||
if resp == nil {
|
||
resp = &pb.ValidateTokenResponse{
|
||
Base: &pbCommon.BaseResponse{
|
||
Code: appErrors.ToStatusCode(err),
|
||
Message: err.Error(),
|
||
Timestamp: 0, // 时间戳将在Service层设置
|
||
},
|
||
}
|
||
}
|
||
|
||
return resp, err
|
||
}
|
||
|
||
logger.Logger.Debug("ValidateToken successful",
|
||
zap.Bool("is_valid", resp.IsValid),
|
||
zap.Int64("user_id", resp.UserId),
|
||
)
|
||
|
||
return resp, nil
|
||
}
|