2026-05-22 11:57:04 +08:00

190 lines
7.2 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/firstrecharge"
service "hyapp/services/activity-service/internal/service/firstrecharge"
)
// FirstRechargeRewardServer 暴露 App 首冲奖励查询和内部充值事实消费入口。
type FirstRechargeRewardServer struct {
activityv1.UnimplementedFirstRechargeRewardServiceServer
svc *service.Service
}
func NewFirstRechargeRewardServer(svc *service.Service) *FirstRechargeRewardServer {
return &FirstRechargeRewardServer{svc: svc}
}
func (s *FirstRechargeRewardServer) GetFirstRechargeRewardStatus(ctx context.Context, req *activityv1.GetFirstRechargeRewardStatusRequest) (*activityv1.GetFirstRechargeRewardStatusResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
status, err := s.svc.GetStatus(ctx, req.GetUserId())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.GetFirstRechargeRewardStatusResponse{Status: firstRechargeRewardStatusToProto(status)}, nil
}
func (s *FirstRechargeRewardServer) ConsumeFirstRechargeReward(ctx context.Context, req *activityv1.ConsumeFirstRechargeRewardRequest) (*activityv1.ConsumeFirstRechargeRewardResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
claim, consumed, reason, err := s.svc.Consume(ctx, domain.RechargeEvent{
AppCode: req.GetMeta().GetAppCode(),
EventID: req.GetEventId(),
TransactionID: req.GetTransactionId(),
CommandID: req.GetCommandId(),
UserID: req.GetUserId(),
RechargeCoinAmount: req.GetRechargeCoinAmount(),
RechargeSequence: req.GetRechargeSequence(),
RechargeType: req.GetRechargeType(),
OccurredAtMS: req.GetOccurredAtMs(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.ConsumeFirstRechargeRewardResponse{
Claim: firstRechargeRewardClaimToProto(claim),
Consumed: consumed,
Reason: reason,
}, nil
}
// AdminFirstRechargeRewardServer 暴露后台配置和发放记录查询入口。
type AdminFirstRechargeRewardServer struct {
activityv1.UnimplementedAdminFirstRechargeRewardServiceServer
svc *service.Service
}
func NewAdminFirstRechargeRewardServer(svc *service.Service) *AdminFirstRechargeRewardServer {
return &AdminFirstRechargeRewardServer{svc: svc}
}
func (s *AdminFirstRechargeRewardServer) GetFirstRechargeRewardConfig(ctx context.Context, req *activityv1.GetFirstRechargeRewardConfigRequest) (*activityv1.GetFirstRechargeRewardConfigResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
config, err := s.svc.GetConfig(ctx)
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.GetFirstRechargeRewardConfigResponse{Config: firstRechargeRewardConfigToProto(config)}, nil
}
func (s *AdminFirstRechargeRewardServer) UpdateFirstRechargeRewardConfig(ctx context.Context, req *activityv1.UpdateFirstRechargeRewardConfigRequest) (*activityv1.UpdateFirstRechargeRewardConfigResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
tiers := make([]domain.Tier, 0, len(req.GetTiers()))
for _, tier := range req.GetTiers() {
tiers = append(tiers, domain.Tier{
TierID: tier.GetTierId(),
TierCode: tier.GetTierCode(),
TierName: tier.GetTierName(),
MinCoinAmount: tier.GetMinCoinAmount(),
MaxCoinAmount: tier.GetMaxCoinAmount(),
ResourceGroupID: tier.GetResourceGroupId(),
Status: tier.GetStatus(),
SortOrder: tier.GetSortOrder(),
})
}
config, err := s.svc.UpdateConfig(ctx, domain.Config{
Enabled: req.GetEnabled(),
Tiers: tiers,
UpdatedByAdminID: req.GetOperatorAdminId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &activityv1.UpdateFirstRechargeRewardConfigResponse{Config: firstRechargeRewardConfigToProto(config)}, nil
}
func (s *AdminFirstRechargeRewardServer) ListFirstRechargeRewardClaims(ctx context.Context, req *activityv1.ListFirstRechargeRewardClaimsRequest) (*activityv1.ListFirstRechargeRewardClaimsResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
claims, total, err := s.svc.ListClaims(ctx, domain.ClaimQuery{
Status: req.GetStatus(),
UserID: req.GetUserId(),
Page: req.GetPage(),
PageSize: req.GetPageSize(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &activityv1.ListFirstRechargeRewardClaimsResponse{Claims: make([]*activityv1.FirstRechargeRewardClaim, 0, len(claims)), Total: total}
for _, claim := range claims {
resp.Claims = append(resp.Claims, firstRechargeRewardClaimToProto(claim))
}
return resp, nil
}
func firstRechargeRewardStatusToProto(status domain.StatusResult) *activityv1.FirstRechargeRewardStatus {
resp := &activityv1.FirstRechargeRewardStatus{
Enabled: status.Enabled,
Tiers: make([]*activityv1.FirstRechargeRewardTier, 0, len(status.Tiers)),
Rewarded: status.Rewarded,
Claim: firstRechargeRewardClaimToProto(status.Claim),
ServerTimeMs: status.ServerTimeMS,
}
for _, tier := range status.Tiers {
resp.Tiers = append(resp.Tiers, firstRechargeRewardTierToProto(tier))
}
return resp
}
func firstRechargeRewardConfigToProto(config domain.Config) *activityv1.FirstRechargeRewardConfig {
resp := &activityv1.FirstRechargeRewardConfig{
AppCode: config.AppCode,
Enabled: config.Enabled,
Tiers: make([]*activityv1.FirstRechargeRewardTier, 0, len(config.Tiers)),
UpdatedByAdminId: config.UpdatedByAdminID,
CreatedAtMs: config.CreatedAtMS,
UpdatedAtMs: config.UpdatedAtMS,
}
for _, tier := range config.Tiers {
resp.Tiers = append(resp.Tiers, firstRechargeRewardTierToProto(tier))
}
return resp
}
func firstRechargeRewardTierToProto(tier domain.Tier) *activityv1.FirstRechargeRewardTier {
return &activityv1.FirstRechargeRewardTier{
TierId: tier.TierID,
TierCode: tier.TierCode,
TierName: tier.TierName,
MinCoinAmount: tier.MinCoinAmount,
MaxCoinAmount: tier.MaxCoinAmount,
ResourceGroupId: tier.ResourceGroupID,
Status: tier.Status,
SortOrder: tier.SortOrder,
CreatedAtMs: tier.CreatedAtMS,
UpdatedAtMs: tier.UpdatedAtMS,
}
}
func firstRechargeRewardClaimToProto(claim domain.Claim) *activityv1.FirstRechargeRewardClaim {
if claim.ClaimID == "" {
return nil
}
return &activityv1.FirstRechargeRewardClaim{
ClaimId: claim.ClaimID,
EventId: claim.EventID,
TransactionId: claim.TransactionID,
CommandId: claim.CommandID,
UserId: claim.UserID,
TierId: claim.TierID,
TierCode: claim.TierCode,
ResourceGroupId: claim.ResourceGroupID,
RechargeCoinAmount: claim.RechargeCoinAmount,
RechargeSequence: claim.RechargeSequence,
RechargeType: claim.RechargeType,
Status: claim.Status,
WalletCommandId: claim.WalletCommandID,
WalletGrantId: claim.WalletGrantID,
FailureReason: claim.FailureReason,
RechargedAtMs: claim.RechargedAtMS,
GrantedAtMs: claim.GrantedAtMS,
CreatedAtMs: claim.CreatedAtMS,
UpdatedAtMs: claim.UpdatedAtMS,
}
}