51 lines
1.7 KiB
Go
51 lines
1.7 KiB
Go
package repository
|
||
|
||
import (
|
||
"context"
|
||
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// MediaRepository 跨表图片引用计数(清理S4孤儿文件的判定依据)。
|
||
//
|
||
// S4 key 为 sha1 内容寻址:同一张图若出现在多个图集/草稿里,在库中是同一个 key。
|
||
// 因此删除图集时绝不能「删库即删S4」——必须先确认该 key 在全库已无任何引用,
|
||
// 否则会误删被其他图集仍在用的图片。本接口提供唯一权威的引用计数查询。
|
||
type MediaRepository interface {
|
||
// CountImageKeyRefs 统计某S4 key 在全部图片明细表中仍被引用的数量(is_deleted=0)。
|
||
// 返回 0 表示该 key 已成孤儿,可安全删除S4对象。
|
||
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 保存S4 key 的全部图片明细表(单表发布模型下即两张正式图片表)。
|
||
// 引用计数必须覆盖全部图片表,漏掉任意一张都会把「仍被引用」误判为孤儿而误删。
|
||
var imageTables = []string{
|
||
"brand_runway_images",
|
||
"street_snap_images",
|
||
}
|
||
|
||
// CountImageKeyRefs 跨全部图片明细表统计 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
|
||
}
|