package luckygiftclient import ( "context" "time" luckygiftv1 "hyapp.local/api/proto/luckygift/v1" "google.golang.org/grpc" ) type SendCommand struct { TraceRequestID string AppCode string RequestID string ExternalUserID string GiftCount int64 UnitAmount int64 TotalAmount int64 Currency string MetadataJSON string PaidAtMS int64 } type SendResult struct { DrawID string `json:"draw_id,omitempty"` RequestID string `json:"request_id,omitempty"` AppCode string `json:"app_code,omitempty"` ExternalUserID string `json:"external_user_id,omitempty"` GiftCount int64 `json:"gift_count,omitempty"` UnitAmount int64 `json:"unit_amount,omitempty"` TotalAmount int64 `json:"total_amount,omitempty"` RewardAmount int64 `json:"reward_amount,omitempty"` MultiplierPPM int64 `json:"multiplier_ppm,omitempty"` RewardStatus string `json:"reward_status,omitempty"` RuleVersion int64 `json:"rule_version,omitempty"` CreatedAtMS int64 `json:"created_at_ms,omitempty"` } type Client interface { SendLuckyGift(ctx context.Context, cmd SendCommand) (SendResult, error) } type GRPCClient struct { client luckygiftv1.LuckyGiftServiceClient } func NewGRPC(conn grpc.ClientConnInterface) *GRPCClient { return &GRPCClient{client: luckygiftv1.NewLuckyGiftServiceClient(conn)} } func (c *GRPCClient) SendLuckyGift(ctx context.Context, cmd SendCommand) (SendResult, error) { resp, err := c.client.ExecuteExternalGiftDraw(ctx, &luckygiftv1.ExternalGiftDrawRequest{ Meta: &luckygiftv1.RequestMeta{ RequestId: cmd.TraceRequestID, Caller: "luck-gateway", SentAtMs: time.Now().UTC().UnixMilli(), AppCode: cmd.AppCode, }, AppCode: cmd.AppCode, ExternalUserId: cmd.ExternalUserID, RequestId: cmd.RequestID, GiftCount: cmd.GiftCount, UnitAmount: cmd.UnitAmount, TotalAmount: cmd.TotalAmount, Currency: cmd.Currency, PaidAtMs: cmd.PaidAtMS, MetadataJson: cmd.MetadataJSON, }) if err != nil { return SendResult{}, err } return fromProto(resp), nil } func fromProto(result *luckygiftv1.ExternalGiftDrawResponse) SendResult { if result == nil { return SendResult{} } return SendResult{ DrawID: result.GetDrawId(), RequestID: result.GetRequestId(), AppCode: result.GetAppCode(), ExternalUserID: result.GetExternalUserId(), GiftCount: result.GetGiftCount(), UnitAmount: result.GetUnitAmount(), TotalAmount: result.GetTotalAmount(), RewardAmount: result.GetRewardAmount(), MultiplierPPM: result.GetMultiplierPpm(), RewardStatus: result.GetRewardStatus(), RuleVersion: result.GetRuleVersion(), CreatedAtMS: result.GetCreatedAtMs(), } }