2026-06-27 16:59:30 +08:00

72 lines
2.8 KiB
Go
Raw 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 service
import (
"context"
"time"
"hyapp/services/room-service/internal/room/outbox"
"hyapp/services/room-service/internal/room/rank"
"hyapp/services/room-service/internal/room/state"
roomv1 "hyapp.local/api/proto/room/v1"
)
// SendGift 先同步调用 wallet再在 Room Cell 内完成热度、榜单和房间事件落地。
func (s *Service) SendGift(ctx context.Context, req *roomv1.SendGiftRequest) (*roomv1.SendGiftResponse, error) {
return s.sendGift(ctx, req, giftSendOptions{})
}
// SendGiftBatch 是多人送礼展示入口;它复用送礼账务、幸运礼物和 Room Cell 提交流程,
// 但只在 batch 分支生成 RoomGiftBatchSent 展示消息,避免普通 SendGift 被 display_mode 隐式改变行为。
func (s *Service) SendGiftBatch(ctx context.Context, req *roomv1.SendGiftRequest) (*roomv1.SendGiftResponse, error) {
return s.sendGiftBatch(ctx, req)
}
func (s *Service) sendGiftBatch(ctx context.Context, req *roomv1.SendGiftRequest) (*roomv1.SendGiftResponse, error) {
return s.sendGift(ctx, req, giftSendOptions{BatchDisplay: true})
}
type giftSendOptions struct {
Robot robotGiftOptions
BatchDisplay bool
}
func (s *Service) sendGift(ctx context.Context, req *roomv1.SendGiftRequest, options giftSendOptions) (*roomv1.SendGiftResponse, error) {
ctx = contextFromMeta(ctx, req.GetMeta())
flow := newGiftFlow(s, ctx, req, options)
result, err := s.mutateRoom(ctx, flow.cmd, true, func(now time.Time, current *state.RoomState, localRank *rank.LocalRank) (mutationResult, []outbox.Record, error) {
// 阶段顺序保持原 sendGift 同步主链路:先校验房间态,再取房间事实,再扣费/抽奖,最后提交 Room Cell 状态和构造事件。
if err := flow.validateBeforeDebit(current); err != nil {
return mutationResult{}, nil, err
}
if err := flow.prepareRoomFacts(); err != nil {
return mutationResult{}, nil, err
}
if err := flow.debitAndSettle(now); err != nil {
return mutationResult{}, nil, err
}
if err := flow.applyRoomState(now, current, localRank); err != nil {
return mutationResult{}, nil, err
}
return flow.buildMutationResult(now, current)
})
if err != nil {
return nil, err
}
return &roomv1.SendGiftResponse{
Result: commandResult(result.applied, result.snapshot.GetVersion(), s.clock.Now()),
BillingReceiptId: result.billingReceiptID,
RoomHeat: result.roomHeat,
GiftRank: result.giftRank,
Room: result.snapshot,
Rocket: result.snapshot.GetRocket(),
LuckyGift: result.luckyGift,
LuckyGifts: result.luckyGifts,
CoinBalanceAfter: result.coinBalanceAfter,
GiftIncomeBalanceAfter: result.giftIncomeBalanceAfter,
BatchDisplay: result.batchDisplay,
}, nil
}