package main import ( "context" "errors" "fmt" "log" "net/http" "os" "strings" "time" _ "time/tzdata" "gitea.kazu634.com/kazu634/tver/internal/store" "gitea.kazu634.com/kazu634/tver/internal/tver" "gitea.kazu634.com/kazu634/tver/internal/web" "github.com/jackc/pgx/v5/pgxpool" ) func main() { pool, err := openDatabase(context.Background(), os.Getenv("DATABASE_URL"), pgxpool.New, store.Migrate) if err != nil { log.Fatal(err) } defer pool.Close() address := os.Getenv("WEB_ADDR") if address == "" { address = ":8080" } client, err := tver.NewClient("", nil) if err != nil { log.Fatal(err) } server := &http.Server{ Addr: address, Handler: web.NewHandler(client, store.New(pool), time.Now, log.Default()), ReadHeaderTimeout: 5 * time.Second, } log.Printf("web listening on %s", address) log.Fatal(server.ListenAndServe()) } func openDatabase(ctx context.Context, databaseURL string, connect func(context.Context, string) (*pgxpool.Pool, error), migrate func(context.Context, *pgxpool.Pool) error) (*pgxpool.Pool, error) { if strings.TrimSpace(databaseURL) == "" { return nil, errors.New("DATABASE_URL が設定されていません") } pool, err := connect(ctx, databaseURL) if err != nil { return nil, errors.New("DATABASE_URL から接続プールを作成できません") } if err := migrate(ctx, pool); err != nil { pool.Close() return nil, fmt.Errorf("DB マイグレーションに失敗: %w", err) } return pool, nil }