From 7731c2f126a5191c5d72ddcd9b54f08ac198c409 Mon Sep 17 00:00:00 2001 From: Daniel Goc Date: Fri, 17 Apr 2026 11:46:34 +0200 Subject: [PATCH] feat: setup editable product struct --- app/delivery/web/api/restricted/product.go | 1 - .../web/api/restricted/productEditing.go | 85 +++++++++++++++++++ app/delivery/web/init.go | 4 + app/model/product.go | 27 ++++++ .../productEditingRepo/productEditingRepo.go | 10 +++ .../productEditingService.go | 26 ++++++ 6 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 app/delivery/web/api/restricted/productEditing.go create mode 100644 app/repos/productEditingRepo/productEditingRepo.go create mode 100644 app/service/productEditingService/productEditingService.go diff --git a/app/delivery/web/api/restricted/product.go b/app/delivery/web/api/restricted/product.go index f6b33ac..348cb77 100644 --- a/app/delivery/web/api/restricted/product.go +++ b/app/delivery/web/api/restricted/product.go @@ -22,7 +22,6 @@ type ProductsHandler struct { config *config.Config } -// NewListProductsHandler creates a new ListProductsHandler instance func NewProductsHandler() *ProductsHandler { productService := productService.New() return &ProductsHandler{ diff --git a/app/delivery/web/api/restricted/productEditing.go b/app/delivery/web/api/restricted/productEditing.go new file mode 100644 index 0000000..ba45858 --- /dev/null +++ b/app/delivery/web/api/restricted/productEditing.go @@ -0,0 +1,85 @@ +package restricted + +import ( + "strconv" + + "git.ma-al.com/goc_daniel/b2b/app/model" + "git.ma-al.com/goc_daniel/b2b/app/service/productEditingService" + "git.ma-al.com/goc_daniel/b2b/app/utils/i18n" + "git.ma-al.com/goc_daniel/b2b/app/utils/logger" + "git.ma-al.com/goc_daniel/b2b/app/utils/nullable" + "git.ma-al.com/goc_daniel/b2b/app/utils/response" + "git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors" + "github.com/gofiber/fiber/v3" +) + +type ProductEditingHandler struct { + productEditingService *productEditingService.ProductEditingService +} + +func NewProductEditingHandler() *ProductEditingHandler { + productEditingService := productEditingService.New() + return &ProductEditingHandler{ + productEditingService: productEditingService, + } +} + +func ProductEditingHandlerRoutes(r fiber.Router) fiber.Router { + handler := NewProductEditingHandler() + + r.Get("/:id", handler.GetProduct) + r.Post("/:id", handler.SaveProduct) + + return r +} + +func (h *ProductEditingHandler) GetProduct(c fiber.Ctx) error { + idStr := c.Params("id") + + p_id_product, err := strconv.Atoi(idStr) + if err != nil { + return c.Status(responseErrors.GetErrorStatus(err)). + JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) + } + + product, err := h.productEditingService.GetProduct(uint(p_id_product)) + if err != nil { + logger.Error("failed to load editable product", + "product_id", p_id_product, + "error", err.Error(), + ) + return c.Status(responseErrors.GetErrorStatus(err)). + JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) + } + + return c.JSON(response.Make(product, 1, i18n.T_(c, response.Message_OK))) +} + +func (h *ProductEditingHandler) SaveProduct(c fiber.Ctx) error { + idStr := c.Params("id") + + p_id_product, err := strconv.Atoi(idStr) + if err != nil { + return c.Status(responseErrors.GetErrorStatus(err)). + JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) + } + + var product model.ProductEditing + err = c.Bind().Body(&product) + if err != nil { + return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrJSONBody)). + JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrJSONBody))) + } + + err = h.productEditingService.SaveProduct(uint(p_id_product), &product) + if err != nil { + logger.Error("failed to save editable product", + "product_id", p_id_product, + "error", err.Error(), + ) + return c.Status(responseErrors.GetErrorStatus(err)). + JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) + } + + return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK))) +} diff --git a/app/delivery/web/init.go b/app/delivery/web/init.go index 73559aa..bba7b60 100644 --- a/app/delivery/web/init.go +++ b/app/delivery/web/init.go @@ -116,6 +116,10 @@ func (s *Server) Setup() error { product := s.restricted.Group("/product") restricted.ProductsHandlerRoutes(product) + // editing products + productEditing := s.restricted.Group("/product-editing") + restricted.ProductEditingHandlerRoutes(productEditing) + // locale selector (restricted) // this is basically for changing user's selected language and country localeSelector := s.restricted.Group("/langs-and-countries") diff --git a/app/model/product.go b/app/model/product.go index 1432f1e..45d26bd 100644 --- a/app/model/product.go +++ b/app/model/product.go @@ -1,5 +1,7 @@ package model +import "git.ma-al.com/goc_daniel/b2b/app/model/dbmodel" + type ProductInList struct { ProductID uint `gorm:"column:product_id" json:"product_id" form:"product_id"` Name string `gorm:"column:name" json:"name" form:"name"` @@ -38,3 +40,28 @@ type B2bFavorite struct { func (*B2bFavorite) TableName() string { return "b2b_favorites" } + +// contains everything that is editable in product (and possibly more) +type ProductEditing struct { + Product dbmodel.PsProduct `json:"product,omitempty"` + ProductShop dbmodel.PsProductShop `json:"product_shop,omitempty"` + ProductLang []dbmodel.PsProductLang `json:"product_lang,omitempty"` + CategoryProduct []dbmodel.PsCategoryProduct `json:"category_product"` + ProductTag []dbmodel.PsTag `json:"tag"` + Feature []ProductFeature `json:"features"` + Attachments []dbmodel.PsProductAttachment `json:"product_attachment"` + Carrier []dbmodel.PsProductCarrier `json:"product_carrier"` + Accessory []dbmodel.PsAccessory `json:"accessory"` + SpecificPrice []dbmodel.PsSpecificPrice `json:"specific_price"` + SpecificPricePriority []dbmodel.PsSpecificPricePriority `json:"specific_price_priority"` +} + +type ProductFeature struct { + FeatureValue dbmodel.PsFeatureValue `json:"featue_value"` + FeatureValueLang []dbmodel.PsFeatureValueLang `json:"featue_value_lang"` +} + +type ProductCustomizationField struct { + CustomizationField dbmodel.PsCustomizationField `json:"customization_field"` + CustomizationFieldLang dbmodel.PsCustomizationFieldLang `json:"customization_field_lang"` +} diff --git a/app/repos/productEditingRepo/productEditingRepo.go b/app/repos/productEditingRepo/productEditingRepo.go new file mode 100644 index 0000000..bee0273 --- /dev/null +++ b/app/repos/productEditingRepo/productEditingRepo.go @@ -0,0 +1,10 @@ +package productEditingRepo + +type UIProductEditingRepo interface { +} + +type ProductEditingRepo struct{} + +func New() UIProductEditingRepo { + return &ProductEditingRepo{} +} diff --git a/app/service/productEditingService/productEditingService.go b/app/service/productEditingService/productEditingService.go new file mode 100644 index 0000000..b5bc0fd --- /dev/null +++ b/app/service/productEditingService/productEditingService.go @@ -0,0 +1,26 @@ +package productEditingService + +import ( + "git.ma-al.com/goc_daniel/b2b/app/model" + "git.ma-al.com/goc_daniel/b2b/app/repos/productEditingRepo" +) + +type ProductEditingService struct { + repo productEditingRepo.UIProductEditingRepo +} + +func New() *ProductEditingService { + return &ProductEditingService{ + repo: productEditingRepo.New(), + } +} + +func (s *ProductEditingService) GetProduct(id uint) (*model.ProductEditing, error) { + var product model.ProductEditing + + return &product, nil +} + +func (s *ProductEditingService) SaveProduct(id uint, product *model.ProductEditing) error { + return nil +}