package controller import ( "net/http" "simplycpq/models" "simplycpq/services" "strconv" "github.com/gin-gonic/gin" ) type ProductController struct { productService *services.ProductService productGroupService *services.ProductGroupService valueService *services.ValueService } func NewProductController(productService *services.ProductService, productGroupService *services.ProductGroupService, valueService *services.ValueService) *ProductController { return &ProductController{ productService: productService, productGroupService: productGroupService, valueService: valueService, } } func (pc *ProductController) CreateProduct(c *gin.Context) { var product models.Product if err := c.ShouldBindJSON(&product); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } createdProduct, err := pc.productService.CreateProduct(&product) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": "product created successfully", "data": createdProduct}) } func (pc *ProductController) UpdateProduct(c *gin.Context) { var product models.Product if err := c.ShouldBindJSON(&product); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } if err := pc.productService.UpdateProduct(&product); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": "product updated successfully"}) } func (pc *ProductController) DeleteProduct(c *gin.Context) { id, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid product id"}) return } if err := pc.productService.DeleteProduct(id); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": "product deleted successfully"}) } func (pc *ProductController) GetProduct(c *gin.Context) { id, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid product id"}) return } product, err := pc.productService.GetProductById(id) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": "product retrieved successfully", "product": product}) } func (pc *ProductController) GetProductsByGroupId(c *gin.Context) { groupId, err := strconv.Atoi(c.Param("groupId")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid group id"}) return } products, err := pc.productService.GetProductsByGroupId(groupId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": "products retrieved successfully", "groupId": groupId, "products": products}) } func (pc *ProductController) AddPropertyToProductId(c *gin.Context) { productId, err := strconv.Atoi(c.Param("productId")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid product id"}) return } propertyId, err := strconv.Atoi(c.Param("propertyId")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid property id"}) return } if err := pc.productService.AddPropertyToProduct(productId, propertyId); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": "property added to product successfully", "productId": productId, "propertyId": propertyId}) } func (pc *ProductController) DeletePropertyFromProductId(c *gin.Context) { productId, err := strconv.Atoi(c.Param("productId")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid product id"}) return } propertyId, err := strconv.Atoi(c.Param("propertyId")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid property id"}) return } if err := pc.productService.DeletePropertyFromProduct(productId, propertyId); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": "property deleted from product successfully", "productId": productId, "propertyId": propertyId}) } func (pc *ProductController) GetPropertiesFromProductId(c *gin.Context) { productId, err := strconv.Atoi(c.Param("productId")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid product id"}) return } properties, err := pc.productService.GetPropertiesFromProduct(productId) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": "properties retrieved from product successfully", "productId": productId, "properties": properties}) }