2026-06-06 13:50:46 +08:00

161 lines
6.1 KiB
Go

package grpc
import (
"context"
activityv1 "hyapp.local/api/proto/activity/v1"
"hyapp/pkg/appcode"
"hyapp/pkg/xerr"
domain "hyapp/services/activity-service/internal/domain/registrationreward"
service "hyapp/services/activity-service/internal/service/registrationreward"
)
// RegistrationRewardServer 暴露 App 查询和 user-service 注册后发放接口。
type RegistrationRewardServer struct {
activityv1.UnimplementedRegistrationRewardServiceServer
svc *service.Service
}
func NewRegistrationRewardServer(svc *service.Service) *RegistrationRewardServer {
return &RegistrationRewardServer{svc: svc}
}
func (s *RegistrationRewardServer) GetRegistrationRewardEligibility(ctx context.Context, req *activityv1.GetRegistrationRewardEligibilityRequest) (*activityv1.GetRegistrationRewardEligibilityResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
eligibility, err := s.svc.GetEligibility(ctx, req.GetUserId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.GetRegistrationRewardEligibilityResponse{Eligibility: eligibilityToProto(eligibility)}, nil
}
func (s *RegistrationRewardServer) IssueRegistrationReward(ctx context.Context, req *activityv1.IssueRegistrationRewardRequest) (*activityv1.IssueRegistrationRewardResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
claim, eligibility, issued, err := s.svc.IssueRegistrationReward(ctx, domain.IssueCommand{
UserID: req.GetUserId(),
CommandID: req.GetCommandId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.IssueRegistrationRewardResponse{
Claim: registrationRewardClaimToProto(claim),
Eligibility: eligibilityToProto(eligibility),
Issued: issued,
}, nil
}
// AdminRegistrationRewardServer 暴露后台配置和领取记录查询入口。
type AdminRegistrationRewardServer struct {
activityv1.UnimplementedAdminRegistrationRewardServiceServer
svc *service.Service
}
func NewAdminRegistrationRewardServer(svc *service.Service) *AdminRegistrationRewardServer {
return &AdminRegistrationRewardServer{svc: svc}
}
func (s *AdminRegistrationRewardServer) GetRegistrationRewardConfig(ctx context.Context, req *activityv1.GetRegistrationRewardConfigRequest) (*activityv1.GetRegistrationRewardConfigResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
config, err := s.svc.GetConfig(ctx)
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.GetRegistrationRewardConfigResponse{Config: registrationRewardConfigToProto(config)}, nil
}
func (s *AdminRegistrationRewardServer) UpdateRegistrationRewardConfig(ctx context.Context, req *activityv1.UpdateRegistrationRewardConfigRequest) (*activityv1.UpdateRegistrationRewardConfigResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
config, err := s.svc.UpdateConfig(ctx, domain.Config{
Enabled: req.GetEnabled(),
RewardType: req.GetRewardType(),
CoinAmount: req.GetCoinAmount(),
ResourceGroupID: req.GetResourceGroupId(),
DailyLimit: req.GetDailyLimit(),
UpdatedByAdminID: req.GetOperatorAdminId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.UpdateRegistrationRewardConfigResponse{Config: registrationRewardConfigToProto(config)}, nil
}
func (s *AdminRegistrationRewardServer) ListRegistrationRewardClaims(ctx context.Context, req *activityv1.ListRegistrationRewardClaimsRequest) (*activityv1.ListRegistrationRewardClaimsResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
claims, total, todayClaimedCount, err := s.svc.ListClaims(ctx, domain.ClaimQuery{
Status: req.GetStatus(),
UserID: req.GetUserId(),
ClaimedStartMS: req.GetClaimedStartMs(),
ClaimedEndMS: req.GetClaimedEndMs(),
Page: req.GetPage(),
PageSize: req.GetPageSize(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &activityv1.ListRegistrationRewardClaimsResponse{
Claims: make([]*activityv1.RegistrationRewardClaim, 0, len(claims)),
Total: total,
TodayClaimedCount: todayClaimedCount,
}
for _, claim := range claims {
resp.Claims = append(resp.Claims, registrationRewardClaimToProto(claim))
}
return resp, nil
}
func registrationRewardConfigToProto(config domain.Config) *activityv1.RegistrationRewardConfig {
return &activityv1.RegistrationRewardConfig{
AppCode: config.AppCode,
Enabled: config.Enabled,
RewardType: config.RewardType,
CoinAmount: config.CoinAmount,
ResourceGroupId: config.ResourceGroupID,
DailyLimit: config.DailyLimit,
UpdatedByAdminId: config.UpdatedByAdminID,
CreatedAtMs: config.CreatedAtMS,
UpdatedAtMs: config.UpdatedAtMS,
}
}
func registrationRewardClaimToProto(claim domain.Claim) *activityv1.RegistrationRewardClaim {
if claim.ClaimID == "" {
return nil
}
return &activityv1.RegistrationRewardClaim{
ClaimId: claim.ClaimID,
CommandId: claim.CommandID,
UserId: claim.UserID,
RewardDay: claim.RewardDay,
RewardType: claim.RewardType,
CoinAmount: claim.CoinAmount,
ResourceGroupId: claim.ResourceGroupID,
Status: claim.Status,
WalletCommandId: claim.WalletCommandID,
WalletTransactionId: claim.WalletTransactionID,
ResourceGrantId: claim.ResourceGrantID,
FailureReason: claim.FailureReason,
ClaimedAtMs: claim.ClaimedAtMS,
CreatedAtMs: claim.CreatedAtMS,
UpdatedAtMs: claim.UpdatedAtMS,
}
}
func eligibilityToProto(item domain.Eligibility) *activityv1.RegistrationRewardEligibility {
return &activityv1.RegistrationRewardEligibility{
CanReceive: item.CanReceive,
Reason: item.Reason,
Enabled: item.Enabled,
RewardType: item.RewardType,
CoinAmount: item.CoinAmount,
ResourceGroupId: item.ResourceGroupID,
DailyLimit: item.DailyLimit,
DailyUsed: item.DailyUsed,
DailyRemaining: item.DailyRemaining,
RewardDay: item.RewardDay,
ServerTimeMs: item.ServerTimeMS,
}
}