fix: wire handler layer in main.go and fix migration issues

cmd/server/main.go: replace stub router with full wiring —
  UserRepo, SessionRepo, AuthService, AuthMiddleware, AuthHandler,
  NewRouter; use postgres.NewPool instead of pgxpool.New directly.

migrations/001_init_schemas.sql: wrap uuid_v7 and uuid_extract_timestamp
  function bodies with goose StatementBegin/End so semicolons inside
  dollar-quoted strings are not treated as statement separators.

migrations/007_seed_data.sql: add seed admin user (admin/admin,
  bcrypt cost 10, is_admin=true, can_create=true) for manual testing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-04 00:54:54 +03:00
parent caeff6786e
commit 6c9b1bf1cd
3 changed files with 29 additions and 17 deletions
+21 -17
View File
@@ -3,15 +3,15 @@ package main
import (
"context"
"log/slog"
"net/http"
"os"
"github.com/gin-gonic/gin"
"github.com/jackc/pgx/v5/pgxpool"
"github.com/jackc/pgx/v5/stdlib"
"github.com/pressly/goose/v3"
"tanabata/backend/internal/config"
"tanabata/backend/internal/db/postgres"
"tanabata/backend/internal/handler"
"tanabata/backend/internal/service"
"tanabata/backend/migrations"
)
@@ -22,22 +22,14 @@ func main() {
os.Exit(1)
}
pool, err := pgxpool.New(context.Background(), cfg.DatabaseURL)
pool, err := postgres.NewPool(context.Background(), cfg.DatabaseURL)
if err != nil {
slog.Error("failed to connect to database", "err", err)
os.Exit(1)
}
defer pool.Close()
if err := pool.Ping(context.Background()); err != nil {
slog.Error("database ping failed", "err", err)
os.Exit(1)
}
slog.Info("database connected")
// Run migrations using the embedded FS.
// stdlib.OpenDBFromPool wraps the pool in a *sql.DB without closing
// the pool when the sql.DB is closed.
migDB := stdlib.OpenDBFromPool(pool)
goose.SetBaseFS(migrations.FS)
if err := goose.SetDialect("postgres"); err != nil {
@@ -51,12 +43,24 @@ func main() {
migDB.Close()
slog.Info("migrations applied")
r := gin.New()
r.Use(gin.Recovery())
// Repositories
userRepo := postgres.NewUserRepo(pool)
sessionRepo := postgres.NewSessionRepo(pool)
r.GET("/health", func(c *gin.Context) {
c.Status(http.StatusOK)
})
// Services
authSvc := service.NewAuthService(
userRepo,
sessionRepo,
cfg.JWTSecret,
cfg.JWTAccessTTL,
cfg.JWTRefreshTTL,
)
// Handlers
authMiddleware := handler.NewAuthMiddleware(authSvc)
authHandler := handler.NewAuthHandler(authSvc)
r := handler.NewRouter(authMiddleware, authHandler)
slog.Info("starting server", "addr", cfg.ListenAddr)
if err := r.Run(cfg.ListenAddr); err != nil {