From c45a3ace866def2c3c7911d226928c7231d1f2fb Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Mon, 17 Feb 2025 12:18:08 -0400
Subject: [PATCH] feat: replace migrations with a single one

---
 store/migrations.go | 156 +++++---------------------------------------
 1 file changed, 15 insertions(+), 141 deletions(-)

diff --git a/store/migrations.go b/store/migrations.go
index 55cc8e4..4586c70 100644
--- a/store/migrations.go
+++ b/store/migrations.go
@@ -20,88 +20,26 @@ package store
 
 import (
 	"errors"
-	"time"
-
 	"github.com/go-gormigrate/gormigrate/v2"
 	"gorm.io/gorm"
+	"time"
 )
 
 var (
 	dbMigrations = []*gormigrate.Migration{
 		{
-			ID:       "201903131716",
-			Migrate:  func(tx *gorm.DB) error { return nil },
-			Rollback: func(tx *gorm.DB) error { return nil },
-		},
-		{
-			ID: "201905291602",
+			ID: "202502171717",
 			Migrate: func(tx *gorm.DB) error {
-				type Import struct {
-					State ImportState `json:"state"`
-					Error string      `json:"error,omitempty"`
-				}
-
-				type FileSource struct {
-					URI    string `json:"uri" gorm:"size:1024"`
-					Hash   string `json:"hash"`
-					Import Import `json:"import" gorm:"embedded;embeddedPrefix:import__"`
-				}
-
-				type FileMetadata struct {
-					Artist string `json:"artist,omitempty" gorm:"index"`
-					Title  string `json:"title,omitempty" gorm:"index"`
-					Album  string `json:"album,omitempty" gorm:"index"`
-				}
-
-				type File struct {
-					ID        uint64        `json:"id" gorm:"primaryKey"`
-					CreatedAt time.Time     `json:"created"`
-					UpdatedAt time.Time     `json:"updated"`
-					ShowName  string        `json:"show" gorm:"not null;index"`
-					Show      Show          `json:"-" gorm:"associationForeignKey:Name"`
-					Source    FileSource    `json:"source" gorm:"embedded;embeddedPrefix:source__"`
-					Metadata  FileMetadata  `json:"metadata" gorm:"embedded;embeddedPrefix:metadata__"`
-					Size      uint64        `json:"size"`
-					Duration  time.Duration `json:"duration"`
-				}
-
-				return tx.AutoMigrate(&File{})
-			},
-			Rollback: func(tx *gorm.DB) error {
-				return tx.Migrator().DropColumn(&File{}, "source__import__error")
-			},
-		},
-		{
-			ID: "201906010144",
-			Migrate: func(tx *gorm.DB) error {
-				type ImportLog struct {
-					ID         uint64 `gorm:"primaryKey"`
-					File       File   `gorm:"associationAutoUpdate:false;associationAutoCreate:false"`
-					FileID     uint64 `gorm:"not null;index;uniqueIndex:unique_import_log_step"`
-					ImportStep string `gorm:"not null;index;uniqueIndex:unique_import_log_step"`
-					Encoded    []byte
-				}
-
-				return tx.AutoMigrate(&ImportLog{})
-			},
-			Rollback: func(tx *gorm.DB) error {
-				return tx.Migrator().DropConstraint(&ImportLog{}, "file_id")
-			},
-		},
-		{
-			ID: "201908150104",
-			Migrate: func(tx *gorm.DB) error {
-				type Import struct {
-					State ImportState `json:"state"`
-					Error string      `json:"error,omitempty"`
+				type Show struct {
+					ID        uint64    `json:"id" gorm:"primaryKey"`
+					CreatedAt time.Time `json:"created"`
+					UpdatedAt time.Time `json:"updated"`
 				}
-
 				type FileSource struct {
 					URI    string `json:"uri" gorm:"size:1024"`
 					Hash   string `json:"hash"`
 					Import Import `json:"import" gorm:"embedded;embeddedPrefix:import__"`
 				}
-
 				type FileMetadata struct {
 					Artist       string `json:"artist,omitempty" gorm:"index"`
 					Title        string `json:"title,omitempty" gorm:"index"`
@@ -109,93 +47,29 @@ var (
 					Organization string `json:"organization,omitempty" gorm:"index"`
 					ISRC         string `json:"isrc,omitempty" gorm:"index"`
 				}
-
-				type File struct {
-					ID        uint64        `json:"id" gorm:"primaryKey"`
-					CreatedAt time.Time     `json:"created"`
-					UpdatedAt time.Time     `json:"updated"`
-					ShowName  string        `json:"show" gorm:"not null;index"`
-					Show      Show          `json:"-" gorm:"associationForeignKey:Name"`
-					Source    FileSource    `json:"source" gorm:"embedded;embeddedPrefix:source__"`
-					Metadata  FileMetadata  `json:"metadata" gorm:"embedded;embeddedPrefix:metadata__"`
-					Size      uint64        `json:"size"`
-					Duration  time.Duration `json:"duration"`
-				}
-
-				return tx.AutoMigrate(&File{})
-			},
-			Rollback: func(tx *gorm.DB) error {
-				if err := tx.Migrator().DropColumn(&File{}, "metadata__organization"); err != nil {
-					return err
-				}
-				return tx.Migrator().DropColumn(&File{}, "metadata__isrc")
-			},
-		},
-		{
-			ID: "202309141500",
-			Migrate: func(tx *gorm.DB) error {
-				type File struct {
-					ID        uint64       `json:"id" gorm:"primaryKey"`
-					CreatedAt time.Time    `json:"created"`
-					UpdatedAt time.Time    `json:"updated"`
-					ShowName  string       `json:"show" gorm:"not null;index"`
-					Show      Show         `json:"-" gorm:"associationForeignKey:Name"`
-					Source    FileSource   `json:"source" gorm:"embedded;embeddedPrefix:source__"`
-					Metadata  FileMetadata `json:"metadata" gorm:"embedded;embeddedPrefix:metadata__"`
-					Size      uint64       `json:"size"`
-					Duration  float64      `json:"duration"`
-				}
-
-				return tx.Migrator().AlterColumn(&File{}, "duration")
-			},
-			Rollback: func(tx *gorm.DB) error {
-				type File struct {
-					ID        uint64        `json:"id" gorm:"primaryKey"`
-					CreatedAt time.Time     `json:"created"`
-					UpdatedAt time.Time     `json:"updated"`
-					ShowName  string        `json:"show" gorm:"not null;index"`
-					Show      Show          `json:"-" gorm:"associationForeignKey:Name"`
-					Source    FileSource    `json:"source" gorm:"embedded;embeddedPrefix:source__"`
-					Metadata  FileMetadata  `json:"metadata" gorm:"embedded;embeddedPrefix:metadata__"`
-					Size      uint64        `json:"size"`
-					Duration  time.Duration `json:"duration"`
-				}
-
-				return tx.Migrator().AlterColumn(&File{}, "duration")
-			},
-		},
-		{
-			ID: "202312011500",
-			Migrate: func(tx *gorm.DB) error {
-				type Show struct {
-					ID        uint64    `json:"id" gorm:"primaryKey"`
-					CreatedAt time.Time `json:"created"`
-					UpdatedAt time.Time `json:"updated"`
-				}
 				type File struct {
 					ID        uint64       `json:"id" gorm:"primaryKey"`
 					CreatedAt time.Time    `json:"created"`
 					UpdatedAt time.Time    `json:"updated"`
 					ShowID    uint64       `json:"showId" gorm:"not null;index"`
-					Show      Show         `json:"-" gorm:"associationForeignKey:ID"`
+					Show      Show         `json:"-" gorm:"associationForeignKey:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
 					Source    FileSource   `json:"source" gorm:"embedded;embeddedPrefix:source__"`
 					Metadata  FileMetadata `json:"metadata" gorm:"embedded;embeddedPrefix:metadata__"`
 					Size      uint64       `json:"size"`
 					Duration  float64      `json:"duration"`
 				}
-
-				if err := tx.Migrator().DropConstraint(&File{}, "show_name"); err != nil {
-					return err
+				type ImportLog struct {
+					ID         uint64 `gorm:"primaryKey"`
+					File       File   `gorm:"associationAutoUpdate:false;associationAutoCreate:false;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
+					FileID     uint64 `gorm:"not null;index;uniqueIndex:unique_import_log_step"`
+					ImportStep string `gorm:"not null;index;uniqueIndex:unique_import_log_step"`
+					Encoded    []byte `gorm:"size:-1"`
 				}
 
-				return tx.AutoMigrate(&Show{}, &File{})
+				return tx.Migrator().CreateTable(&Show{}, &File{}, &ImportLog{})
 			},
-
 			Rollback: func(tx *gorm.DB) error {
-				if err := tx.Migrator().DropColumn(&Show{}, "id"); err != nil {
-					return err
-				}
-				return tx.Migrator().DropColumn(&File{}, "show_id")
+				return tx.Migrator().DropTable("shows", "files", "import_logs")
 			},
 		},
 	}
-- 
GitLab