fix: Service 层移除直接持有的 *gorm.DB,引入 Repository Transaction 方法

- ReactionStore/FollowStore/EnergyStore/FavoriteStore 接口新增 Transaction 方法
- EnergyStore.Transaction 支持跨仓库事务(EnergyStore + FundStore)
- ReactionRepo/FollowRepo/FavoriteRepo/EnergyRepo 实现 Transaction 方法
- ReactionRepo 新增 GetPostLikesCount 方法,消除 Service 直查 DB
- ReactionService/FollowService/FavoriteService/EnergyService 移除 db 字段
- EnergyRepo 通过 SetFundStore 注入 FundStore 用于跨仓库事务
- 更新 deps_extra.go 构造函数调用
This commit is contained in:
2026-06-02 16:46:44 +08:00
parent 1cb7a832f1
commit 3df7b2e672
14 changed files with 94 additions and 92 deletions

View File

@ -32,6 +32,8 @@ type FavoriteStore interface {
AggregateFavoritesByAuthor(userID uint, since string) ([]TrendPoint, error)
// Tx
WithTx(tx *gorm.DB) FavoriteStore
// Transaction 在事务内执行业务逻辑,自动管理 WithTx
Transaction(fn func(tx FavoriteStore) error) error
}
// FavoriteListResult 收藏夹列表 + 收藏内容
@ -56,13 +58,12 @@ type FavoriteStatus struct {
// FavoriteService 收藏夹业务逻辑
type FavoriteService struct {
db *gorm.DB
repo FavoriteStore
}
// NewFavoriteService 构造函数
func NewFavoriteService(db *gorm.DB, repo FavoriteStore) *FavoriteService {
return &FavoriteService{db: db, repo: repo}
func NewFavoriteService(repo FavoriteStore) *FavoriteService {
return &FavoriteService{repo: repo}
}
// ensureDefaultFolder 确保用户有默认收藏夹(不存在则创建)
@ -187,9 +188,7 @@ func (s *FavoriteService) DeleteFolder(userID, folderID uint) error {
return fmt.Errorf("默认收藏夹不可删除")
}
return s.db.Transaction(func(tx *gorm.DB) error {
txRepo := s.repo.WithTx(tx)
return s.repo.Transaction(func(txRepo FavoriteStore) error {
// 先清理 items 的 fans 计数
items, _, _ := txRepo.ListItemsByFolder(folderID, 0, 10000)
for _, item := range items {