Files
ps_shop/internal/http/handlers/cart_page.go
T
2026-05-14 01:56:02 +02:00

132 lines
4.3 KiB
Go

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")
}
}