package handlers import ( "context" "errors" "net/http" "github.com/labstack/echo/v4" "gorm.io/gorm" appmiddleware "git.ma-al.com/goc_marek/ps_shop/internal/http/middleware" pscart "git.ma-al.com/goc_marek/ps_shop/internal/prestashop/cart" pscatalog "git.ma-al.com/goc_marek/ps_shop/internal/prestashop/catalog" psconfig "git.ma-al.com/goc_marek/ps_shop/internal/prestashop/config" pscustomer "git.ma-al.com/goc_marek/ps_shop/internal/prestashop/customer" psroutes "git.ma-al.com/goc_marek/ps_shop/internal/prestashop/routes" "git.ma-al.com/goc_marek/ps_shop/internal/render" "git.ma-al.com/goc_marek/ps_shop/internal/viewmodel" ) type CartPageHandler struct { catalog *pscatalog.Service customers *pscustomer.Service carts *pscart.Service renderer *render.Engine config psconfig.Config products *psroutes.ProductRoute categories *psroutes.CategoryRoute } func NewCartPageHandler(catalog *pscatalog.Service, customers *pscustomer.Service, carts *pscart.Service, renderer *render.Engine, cfg psconfig.Config, products *psroutes.ProductRoute, categories *psroutes.CategoryRoute) *CartPageHandler { return &CartPageHandler{ catalog: catalog, customers: customers, carts: carts, renderer: renderer, config: cfg, products: products, categories: categories, } } func (h *CartPageHandler) Show(c echo.Context) error { session := appmiddleware.GetSession(c) if h == nil || h.catalog == nil || h.carts == nil || h.renderer == nil { return echo.NewHTTPError(http.StatusInternalServerError, "cart page handler is not initialized") } languageID := int64Default(session.LanguageID, 1) languageID = h.catalog.ResolveLanguageID(c.Request().Context(), c.Request(), languageID) shopID := int64Default(session.ShopID, 1) currencyID := int64Default(session.CurrencyID, 1) var profile *pscustomer.Profile var err error if session.CustomerID != nil && h.customers != nil { profile, err = h.customers.GetByID(c.Request().Context(), *session.CustomerID) if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { return echo.NewHTTPError(http.StatusInternalServerError, "customer query failed: "+err.Error()) } } cartPage := pscart.Page{} cartSummary := &pscart.Summary{} if session.CartID != nil { cartPage, cartSummary, err = h.loadCart(c.Request().Context(), *session.CartID, languageID, shopID, currencyID) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "cart query failed: "+err.Error()) } assignCartProductLinks(c.Request(), h.products, &cartPage) assignCartProductImages(requestBaseURL(c.Request()), &cartPage) } page := viewmodel.CartPageData{ Cart: cartPage, Session: session, Customer: profile, CartSummary: cartSummary, ShopBaseURL: h.config.PrestaShopBaseURL, } menu, err := loadMenu(c.Request(), h.catalog, h.categories, languageID, shopID) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "menu query failed: "+err.Error()) } page.Menu = menu locale, err := loadHeaderLocale(c.Request(), h.catalog, session, languageID) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "locale query failed: "+err.Error()) } page.Locale = locale return h.renderer.Cart(c.Response(), c.Request(), page) } func (h *CartPageHandler) loadCart(ctx context.Context, cartID, languageID, shopID, currencyID int64) (pscart.Page, *pscart.Summary, error) { page, err := h.carts.PageByID(ctx, cartID, languageID, shopID, currencyID) if err != nil { return pscart.Page{}, nil, err } summary := &pscart.Summary{ ID: page.ID, TotalItems: page.TotalItems, } return *page, summary, nil } func assignCartProductLinks(req *http.Request, route *psroutes.ProductRoute, page *pscart.Page) { if page == nil || route == nil { return } langPrefix := requestLanguagePrefix(req) for i := range page.Items { product := &page.Items[i] product.URL = route.BuildPath(psroutes.ProductURLData{ ID: product.ProductID, Slug: product.Slug, CategoryPath: product.CategoryPath, EAN13: product.EAN13, LanguagePrefix: langPrefix, }) } } func assignCartProductImages(baseURL string, page *pscart.Page) { if page == nil { return } for i := range page.Items { page.Items[i].ImageURL = prestashopImageURL(baseURL, page.Items[i].CoverImageID, "home_default") } }