fix: site and stream unique ke y create issue #1017

This commit is contained in:
Jacky 2025-05-07 07:36:18 +00:00
parent 7c791f3784
commit fbc800ff22
No known key found for this signature in database
GPG key ID: 215C21B10DF38B4D

View file

@ -7,7 +7,7 @@ import (
) )
var FixSiteAndStreamPathUnique = &gormigrate.Migration{ var FixSiteAndStreamPathUnique = &gormigrate.Migration{
ID: "20250405000003", ID: "202505070000001",
Migrate: func(tx *gorm.DB) error { Migrate: func(tx *gorm.DB) error {
// Check if sites table exists // Check if sites table exists
if tx.Migrator().HasTable(&model.Site{}) { if tx.Migrator().HasTable(&model.Site{}) {
@ -19,36 +19,38 @@ var FixSiteAndStreamPathUnique = &gormigrate.Migration{
if err := tx.Model(&model.Site{}). if err := tx.Model(&model.Site{}).
Select("path, count(*) as count"). Select("path, count(*) as count").
Group("path"). Group("path").
Having("count(*) > 1"). Having("count(*) > 1").
Find(&siteDuplicates).Error; err != nil { Unscoped().
return err Find(&siteDuplicates).Error; err != nil {
}
// For each duplicated path, delete all but the one with max id
for _, dup := range siteDuplicates {
if err := tx.Exec(`DELETE FROM sites WHERE path = ? AND id NOT IN
(SELECT max(id) FROM sites WHERE path = ?)`, dup.Path, dup.Path).Error; err != nil {
return err return err
} }
// For each duplicated path, delete all but the one with max id
for _, dup := range siteDuplicates {
if err := tx.Exec(`DELETE FROM sites WHERE path = ? AND id NOT IN
(SELECT max(id) FROM sites WHERE path = ?)`, dup.Path, dup.Path).Error; err != nil {
return err
}
}
} }
}
// Check if streams table exists // Check if streams table exists
if tx.Migrator().HasTable(&model.Stream{}) { if tx.Migrator().HasTable(&model.Stream{}) {
// Find duplicated paths in streams table // Find duplicated paths in streams table
var streamDuplicates []struct { var streamDuplicates []struct {
Path string Path string
Count int Count int
} }
if err := tx.Model(&model.Stream{}). if err := tx.Model(&model.Stream{}).
Select("path, count(*) as count"). Select("path, count(*) as count").
Group("path"). Group("path").
Having("count(*) > 1"). Having("count(*) > 1").
Find(&streamDuplicates).Error; err != nil { Unscoped().
return err Find(&streamDuplicates).Error; err != nil {
} return err
}
// For each duplicated path, delete all but the one with max id // For each duplicated path, delete all but the one with max id
for _, dup := range streamDuplicates { for _, dup := range streamDuplicates {