59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
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
|
|
}
|