Files
backend_v2/internal/repository/media_repository.go
2026-09-20 01:06:13 +08:00

53 lines
1.7 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 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 的全部图片明细表(已晋升的正式表 + 待审草稿表)。
// 引用计数必须覆盖这 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
}