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 }