package api import ( "fmt" "net/http" "products/app/db" "strconv" "github.com/gin-gonic/gin" "gorm.io/gorm" ) const HOST = "0.0.0.0" const PORT = 3000 func handlePing(c *gin.Context) { c.JSON( http.StatusOK, PingDto{ Message: "Pong!", }, ) } func handleGetProducts(dbConn *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { products := db.GetProducts(dbConn) c.JSON( http.StatusOK, GetProductsResponse{ Products: *products, }, ) } } func handleGetProduct(dbConn *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { productId, err := strconv.Atoi(c.Param("productId")) if err != nil { raiseBadRequestError(c, "Invalid productId parameter") return } product, err := db.GetProduct(dbConn, productId) if err != nil { raiseNotFoundError(c, "Product not found") return } c.JSON( http.StatusOK, product, ) } } func initRouter(dbConn *gorm.DB) *gin.Engine { gin.SetMode(gin.ReleaseMode) router := gin.Default() router.GET("/ping", handlePing) router.GET("/", handleGetProducts(dbConn)) router.GET("/:productId", handleGetProduct(dbConn)) return router } func Serve(dbConn *gorm.DB) { serverAddr := fmt.Sprintf("%s:%d", HOST, PORT) router := initRouter(dbConn) router.Run(serverAddr) }