package client import ( "context" "dubbo.apache.org/dubbo-go/v3/client" _ "dubbo.apache.org/dubbo-go/v3/imports" pbUser "github.com/topfans/backend/pkg/proto/user" "github.com/topfans/backend/pkg/logger" "go.uber.org/zap" ) // FanProfile 粉丝档案信息 type FanProfile struct { UserID int64 StarID int64 Nickname string AvatarUrl string Level int32 CrystalBalance int64 } // UserRPCClient User Service RPC客户端接口 type UserRPCClient interface { // GetFanProfile 获取粉丝档案(等级、水晶余额等) GetFanProfile(userID, starID int64) (*FanProfile, error) // UpdateCrystalBalance 更新水晶余额(返回更新后的余额) UpdateCrystalBalance(userID, starID int64, delta int64) (int64, error) } // userRPCClient User Service RPC客户端实现 type userRPCClient struct { client pbUser.UserSocialService } // NewUserRPCClient 创建User Service RPC客户端 func NewUserRPCClient(dubboClient *client.Client) (UserRPCClient, error) { userService, err := pbUser.NewUserSocialService(dubboClient) if err != nil { logger.Logger.Error("Failed to create UserSocialService client", zap.Error(err)) return nil, err } return &userRPCClient{ client: userService, }, nil } // GetFanProfile 获取粉丝档案(等级、水晶余额等) func (c *userRPCClient) GetFanProfile(userID, starID int64) (*FanProfile, error) { logger.Logger.Debug("Calling UserService.GetFanProfile", zap.Int64("user_id", userID), zap.Int64("star_id", starID), ) ctx := context.Background() resp, err := c.client.GetFanProfile(ctx, &pbUser.GetFanProfileRequest{ UserId: userID, StarId: starID, }) if err != nil { logger.Logger.Error("Failed to call UserService.GetFanProfile", zap.Int64("user_id", userID), zap.Int64("star_id", starID), zap.Error(err), ) return nil, err } if resp.Base.Code != 200 { logger.Logger.Warn("UserService.GetFanProfile returned error", zap.Int64("user_id", userID), zap.Int64("star_id", starID), zap.String("message", resp.Base.Message), ) return nil, nil } if resp.Profile == nil { return nil, nil } return &FanProfile{ UserID: resp.Profile.UserId, StarID: resp.Profile.StarId, Nickname: resp.Profile.Nickname, AvatarUrl: resp.Profile.AvatarUrl, Level: resp.Profile.Level, CrystalBalance: resp.Profile.CrystalBalance, }, nil } // UpdateCrystalBalance 更新水晶余额 func (c *userRPCClient) UpdateCrystalBalance(userID, starID int64, delta int64) (int64, error) { logger.Logger.Debug("Calling UserService.UpdateCrystalBalance", zap.Int64("user_id", userID), zap.Int64("star_id", starID), zap.Int64("delta", delta), ) ctx := context.Background() resp, err := c.client.UpdateCrystalBalance(ctx, &pbUser.UpdateCrystalBalanceRequest{ UserId: userID, StarId: starID, Delta: delta, }) if err != nil { logger.Logger.Error("Failed to call UserService.UpdateCrystalBalance", zap.Int64("user_id", userID), zap.Int64("star_id", starID), zap.Int64("delta", delta), zap.Error(err), ) return 0, err } if resp.Base.Code != 200 { logger.Logger.Warn("UserService.UpdateCrystalBalance returned error", zap.Int64("user_id", userID), zap.Int64("star_id", starID), zap.Int64("delta", delta), zap.String("message", resp.Base.Message), ) return 0, nil } return resp.NewBalance, nil }