diff --git a/db/db.go b/db/db.go index 23a7504..40753ba 100644 --- a/db/db.go +++ b/db/db.go @@ -4,6 +4,7 @@ import ( "context" "log" "path/filepath" + "strconv" "strings" Config "micrach/config" @@ -14,6 +15,12 @@ import ( var Pool *pgxpool.Pool +type MigrationsMap map[int]string +type Migration struct { + ID int + Name string +} + func Init() { var err error Pool, err = pgxpool.Connect(context.TODO(), Config.Db.Url) @@ -26,14 +33,55 @@ func Init() { } func Migrate() { - migrations := Files.GetFullFilePathsInFolder("migrations") - log.Println(migrations) - for _, m := range migrations { + dbMigrations := getDbMigrations() + sqlMigrations := Files.GetFullFilePathsInFolder("migrations") + for _, m := range sqlMigrations { filename := filepath.Base(m) splitted := strings.Split(filename, "-") - id, name := splitted[0], splitted[1] - log.Println(id, name) - log.Println(Files.ReadFileText(m)) + id, err := strconv.Atoi(splitted[0]) + if err != nil { + log.Panicln(err) + } + name := strings.Split(splitted[1], ".")[0] + + if _, ok := dbMigrations[id]; !ok { + _, err = Pool.Query(context.TODO(), Files.ReadFileText(m)) + if err != nil { + log.Panicln(err) + } + + sql := `INSERT INTO migrations (id, name) VALUES ($1, $2)` + _, err = Pool.Query(context.TODO(), sql, id, name) + if err != nil { + log.Panicln(err) + } + } } + log.Println("database migrations - online") } + +func getDbMigrations() MigrationsMap { + sql := `SELECT id, name FROM migrations` + rows, err := Pool.Query(context.TODO(), sql) + if err != nil { + log.Panicln(err) + } + + if rows.Err() != nil { + log.Panicln(rows.Err()) + } + + migrationsMap := make(MigrationsMap) + for rows.Next() { + var m Migration + err = rows.Scan(&m.ID, &m.Name) + if err != nil { + log.Panicln(err) + } + + migrationsMap[m.ID] = m.Name + } + + return migrationsMap +}