174 lines
5.4 KiB
Markdown
174 lines
5.4 KiB
Markdown
# Provider层实现文档
|
||
|
||
## 一、认证Provider(AuthProvider)
|
||
|
||
### 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验证等敏感操作的详细信息
|
||
|
||
---
|
||
|
||
## 二、用户信息Provider(UserProvider)
|
||
|
||
### 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并解析
|
||
|