116 lines
3.8 KiB
Go
116 lines
3.8 KiB
Go
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)
|
||
}
|