some fixes for docker and migrations
This commit is contained in:
@@ -2,8 +2,16 @@ package app
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"embed"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
|
||||
mig "github.com/golang-migrate/migrate/v4"
|
||||
_ "github.com/golang-migrate/migrate/v4/database/postgres"
|
||||
"github.com/golang-migrate/migrate/v4/source/iofs"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
_ "github.com/jackc/pgx/v5/stdlib"
|
||||
)
|
||||
@@ -22,3 +30,36 @@ func NewPGXPool(datasource string) *pgxpool.Pool {
|
||||
slog.Info("connected to database", "datasource", datasource)
|
||||
return dbPool
|
||||
}
|
||||
|
||||
func Migrate(database embed.FS) {
|
||||
dbConn, err := sql.Open("pgx", os.Getenv("DATASOURCE"))
|
||||
if err != nil {
|
||||
slog.Error("error opening database connection", "error", err)
|
||||
return
|
||||
}
|
||||
defer dbConn.Close()
|
||||
|
||||
d, err := iofs.New(database, "database/migrations")
|
||||
if err != nil {
|
||||
slog.Error("error creating migration source", "error", err)
|
||||
return
|
||||
}
|
||||
|
||||
m, err := mig.NewWithSourceInstance("iofs", d, fmt.Sprintf("postgres://%s:%s@%s", os.Getenv("POSTGRES_USER"), os.Getenv("POSTGRES_PASSWORD"), os.Getenv("DSN")))
|
||||
if err != nil {
|
||||
slog.Error("error creating migration instance", "error", err)
|
||||
return
|
||||
}
|
||||
|
||||
err = m.Up()
|
||||
if err != nil && !errors.Is(err, mig.ErrNoChange) {
|
||||
slog.Error("cannot migrate", "error", err)
|
||||
panic(err)
|
||||
}
|
||||
if errors.Is(err, mig.ErrNoChange) {
|
||||
slog.Info("migration has no changes")
|
||||
return
|
||||
}
|
||||
|
||||
slog.Info("migration done")
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ func Test_CSV_ParseFile(t *testing.T) {
|
||||
assert.Equal(t, float32(11.55), record.MaxTemp)
|
||||
assert.Equal(t, float32(6.25), record.MinTemp)
|
||||
assert.Equal(t, float32(0), record.Rainfall)
|
||||
assert.Equal(t, float32(10), record.Cloudiness)
|
||||
assert.Equal(t, int(10), record.Cloudiness)
|
||||
},
|
||||
validateRejected: func(t *testing.T, rejected []meteo.RejectedMeteoData) {
|
||||
assert.Empty(t, rejected)
|
||||
@@ -61,7 +61,7 @@ func Test_CSV_ParseFile(t *testing.T) {
|
||||
},
|
||||
validateRejected: func(t *testing.T, rejected []meteo.RejectedMeteoData) {
|
||||
assert.Equal(t, 1, len(rejected))
|
||||
assert.Contains(t, rejected[0].Reason, "missing or invalid city field")
|
||||
assert.Contains(t, rejected[0].Reason, "missing or invalid location")
|
||||
assert.Equal(t, "2025/10/12;11,55;6,25;0;10", rejected[0].RowValue)
|
||||
},
|
||||
},
|
||||
@@ -87,7 +87,7 @@ func Test_CSV_ParseFile(t *testing.T) {
|
||||
},
|
||||
validateRejected: func(t *testing.T, rejected []meteo.RejectedMeteoData) {
|
||||
assert.Equal(t, 1, len(rejected))
|
||||
assert.Contains(t, rejected[0].Reason, "missing or invalid max temp field")
|
||||
assert.Contains(t, rejected[0].Reason, "missing or invalid max temp")
|
||||
assert.Equal(t, "2025/10/12;Madrid;;6,25;0;10", rejected[0].RowValue)
|
||||
},
|
||||
},
|
||||
@@ -101,7 +101,7 @@ func Test_CSV_ParseFile(t *testing.T) {
|
||||
},
|
||||
validateRejected: func(t *testing.T, rejected []meteo.RejectedMeteoData) {
|
||||
assert.Equal(t, 1, len(rejected))
|
||||
assert.Contains(t, rejected[0].Reason, "missing or invalid city field")
|
||||
assert.Contains(t, rejected[0].Reason, "missing or invalid location")
|
||||
assert.Equal(t, "2025/10/12;;11,55;6,25;0;10", rejected[0].RowValue)
|
||||
},
|
||||
},
|
||||
@@ -116,7 +116,7 @@ func Test_CSV_ParseFile(t *testing.T) {
|
||||
},
|
||||
validateRejected: func(t *testing.T, rejected []meteo.RejectedMeteoData) {
|
||||
assert.Equal(t, 1, len(rejected))
|
||||
assert.Contains(t, rejected[0].Reason, "missing or invalid date field")
|
||||
assert.Contains(t, rejected[0].Reason, "missing or invalid date")
|
||||
assert.Equal(t, ";Madrid;11,55;6,25;0;10", rejected[0].RowValue)
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user