package handlers import ( "net/http" "erp-mvp/core-service/internal/api/middleware" "erp-mvp/core-service/internal/models" "erp-mvp/core-service/internal/service" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" "github.com/google/uuid" ) type ItemHandler struct { itemService service.ItemService validate *validator.Validate } func NewItemHandler(itemService service.ItemService) *ItemHandler { return &ItemHandler{ itemService: itemService, validate: validator.New(), } } // GetItems получает все товары организации func (h *ItemHandler) GetItems(c *gin.Context) { claims := middleware.GetClaims(c) if claims == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) return } items, err := h.itemService.GetItems(c.Request.Context(), claims.OrganizationID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get items"}) return } c.JSON(http.StatusOK, items) } // CreateItem создает новый товар func (h *ItemHandler) CreateItem(c *gin.Context) { claims := middleware.GetClaims(c) if claims == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) return } var req models.CreateItemRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request body"}) return } if err := h.validate.Struct(req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Validation failed", "details": err.Error()}) return } item, err := h.itemService.CreateItem(c.Request.Context(), claims.OrganizationID, &req) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create item"}) return } c.JSON(http.StatusCreated, item) } // GetItem получает товар по ID func (h *ItemHandler) GetItem(c *gin.Context) { claims := middleware.GetClaims(c) if claims == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) return } idStr := c.Param("id") id, err := uuid.Parse(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid item ID"}) return } item, err := h.itemService.GetItem(c.Request.Context(), id, claims.OrganizationID) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Item not found"}) return } c.JSON(http.StatusOK, item) } // UpdateItem обновляет товар func (h *ItemHandler) UpdateItem(c *gin.Context) { claims := middleware.GetClaims(c) if claims == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) return } idStr := c.Param("id") id, err := uuid.Parse(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid item ID"}) return } var req models.CreateItemRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request body"}) return } if err := h.validate.Struct(req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Validation failed", "details": err.Error()}) return } item, err := h.itemService.UpdateItem(c.Request.Context(), id, claims.OrganizationID, &req) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Item not found"}) return } c.JSON(http.StatusOK, item) } // DeleteItem удаляет товар func (h *ItemHandler) DeleteItem(c *gin.Context) { claims := middleware.GetClaims(c) if claims == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) return } idStr := c.Param("id") id, err := uuid.Parse(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid item ID"}) return } if err := h.itemService.DeleteItem(c.Request.Context(), id, claims.OrganizationID); err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Item not found"}) return } c.JSON(http.StatusNoContent, nil) } // SearchItems ищет товары func (h *ItemHandler) SearchItems(c *gin.Context) { claims := middleware.GetClaims(c) if claims == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) return } query := c.Query("q") category := c.Query("category") items, err := h.itemService.SearchItems(c.Request.Context(), claims.OrganizationID, query, category) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to search items"}) return } c.JSON(http.StatusOK, items) }