catalog-service/src/internal/server/catalog_handler.go
2024-07-18 18:29:40 +02:00

85 lines
2.2 KiB
Go

package server
import (
"fmt"
"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
def "git.pbiernat.io/egommerce/api-entities/http"
"git.pbiernat.io/egommerce/catalog-service/internal/service"
"git.pbiernat.io/egommerce/catalog-service/internal/ui"
)
func (s *Server) GetProductListHandler(c *fiber.Ctx) error {
reqID, _ := s.Base.GetRequestID(c)
req := new(def.GetProductListRequest)
catalogSrv := service.NewCatalogService(s.Database, s.Eventbus, s.Logger)
res, err := ui.GetProductList(catalogSrv, req.CategoryID, reqID)
if err != nil {
return err
}
return c.JSON(res)
}
func (s *Server) AddProductToBasketHandler(c *fiber.Ctx) error {
reqID, _ := s.Base.GetRequestID(c)
req := new(def.AddProductToBasketRequest)
if err := c.BodyParser(req); err != nil {
return s.Base.Error(c, 400, err.Error())
}
basketID := prepareBasket(c)
qty := 1
if req.Quantity != 0 {
qty = req.Quantity
}
catalogSrv := service.NewCatalogService(s.Database, s.Eventbus, s.Logger)
res, err := ui.AddProductToBasket(catalogSrv, req.ProductID, qty, basketID, reqID)
if err != nil {
s.Logger.Log("AddProductToBasketHandler error: ", err)
if res.ProductID == 0 {
return s.Base.Error(c, 404, fmt.Sprintf("Product #%d not exists", req.ProductID))
}
return s.Base.Error(c, 400, "Failed to add product to basket")
}
return c.JSON(res)
}
func (s *Server) RemoveProductFromBasketHandler(c *fiber.Ctx) error {
reqID, _ := s.Base.GetRequestID(c)
req := new(def.RemoveProductFromBasketRequest)
if err := c.BodyParser(req); err != nil {
return s.Base.Error(c, 400, err.Error())
}
basketID := prepareBasket(c)
qty := 1
if req.Quantity != 0 {
qty = req.Quantity
}
catalogSrv := service.NewCatalogService(s.Database, s.Eventbus, s.Logger)
res, err := ui.RemoveProductFromBasket(catalogSrv, req.ProductID, qty, basketID, reqID)
if err != nil {
s.Logger.Log("RemoveProductFromBasketHandler error: ", err)
return s.Base.Error(c, 400, "Failed to remove product from basket")
}
return c.JSON(res)
}
func prepareBasket(c *fiber.Ctx) string {
basketID := c.Cookies(service.BasketIdCookieName)
if len(basketID) == 0 {
basketID = uuid.New().String()
c.Cookie(&fiber.Cookie{Name: service.BasketIdCookieName, Value: basketID})
}
return basketID
}