update
This commit is contained in:
@ -331,21 +331,49 @@ func (r *articleRepository) UpdateRunway(ctx context.Context, id uint32, fields
|
||||
func (r *articleRepository) DeleteRunwayImage(ctx context.Context, imageID uint32) error {
|
||||
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||||
var img model.BrandRunwayImage
|
||||
err := tx.Select("runway_id").Where("id = ?", imageID).First(&img).Error
|
||||
err := tx.Select("runway_id, image").Where("id = ?", imageID).First(&img).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 取出父记录的封面,判断被删图是否正是封面(防止封面悬空指向已删图 —— 设计规格 §12 唯一真数据丢失窗口)。
|
||||
var rw model.BrandRunway
|
||||
if err := tx.Select("cover").Where("id = ?", img.RunwayID).First(&rw).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if err := tx.Model(&model.BrandRunwayImage{}).
|
||||
Where("id = ? AND is_deleted = 0", imageID).
|
||||
Updates(map[string]any{"is_deleted": 1, "updated_at": uint32(time.Now().Unix())}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Exec(`UPDATE brand_runways SET image_count =
|
||||
if err := tx.Exec(`UPDATE brand_runways SET image_count =
|
||||
(SELECT COUNT(*) FROM brand_runway_images WHERE runway_id = ? AND is_deleted = 0 AND is_detail = 0)
|
||||
WHERE id = ?`, img.RunwayID, img.RunwayID).Error
|
||||
WHERE id = ?`, img.RunwayID, img.RunwayID).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
// 被删图是封面:重指向另一张存活图(无存活图则清空),避免封面悬空。
|
||||
if rw.Cover == img.Image {
|
||||
cover := ""
|
||||
var survivor struct {
|
||||
Image string `gorm:"column:image"`
|
||||
}
|
||||
serr := tx.Raw(
|
||||
"SELECT image FROM brand_runway_images WHERE runway_id = ? AND is_deleted = 0 ORDER BY id ASC LIMIT 1",
|
||||
img.RunwayID,
|
||||
).Scan(&survivor).Error
|
||||
if serr == nil {
|
||||
cover = survivor.Image
|
||||
} else if !errors.Is(serr, gorm.ErrRecordNotFound) {
|
||||
return serr
|
||||
}
|
||||
if err := tx.Model(&model.BrandRunway{}).Where("id = ?", img.RunwayID).
|
||||
Updates(map[string]any{"cover": cover, "updated_at": uint32(time.Now().Unix())}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
@ -383,6 +411,13 @@ func (r *articleRepository) SoftDeleteRunwayImages(ctx context.Context, runwayID
|
||||
Updates(map[string]any{"is_deleted": 1, "updated_at": uint32(time.Now().Unix())}).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// 全部图片软删:封面必然悬空(封面本就指向被删图之一),直接清空避免悬空指针。
|
||||
if err := r.db.WithContext(ctx).
|
||||
Model(&model.BrandRunway{}).
|
||||
Where("id = ?", runwayID).
|
||||
Updates(map[string]any{"cover": "", "updated_at": uint32(time.Now().Unix())}).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return keys, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user