Go-TestAPI/controllers/productController.go

116 lines
3.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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