Files
Andrey Epifantsev a846a2dce4 feat: завершён этап 3 - API структура Core Service
- Созданы репозитории для locations, items, operations
- Реализованы сервисы с бизнес-логикой
- Созданы HTTP handlers для всех API endpoints
- Добавлена функция GetClaims в middleware
- Обновлён server.go для интеграции всех компонентов
- Поддержка JSON полей в PostgreSQL
- Organization-scope фильтрация во всех операциях
- Валидация запросов через validator

Готово для этапа 4 - Шаблоны помещений
2025-08-27 15:17:12 +04:00

177 lines
4.8 KiB
Go

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