Files
ttstd-infinite-canvas/backend/internal/repository/builtin_skills.go
2026-10-06 09:24:21 +08:00

60 lines
1.9 KiB
Go

package repository
import (
"errors"
"time"
"infinite-canvas/backend/internal/model"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
func (r *Repository) BuiltinSkillTombstoned(skillID string) (bool, error) {
var count int64
if err := r.db.Model(&model.BuiltinSkillTombstone{}).Where("skill_id = ?", skillID).Count(&count).Error; err != nil {
return false, err
}
return count > 0, nil
}
func (r *Repository) DeleteBuiltinSkill(skillID string, actorID string) error {
now := time.Now().UTC()
return r.db.Transaction(func(tx *gorm.DB) error {
var locked model.Skill
if err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).First(&locked, "id = ?", skillID).Error; err != nil {
return err
}
if err := tx.Delete(&model.SkillCurationAssignment{}, "skill_id = ?", skillID).Error; err != nil {
return err
}
if err := tx.Clauses(clause.OnConflict{Columns: []clause.Column{{Name: "skill_id"}}, DoUpdates: clause.AssignmentColumns([]string{"deleted_by", "deleted_at"})}).Create(&model.BuiltinSkillTombstone{SkillID: skillID, DeletedBy: actorID, DeletedAt: now}).Error; err != nil {
return err
}
if err := tx.Delete(&model.UserSkillState{}, "skill_id = ?", skillID).Error; err != nil {
return err
}
var versions []model.SkillVersion
if err := tx.Where("skill_id = ?", skillID).Find(&versions).Error; err != nil {
return err
}
versionIDs := make([]string, 0, len(versions))
for _, version := range versions {
versionIDs = append(versionIDs, version.ID)
}
if len(versionIDs) > 0 {
if err := tx.Delete(&model.SkillFile{}, "skill_version_id IN ?", versionIDs).Error; err != nil {
return err
}
}
if err := tx.Delete(&model.SkillVersion{}, "skill_id = ?", skillID).Error; err != nil {
return err
}
result := tx.Delete(&model.Skill{}, "id = ?", skillID)
if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) {
return result.Error
}
return nil
})
}