package main import ( "database/sql" "embed" "errors" "fmt" "github.com/golang-migrate/migrate/v4" _ "github.com/golang-migrate/migrate/v4/database/postgres" "github.com/golang-migrate/migrate/v4/source/iofs" _ "github.com/lib/pq" "log/slog" "os" "ron" "ron-pets/internal/config" "ron-pets/internal/handlers" "ron-pets/internal/repository" ) //go:embed database/migrations var database embed.FS func migrateDB() { dbConn, err := sql.Open("postgres", os.Getenv("DATASOURCE")) if err != nil { fmt.Println(err) return } defer dbConn.Close() d, err := iofs.New(database, "database/migrations") if err != nil { fmt.Println(err) return } m, err := migrate.NewWithSourceInstance("iofs", d, os.Getenv("DATASOURCE")) if err != nil { fmt.Println(err) return } err = m.Up() if err != nil && !errors.Is(err, migrate.ErrNoChange) { slog.Error("cannot migrate", "error", err) panic(err) } if errors.Is(err, migrate.ErrNoChange) { slog.Info("migration has no changes") } slog.Info("migration done") } func main() { app := config.New() migrateDB() r := ron.New(func(e *ron.Engine) { e.Render = ron.NewHTMLRender() e.LogLevel = slog.LevelDebug }) dbPool := config.NewPostgresPool(app.DataSource) defer dbPool.Close() q := repository.NewPGXRepo(dbPool) h := handlers.New(app, q) router(h, r) err := r.Run(":8080") if err != nil { slog.Error(err.Error()) } }