package routes import ( "database/sql" "log" "net/http" "time" "github.com/gin-gonic/gin" "github.com/yourusername/go-sqlc-jwt/config" "github.com/yourusername/go-sqlc-jwt/controllers/user" "github.com/yourusername/go-sqlc-jwt/db" "github.com/yourusername/go-sqlc-jwt/internal/middleware" ) func MainRouter() *gin.Engine { cfg := config.GetCfg() dbConn, err := sql.Open("postgres", cfg.DB.DSN) if err != nil { log.Fatal("failed to connect to db:", err) } defer dbConn.Close() // Configure database connection pool dbConn.SetMaxOpenConns(25) dbConn.SetMaxIdleConns(25) dbConn.SetConnMaxLifetime(5 * time.Minute) queries := db.New(dbConn) r := gin.Default() authHandler := user.NewAuthHandler(queries, cfg.JWT.Secret) authGroup := r.Group("/auth") { authGroup.POST("/register", authHandler.Register) authGroup.POST("/login", authHandler.Login) } // Protected routes protected := r.Group("/api") protected.Use(middleware.AuthMiddleware(cfg.JWT.Secret)) { protected.GET("/profile", func(c *gin.Context) { userID := c.MustGet("userID").(float64) username := c.MustGet("username").(string) c.JSON(http.StatusOK, gin.H{ "id": userID, "username": username, }) }) } user.UserRouter(r) return r }