190 lines
7.2 KiB
Go
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,
|
|
}
|
|
}
|