owpengram-server/internal/store/stars.go

38 lines
2.3 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 store
import (
"context"
"telesrv/internal/domain"
)
// StarsStore 持久化 Stars 本地账本per-user 余额 + 交易流水。
// 借记/贷记/授予必须各自在单个事务内原子完成(余额与流水不漂移)。
type StarsStore interface {
// GetBalance 返回账号当前余额无行时返回零值Balance 0, Granted false
GetBalance(ctx context.Context, userID int64) (domain.StarsBalance, error)
// EnsureGrant 幂等地应用一次起始授予:仅当从未授予时贷记 amount 并置 granted=true、
// 写一条 grant 流水,全在单事务内完成。返回最新余额 + 本次是否实际授予。
EnsureGrant(ctx context.Context, userID, amount int64, date int) (domain.StarsBalance, bool, error)
// Credit 在单事务内为账号入账amount>0并写流水amount=+x余额行不存在则创建。
Credit(ctx context.Context, userID, amount int64, reason domain.StarsTransactionReason, peer domain.Peer, date int, title, desc string) (domain.StarsBalance, error)
// Debit 在单事务内做 SELECT ... FOR UPDATE 充足性检查后扣款amount>0写流水amount=-x
// 余额不足返回 domain.ErrStarsInsufficient。
Debit(ctx context.Context, userID, amount int64, reason domain.StarsTransactionReason, peer domain.Peer, date int, title, desc string) (domain.StarsBalance, error)
// ListTransactions 按方向与顺序做 keyset 分页,返回一页流水 + 当前余额。
ListTransactions(ctx context.Context, userID int64, query domain.StarsTransactionQuery) (domain.StarsTransactionPage, error)
}
// StarsPurchaseStore owns fiat self-topup, friend-gift and giveaway-launch
// aggregates. Successful settlement commits the affected ledger/message box
// atomically; exact form retries return the original receipt.
type StarsPurchaseStore interface {
IssueStarsPurchaseForm(context.Context, domain.StarsPurchaseForm) (domain.StarsPurchaseForm, error)
PurchaseStars(context.Context, domain.StarsPurchaseRequest) (domain.StarsPurchaseResult, error)
}
// StarsGiveawayStore exposes the viewer-specific state of launch cards without
// forcing lightweight purchase-store fakes to implement the read model.
type StarsGiveawayStore interface {
GetStarsGiveawayInfo(context.Context, int64, int64, int, int) (domain.StarsGiveawayInfo, error)
}