update
This commit is contained in:
@ -223,10 +223,11 @@ func (r *streetSnapRepository) Popular(ctx context.Context, limit int) ([]model.
|
||||
|
||||
// snapEditable 后台可编辑的街拍字段白名单(键即列名)。
|
||||
var snapEditable = map[string]bool{
|
||||
"title": true,
|
||||
"year": true,
|
||||
"city": true,
|
||||
"cover": true,
|
||||
"title": true,
|
||||
"title_cn": true,
|
||||
"year": true,
|
||||
"city": true,
|
||||
"cover": true,
|
||||
}
|
||||
|
||||
func (r *streetSnapRepository) GetForEdit(ctx context.Context, id uint32) (*model.StreetSnap, []model.StreetSnapImage, error) {
|
||||
@ -274,21 +275,49 @@ func (r *streetSnapRepository) UpdateSnap(ctx context.Context, id uint32, fields
|
||||
func (r *streetSnapRepository) DeleteSnapImage(ctx context.Context, imageID uint32) error {
|
||||
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||||
var img model.StreetSnapImage
|
||||
err := tx.Select("snap_id").Where("id = ?", imageID).First(&img).Error
|
||||
err := tx.Select("snap_id, image").Where("id = ?", imageID).First(&img).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 取出父记录的封面,判断被删图是否正是封面(防止封面悬空指向已删图 —— 设计规格 §12 唯一真数据丢失窗口)。
|
||||
var snap model.StreetSnap
|
||||
if err := tx.Select("cover").Where("id = ?", img.SnapID).First(&snap).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if err := tx.Model(&model.StreetSnapImage{}).
|
||||
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 street_snaps SET image_count =
|
||||
if err := tx.Exec(`UPDATE street_snaps SET image_count =
|
||||
(SELECT COUNT(*) FROM street_snap_images WHERE snap_id = ? AND is_deleted = 0)
|
||||
WHERE id = ?`, img.SnapID, img.SnapID).Error
|
||||
WHERE id = ?`, img.SnapID, img.SnapID).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
// 被删图是封面:重指向另一张存活图(无存活图则清空),避免封面悬空。
|
||||
if snap.Cover == img.Image {
|
||||
cover := ""
|
||||
var survivor struct {
|
||||
Image string `gorm:"column:image"`
|
||||
}
|
||||
serr := tx.Raw(
|
||||
"SELECT image FROM street_snap_images WHERE snap_id = ? AND is_deleted = 0 ORDER BY id ASC LIMIT 1",
|
||||
img.SnapID,
|
||||
).Scan(&survivor).Error
|
||||
if serr == nil {
|
||||
cover = survivor.Image
|
||||
} else if !errors.Is(serr, gorm.ErrRecordNotFound) {
|
||||
return serr
|
||||
}
|
||||
if err := tx.Model(&model.StreetSnap{}).Where("id = ?", img.SnapID).
|
||||
Updates(map[string]any{"cover": cover, "updated_at": uint32(time.Now().Unix())}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
@ -326,6 +355,13 @@ func (r *streetSnapRepository) SoftDeleteSnapImages(ctx context.Context, snapID
|
||||
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.StreetSnap{}).
|
||||
Where("id = ?", snapID).
|
||||
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