Implement automatic cleanup of unused tags with hourly scheduled deletion

This commit is contained in:
2025-06-14 17:09:57 +08:00
parent e6dd2594fd
commit ff03d9a21f
2 changed files with 40 additions and 0 deletions

View File

@@ -140,3 +140,27 @@ func RemoveTagAliasOf(tagID uint) error {
},
}).Update("alias_of", nil).Error
}
// ClearUnusedTags removes tags that are not associated with any resources.
func ClearUnusedTags() error {
var tags []model.Tag
if err := db.Where("alias_of IS NULL").Find(&tags).Error; err != nil {
return err
}
for _, tag := range tags {
var count int64
if err := db.
Model(&model.Resource{}).
Where("id IN (SELECT resource_id FROM resource_tags WHERE tag_id = ?)", tag.ID).
Count(&count).Error; err != nil {
return err
}
if count == 0 {
// Use hard delete to remove the tag to ensure the tag can be re-created later
if err := db.Unscoped().Delete(&tag).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
}
}
return nil
}

View File

@@ -6,8 +6,24 @@ import (
"nysoure/server/model"
"slices"
"strings"
"time"
)
func init() {
// Start a goroutine to delete unused tags every hour
go func() {
// Wait for 1 minute to ensure the database is ready
time.Sleep(time.Minute)
for {
err := dao.ClearUnusedTags()
if err != nil {
log.Errorf("Failed to clear unused tags: %v", err)
}
time.Sleep(time.Hour)
}
}()
}
func CreateTag(uid uint, name string) (*model.TagView, error) {
canUpload, err := checkUserCanUpload(uid)
if err != nil {