topfans/backend/services/userService/provider/README.md
2026-04-07 22:29:48 +08:00

174 lines
5.4 KiB
Markdown
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.

# Provider层实现文档
## 一、认证ProviderAuthProvider
### 1.1 功能概述
实现了认证相关的Dubbo-go Provider接口作为Service层和Dubbo-go框架之间的桥梁。
### 1.2 实现的方法
- `Register` - 用户注册
- `Login` - 用户登录
- `Logout` - 用户登出
- `RefreshToken` - 刷新Token
- `ValidateToken` - 验证Token
- `Reference` - 返回服务引用名称
### 1.2 接口实现
```go
type AuthProvider struct {
authService service.AuthService
}
// Reference 返回服务引用名称Dubbo-go要求
func (p *AuthProvider) Reference() string
// Register 用户注册
func (p *AuthProvider) Register(ctx context.Context, req *pb.RegisterRequest) (*pb.RegisterResponse, error)
// Login 用户登录
func (p *AuthProvider) Login(ctx context.Context, req *pb.LoginRequest) (*pb.LoginResponse, error)
// Logout 用户登出
func (p *AuthProvider) Logout(ctx context.Context, req *pb.LogoutRequest) (*pb.LogoutResponse, error)
// RefreshToken 刷新Token
func (p *AuthProvider) RefreshToken(ctx context.Context, req *pb.RefreshTokenRequest) (*pb.RefreshTokenResponse, error)
// ValidateToken 验证Token
func (p *AuthProvider) ValidateToken(ctx context.Context, req *pb.ValidateTokenRequest) (*pb.ValidateTokenResponse, error)
```
### 1.3 实现要点
1. **请求日志记录**:记录所有请求,便于追踪和调试
2. **Service层调用**直接调用Service层方法不包含业务逻辑
3. **错误处理**捕获Service层错误转换为proto响应格式
4. **Reference方法**实现Dubbo-go要求的Reference()方法,返回服务名称
### 1.4 使用示例
```go
// 创建Service实例
userRepo := repository.NewUserRepository()
fanProfileRepo := repository.NewFanProfileRepository()
starRepo := repository.NewStarRepository()
db := database.GetDB()
authService := service.NewAuthService(userRepo, fanProfileRepo, starRepo, db)
// 创建Provider实例
authProvider := provider.NewAuthProvider(authService)
// 在Dubbo-go中注册Provider
config.SetProviderService(authProvider)
```
### 1.5 错误处理
Provider层负责
- 捕获Service层返回的错误
- 如果响应为空,构建包含错误信息的响应
- 确保所有错误都转换为proto格式的响应
Service层已经处理了详细的错误和状态码Provider层主要确保响应格式正确。
### 1.6 日志记录
- **Info级别**:记录所有请求和成功响应
- **Error级别**:记录所有错误
- **Debug级别**记录Token验证等敏感操作的详细信息
---
## 二、用户信息ProviderUserProvider
### 2.1 功能概述
实现了用户信息和粉丝身份相关的Dubbo-go Provider接口包括
- 用户信息查询
- 粉丝档案管理
- 个人信息管理
- 密码管理
- 粉丝身份管理
### 2.2 实现的方法
#### 用户信息相关:
- `GetUser` - 获取用户信息
- `GetFanProfile` - 获取粉丝档案
- `GetCurrentUser` - 获取当前登录用户信息
- `GetMyProfile` - 获取个人信息页
- `UpdateNickname` - 修改昵称
- `UpdatePassword` - 修改密码
#### 粉丝身份相关:
- `GetFanIdentities` - 获取可选粉丝身份列表
- `AddIdentity` - 新增粉丝身份
- `SwitchIdentity` - 切换粉丝身份
#### Provider接口
- `Reference` - 返回服务引用名称
### 2.3 实现要点
1. **Context中提取用户信息**
- 需要认证的接口GetCurrentUser, GetMyProfile, UpdateNickname等需要从Context中提取userID和starID
- 目前使用`extractUserInfoFromContext`辅助函数该函数需要在认证中间件中设置userID和starID到context
2. **Service层调用**
- 直接调用Service层方法
- 对于需要userID/starID的方法从Context中提取后传递给Service层
3. **响应格式转换**
- `GetCurrentUser`需要将`GetMyProfileResponse`转换为`GetCurrentUserResponse`格式
### 2.4 依赖的Service
- `service.UserService` - 用户信息服务
- `service.IdentityService` - 粉丝身份服务
### 2.5 使用示例
```go
// 创建Service实例
userRepo := repository.NewUserRepository()
fanProfileRepo := repository.NewFanProfileRepository()
starRepo := repository.NewStarRepository()
db := database.GetDB()
userService := service.NewUserService(userRepo, fanProfileRepo, db)
identityService := service.NewIdentityService(fanProfileRepo, starRepo, userRepo, db)
// 创建Provider实例
userProvider := provider.NewUserProvider(userService, identityService)
// 在Dubbo-go中注册Provider
config.SetProviderService(userProvider)
```
### 2.6 注意事项
1. **认证中间件依赖**
- 需要认证的接口依赖认证中间件从Token中提取userID和starID并设置到Context
- `extractUserInfoFromContext`函数目前返回错误,需要在实现认证中间件后完善
2. **Context使用**
- 所有方法都接收`context.Context`作为第一个参数
- 需要认证的接口从Context中提取用户信息
- 不需要认证的接口如GetUser, GetFanProfile直接使用请求参数
3. **错误处理**
- 捕获Service层错误并转换为proto响应格式
- 确保所有错误都有对应的响应结构
### 2.7 待完善的功能
- **extractUserInfoFromContext函数**需要实现认证中间件后从Context中正确提取userID和starID
- 方案1从context.Values中获取需要中间件设置
- 方案2从metadata中获取Dubbo-go支持
- 方案3从请求头中提取Token并解析