topfans/backend/services/activityService/provider/activity_provider.go
2026-05-12 10:42:00 +08:00

221 lines
6.5 KiB
Go
Raw Permalink 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.

package provider
import (
"context"
"time"
appErrors "github.com/topfans/backend/pkg/errors"
"github.com/topfans/backend/pkg/logger"
pb "github.com/topfans/backend/pkg/proto/activity"
pbCommon "github.com/topfans/backend/pkg/proto/common"
"github.com/topfans/backend/services/activityService/service"
"go.uber.org/zap"
)
// ActivityProvider 活动服务Provider实现
// 实现 Triple 协议生成的 ActivityServiceHandler 接口
type ActivityProvider struct {
activityService service.ActivityService
}
// 确保 ActivityProvider 实现了 ActivityServiceHandler 接口
var _ pb.ActivityServiceHandler = (*ActivityProvider)(nil)
// NewActivityProvider 创建活动服务Provider实例
func NewActivityProvider(activityService service.ActivityService) *ActivityProvider {
return &ActivityProvider{
activityService: activityService,
}
}
// GetActivityList 获取活动列表
func (p *ActivityProvider) GetActivityList(ctx context.Context, req *pb.GetActivityListRequest) (*pb.GetActivityListResponse, error) {
logger.Logger.Info("Received GetActivityList request",
zap.Int64("star_id", req.StarId),
zap.String("status", req.Status),
zap.Int32("page", req.Page),
zap.Int32("page_size", req.PageSize),
)
// 调用Service层
resp, err := p.activityService.GetActivityList(ctx, req)
if err != nil {
logger.Logger.Error("GetActivityList failed", zap.Error(err))
return &pb.GetActivityListResponse{
Base: &pbCommon.BaseResponse{
Code: appErrors.ToStatusCode(err),
Message: err.Error(),
Timestamp: time.Now().UnixMilli(),
},
}, err
}
logger.Logger.Debug("GetActivityList successful",
zap.Int("activities_count", len(resp.Activities)),
)
return resp, nil
}
// GetActivity 获取活动详情
func (p *ActivityProvider) GetActivity(ctx context.Context, req *pb.GetProgressRequest) (*pb.Activity, error) {
logger.Logger.Info("Received GetActivity request",
zap.Int64("activity_id", req.ActivityId),
)
// 调用Service层
activity, err := p.activityService.GetActivity(ctx, req)
if err != nil {
logger.Logger.Error("GetActivity failed", zap.Error(err))
if err == appErrors.ErrActivityNotFound {
return nil, appErrors.ErrActivityNotFound
}
return nil, err
}
logger.Logger.Debug("GetActivity successful",
zap.Int64("activity_id", activity.Id),
)
return activity, nil
}
// GetActivityItems 获取活动道具列表
func (p *ActivityProvider) GetActivityItems(ctx context.Context, req *pb.GetProgressRequest) (*pb.ActivityItemsResponse, error) {
logger.Logger.Info("Received GetActivityItems request",
zap.Int64("activity_id", req.ActivityId),
)
// 调用Service层
items, err := p.activityService.GetActivityItems(ctx, req)
if err != nil {
logger.Logger.Error("GetActivityItems failed", zap.Error(err))
return &pb.ActivityItemsResponse{
Items: []*pb.ActivityItem{},
}, err
}
logger.Logger.Debug("GetActivityItems successful",
zap.Int("items_count", len(items)),
)
return &pb.ActivityItemsResponse{
Items: items,
}, nil
}
// GetProgress 获取活动进度
func (p *ActivityProvider) GetProgress(ctx context.Context, req *pb.GetProgressRequest) (*pb.GetProgressResponse, error) {
logger.Logger.Info("Received GetProgress request",
zap.Int64("activity_id", req.ActivityId),
)
// 调用Service层
resp, err := p.activityService.GetProgress(ctx, req)
if err != nil {
logger.Logger.Error("GetProgress failed", zap.Error(err))
return &pb.GetProgressResponse{
Base: &pbCommon.BaseResponse{
Code: appErrors.ToStatusCode(err),
Message: err.Error(),
Timestamp: time.Now().UnixMilli(),
},
}, err
}
logger.Logger.Debug("GetProgress successful",
zap.Int64("current_progress", resp.CurrentProgress),
zap.Int64("target_progress", resp.TargetProgress),
)
return resp, nil
}
// PurchaseItem 购买道具
func (p *ActivityProvider) PurchaseItem(ctx context.Context, req *pb.PurchaseItemRequest) (*pb.PurchaseItemResponse, error) {
logger.Logger.Info("Received PurchaseItem request",
zap.Int64("activity_id", req.ActivityId),
zap.String("item_type", req.ItemType),
zap.Int32("quantity", req.Quantity),
zap.Int64("star_id", req.StarId),
)
// 调用Service层
resp, err := p.activityService.PurchaseItem(ctx, req)
if err != nil {
logger.Logger.Error("PurchaseItem failed", zap.Error(err))
return &pb.PurchaseItemResponse{
Base: &pbCommon.BaseResponse{
Code: appErrors.ToStatusCode(err),
Message: err.Error(),
Timestamp: time.Now().UnixMilli(),
},
}, err
}
logger.Logger.Info("PurchaseItem successful",
zap.Int64("total_crystal_spent", resp.TotalCrystalSpent),
zap.Int64("total_contribution", resp.TotalContribution),
zap.Int64("remaining_balance", resp.RemainingBalance),
)
return resp, nil
}
// GetContributionRanking 获取贡献点排名
func (p *ActivityProvider) GetContributionRanking(ctx context.Context, req *pb.ContributionRankingRequest) (*pb.ContributionRankingResponse, error) {
logger.Logger.Info("Received GetContributionRanking request",
zap.Int64("activity_id", req.ActivityId),
zap.Int64("star_id", req.StarId),
zap.Int32("page", req.Page),
zap.Int32("page_size", req.PageSize),
)
// 调用Service层
resp, err := p.activityService.GetContributionRanking(ctx, req)
if err != nil {
logger.Logger.Error("GetContributionRanking failed", zap.Error(err))
return &pb.ContributionRankingResponse{
Base: &pbCommon.BaseResponse{
Code: appErrors.ToStatusCode(err),
Message: err.Error(),
Timestamp: time.Now().UnixMilli(),
},
}, nil
}
logger.Logger.Debug("GetContributionRanking successful",
zap.Int("items_count", len(resp.Items)),
)
return resp, nil
}
// GetMintingActivities 获取铸造活动列表用于运营banner
func (p *ActivityProvider) GetMintingActivities(ctx context.Context, req *pb.GetMintingActivitiesRequest) (*pb.GetMintingActivitiesResponse, error) {
logger.Logger.Info("Received GetMintingActivities request",
zap.Int64("star_id", req.StarId),
zap.Int32("page", req.Page),
zap.Int32("page_size", req.PageSize),
)
// 调用Service层
resp, err := p.activityService.GetMintingActivities(ctx, req)
if err != nil {
logger.Logger.Error("GetMintingActivities failed", zap.Error(err))
return &pb.GetMintingActivitiesResponse{
Base: &pbCommon.BaseResponse{
Code: appErrors.ToStatusCode(err),
Message: err.Error(),
Timestamp: time.Now().UnixMilli(),
},
}, err
}
logger.Logger.Debug("GetMintingActivities successful",
zap.Int("activities_count", len(resp.Activities)),
)
return resp, nil
}