package main import ( "context" "database/sql" "log" "log/slog" "net/http" "os" "gitea.starryskymeow.cn/B309/datamarket/internal/config" "gitea.starryskymeow.cn/B309/datamarket/internal/repository" "gitea.starryskymeow.cn/B309/datamarket/internal/router" "gitea.starryskymeow.cn/B309/datamarket/internal/service" "github.com/golang-migrate/migrate/v4" "github.com/golang-migrate/migrate/v4/database" "github.com/golang-migrate/migrate/v4/database/postgres" _ "github.com/golang-migrate/migrate/v4/source/file" "github.com/jackc/pgx/v5/pgxpool" "github.com/jackc/pgx/v5/stdlib" ) func main() { // db connect ctx := context.Background() pool, err := pgxpool.New(ctx, os.Getenv("DATABASE_URL")) if err != nil { log.Fatal(err) } defer pool.Close() if err := pool.Ping(ctx); err != nil { log.Fatal(err) } db := stdlib.OpenDBFromPool(pool) defer func(db *sql.DB) { err := db.Close() if err != nil { log.Fatal(err) } }(db) driver, err := postgres.WithInstance(db, &postgres.Config{}) if err != nil { panic(err) } defer func(driver database.Driver) { err := driver.Close() if err != nil { log.Fatal(err) } }(driver) m, err := migrate.NewWithDatabaseInstance( "file://db/migration", "postgres", driver) if err != nil { log.Fatal(err) } if err := m.Up(); err != nil && err.Error() != "no change" { log.Fatal(err) } queries := repository.New(pool) cfg, err := config.New(queries) if err != nil { slog.Error("Error loading config") log.Fatal(err) } appService := service.New(queries, cfg) r := router.New(appService, cfg) addr := os.Getenv("SERVER_ADDR") if addr == "" { addr = ":8080" } err = http.ListenAndServe(addr, r) if err != nil { log.Fatal(err) } }