132 lines
4.3 KiB
Go
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")
|
|
}
|
|
}
|