package handlers import ( "encoding/json" "net/http" "github.com/gin-gonic/gin" "gitea.d3m0k1d.ru/d3m0k1d/rostpoliplast/backend/internal/mq" "gitea.d3m0k1d.ru/d3m0k1d/rostpoliplast/backend/internal/storage" ) type BaleHandlers struct { Repo *storage.Repository MQ *mq.RabbitMQ } func (h *BaleHandlers) RegisterRoutes(g *gin.RouterGroup) { g.GET("/bales", h.GetBales) g.GET("/bales/:id", h.GetBaleByID) g.POST("/bales", h.CreateBale) g.PUT("/bales/:id", h.UpdateBale) g.DELETE("/bales/:id", h.DeleteBale) } // GetBales Получить список всех тюков // @Summary Получить все тюки // @Description Возвращает список всех тюков // @Tags bales // @Accept json // @Produce json // @Success 200 {array} storage.Bale // @Router /bales [get] func (h *BaleHandlers) GetBales(c *gin.Context) { bales, err := h.Repo.GetBales(c.Request.Context()) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, bales) } // GetBaleByID Получить тюк по ID // @Summary Получить тюк по ID // @Description Возвращает тюк по ID // @Tags bales // @Accept json // @Produce json // @Param id path string true "ID тюка" // @Success 200 {object} storage.Bale // @Router /bales/{id} [get] func (h *BaleHandlers) GetBaleByID(c *gin.Context) { id := c.Param("id") bale, err := h.Repo.GetBaleByID(c.Request.Context(), id) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "not found"}) return } c.JSON(http.StatusOK, bale) } // CreateBale Создать новый тюк // @Summary Создать тюк // @Description Создаёт новый тюк и отправляет в очередь задач RabbitMQ // @Tags bales // @Accept json // @Produce json // @Param bale body storage.Bale false "Данные тюка" // @Param type query string false "Тип тюка (для QR кодов)" // @Success 201 {object} storage.Bale // @Router /bales [post] func (h *BaleHandlers) CreateBale(c *gin.Context) { var input storage.Bale if err := c.ShouldBindJSON(&input); err != nil && err.Error() != "EOF" { typeName := c.Query("type") if typeName == "" { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } bt, err := h.Repo.GetBaleTypeByType(c.Request.Context(), typeName) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "type not found"}) return } input.TypeID = bt.ID } else if input.TypeID == 0 && c.Query("type") != "" { typeName := c.Query("type") bt, err := h.Repo.GetBaleTypeByType(c.Request.Context(), typeName) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "type not found"}) return } input.TypeID = bt.ID } bale, err := h.Repo.CreateBale(c.Request.Context(), input) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } if h.MQ != nil { data, _ := json.Marshal(bale) h.MQ.Publish(c.Request.Context(), data) } c.JSON(http.StatusCreated, bale) } // UpdateBale Обновить тюк // @Summary Обновить тюк // @Description Обновляет данные тюка по ID // @Tags bales // @Accept json // @Produce json // @Param id path string true "ID тюка" // @Param bale body storage.Bale true "Данные тюка" // @Success 200 {object} storage.Bale // @Router /bales/{id} [put] func (h *BaleHandlers) UpdateBale(c *gin.Context) { id := c.Param("id") var input storage.Bale if err := c.ShouldBindJSON(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } bale, err := h.Repo.UpdateBale(c.Request.Context(), id, input) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, bale) } // DeleteBale Удалить тюк // @Summary Удалить тюк // @Description Удаляет тюк по ID // @Tags bales // @Accept json // @Produce json // @Param id path string true "ID тюка" // @Success 200 {object} map[string]bool // @Router /bales/{id} [delete] func (h *BaleHandlers) DeleteBale(c *gin.Context) { id := c.Param("id") if err := h.Repo.DeleteBale(c.Request.Context(), id); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"deleted": true}) }