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 LocationHandler struct { locationService service.LocationService validate *validator.Validate } func NewLocationHandler(locationService service.LocationService) *LocationHandler { return &LocationHandler{ locationService: locationService, validate: validator.New(), } } // GetLocations получает все места хранения организации func (h *LocationHandler) GetLocations(c *gin.Context) { claims := middleware.GetClaims(c) if claims == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) return } locations, err := h.locationService.GetLocations(c.Request.Context(), claims.OrganizationID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get locations"}) return } c.JSON(http.StatusOK, locations) } // CreateLocation создает новое место хранения func (h *LocationHandler) CreateLocation(c *gin.Context) { claims := middleware.GetClaims(c) if claims == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) return } var req models.CreateLocationRequest 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 } location, err := h.locationService.CreateLocation(c.Request.Context(), claims.OrganizationID, &req) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create location"}) return } c.JSON(http.StatusCreated, location) } // GetLocation получает место хранения по ID func (h *LocationHandler) GetLocation(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 location ID"}) return } location, err := h.locationService.GetLocation(c.Request.Context(), id, claims.OrganizationID) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Location not found"}) return } c.JSON(http.StatusOK, location) } // UpdateLocation обновляет место хранения func (h *LocationHandler) UpdateLocation(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 location ID"}) return } var req models.CreateLocationRequest 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 } location, err := h.locationService.UpdateLocation(c.Request.Context(), id, claims.OrganizationID, &req) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Location not found"}) return } c.JSON(http.StatusOK, location) } // DeleteLocation удаляет место хранения func (h *LocationHandler) DeleteLocation(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 location ID"}) return } if err := h.locationService.DeleteLocation(c.Request.Context(), id, claims.OrganizationID); err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Location not found"}) return } c.JSON(http.StatusNoContent, nil) } // GetChildren получает дочерние места хранения func (h *LocationHandler) GetChildren(c *gin.Context) { claims := middleware.GetClaims(c) if claims == nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) return } parentIDStr := c.Param("id") parentID, err := uuid.Parse(parentIDStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid parent location ID"}) return } children, err := h.locationService.GetChildren(c.Request.Context(), parentID, claims.OrganizationID) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "Parent location not found"}) return } c.JSON(http.StatusOK, children) }