diff --git a/pkg/migration/20250624092830.go b/pkg/migration/20250624092830.go index e17384e29..7477520e4 100644 --- a/pkg/migration/20250624092830.go +++ b/pkg/migration/20250624092830.go @@ -27,6 +27,63 @@ func init() { ID: "20250624092830", Description: "add unique index for task buckets", Migrate: func(tx *xorm.Engine) error { + + s := tx.NewSession() + defer s.Close() + + err := s.Begin() + if err != nil { + return err + } + + // First remove all duplicate entries + duplicateTaskBuckets := []taskBucket20240406125227{} + err = s. + Select("task_id, project_view_id"). + GroupBy("task_id, project_view_id"). + Having("count(*) > 1"). + Find(&duplicateTaskBuckets) + if err != nil { + _ = s.Rollback() + return err + } + + newTaskBuckets := []taskBucket20240406125227{} + for _, bucket := range duplicateTaskBuckets { + newBucket := taskBucket20240406125227{} + _, err = s.Where("task_id = ? AND project_view_id = ?", bucket.TaskID, bucket.ProjectViewID). + Get(&newBucket) + if err != nil { + _ = s.Rollback() + return err + } + + newTaskBuckets = append(newTaskBuckets, newBucket) + } + + for _, bucket := range duplicateTaskBuckets { + _, err = s.Where("task_id = ? AND project_view_id = ?", bucket.TaskID, bucket.ProjectViewID). + Delete(&taskBucket20240406125227{}) + if err != nil { + _ = s.Rollback() + return err + } + } + + for _, bucket := range newTaskBuckets { + _, err = s.Insert(&bucket) + if err != nil { + _ = s.Rollback() + return err + } + } + + err = s.Commit() + if err != nil { + return err + } + + // Then create the unique index var query string switch tx.Dialect().URI().DBType { case schemas.MYSQL: @@ -34,7 +91,7 @@ func init() { default: query = "CREATE UNIQUE INDEX IF NOT EXISTS UQE_task_buckets_task_project_view ON task_buckets (task_id, project_view_id)" } - _, err := tx.Exec(query) + _, err = tx.Exec(query) return err }, Rollback: func(tx *xorm.Engine) error {