package controllers import ( "golang-test/database" "golang-test/libs" "golang-test/types" "golang-test/validators" "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" ) // CreateProduct создает новый продукт в базе данных. func CreateProduct(c *gin.Context, product database.Product) { db := database.Connector() validate := validators.Validate // Проверка данных продукта. if err := validate.Struct(&product); err != nil { c.JSON(http.StatusBadRequest, libs.GetValidationErrors(err.(validator.ValidationErrors))) return } // Проверка существования производителя. var manufacturer *database.Manufacturer if err := db.First(&manufacturer, product.ManufacturerID).Error; err != nil { c.JSON(http.StatusBadRequest, types.NotFoundError("Product", product.ManufacturerID)) return } // Добавление продукта в базу данных. if err := db.Create(&product).Error; err != nil { c.JSON(http.StatusBadRequest, types.ErrorResponse{Message: err.Error()}) return } // Отправка ответа о успешном создании продукта. c.JSON(http.StatusCreated, types.MessageResponse{Message: "Product created"}) } // DeleteProduct удаляет продукт по ID. func DeleteProduct(c *gin.Context) { db := database.Connector() id := c.Param("id") var product database.Product // Проверка существования продукта перед удалением. if db.First(&product, id).Error != nil { c.JSON(http.StatusNotFound, types.NotFoundError("Product", id)) return } // Удаление продукта из базы данных. if err := db.Delete(&product, id).Error; err != nil { c.JSON(http.StatusInternalServerError, types.ErrorResponse{Message: err.Error()}) return } // Отправка ответа о успешном удалении. c.JSON(http.StatusOK, types.MessageResponse{Message: "Product deleted"}) } // GetProducts возвращает список всех продуктов. func GetProducts(c *gin.Context) { db := database.Connector() var products []database.Product var productResp []types.ProductResponse // Получение продуктов из базы данных. if err := db.Preload("Manufacturer").Find(&products).Scan(&productResp).Error; err != nil { c.JSON(http.StatusInternalServerError, types.ErrorResponse{Message: err.Error()}) return } // Добавление информации о производителе к каждому продукту. for i, element := range productResp { var manufacturer types.ManufacturerResponse db.First(&database.Manufacturer{}, element.ManufacturerID).Scan(&manufacturer) productResp[i].Manufacturer = manufacturer } // Отправка списка продуктов. c.JSON(http.StatusOK, productResp) } // GetProductInfo возвращает информацию о продукте по ID. func GetProductInfo(c *gin.Context) { db := database.Connector() var product database.Product var productResp types.ProductResponse id, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, types.ErrorResponse{Message: err.Error()}) return } // Получение продукта из базы данных. if err := db.Preload("Manufacturer").First(&product, id).Scan(&productResp).Error; err != nil { c.JSON(http.StatusBadRequest, types.NotFoundError("Product", id)) return } // Добавление информации о производителе в ответ. productResp.Manufacturer = types.ManufacturerResponse{ Name: product.Manufacturer.Name, ID: product.Manufacturer.ID, } // Отправка информации о продукте. c.JSON(http.StatusOK, productResp) }