update
This commit is contained in:
52
internal/repository/media_repository.go
Normal file
52
internal/repository/media_repository.go
Normal file
@ -0,0 +1,52 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// MediaRepository 跨表图片引用计数(清理七牛孤儿文件的判定依据)。
|
||||
//
|
||||
// 七牛 key 为 sha1 内容寻址:同一张图若出现在多个图集/草稿里,在库中是同一个 key。
|
||||
// 因此删除图集时绝不能「删库即删七牛」——必须先确认该 key 在全库已无任何引用,
|
||||
// 否则会误删被其他图集仍在用的图片。本接口提供唯一权威的引用计数查询。
|
||||
type MediaRepository interface {
|
||||
// CountImageKeyRefs 统计某七牛 key 在全部图片明细表中仍被引用的数量(is_deleted=0)。
|
||||
// 返回 0 表示该 key 已成孤儿,可安全删除七牛对象。
|
||||
CountImageKeyRefs(ctx context.Context, key string) (int, error)
|
||||
}
|
||||
|
||||
type mediaRepository struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
// NewMediaRepository 创建跨表图片引用计数仓储。
|
||||
func NewMediaRepository(db *gorm.DB) MediaRepository {
|
||||
return &mediaRepository{db: db}
|
||||
}
|
||||
|
||||
// imageTables 保存七牛 key 的全部图片明细表(已晋升的正式表 + 待审草稿表)。
|
||||
// 引用计数必须覆盖这 4 张,漏掉任意一张都会把「仍被引用」误判为孤儿而误删。
|
||||
var imageTables = []string{
|
||||
"brand_runway_images",
|
||||
"brand_runway_draft_images",
|
||||
"street_snap_images",
|
||||
"street_snap_draft_images",
|
||||
}
|
||||
|
||||
// CountImageKeyRefs 跨 4 张表统计 key 的存活引用数(is_deleted=0)。
|
||||
func (r *mediaRepository) CountImageKeyRefs(ctx context.Context, key string) (int, error) {
|
||||
if key == "" {
|
||||
return 0, nil
|
||||
}
|
||||
total := 0
|
||||
for _, t := range imageTables {
|
||||
var c int64
|
||||
if err := r.db.WithContext(ctx).Table(t).Where("image = ? AND is_deleted = 0", key).Count(&c).Error; err != nil {
|
||||
return 0, err
|
||||
}
|
||||
total += int(c)
|
||||
}
|
||||
return total, nil
|
||||
}
|
||||
Reference in New Issue
Block a user