package handlers import ( "net/http" "strconv" "git.mchus.pro/mchus/quoteforge/internal/localdb" "git.mchus.pro/mchus/quoteforge/internal/repository" "git.mchus.pro/mchus/quoteforge/internal/services" "github.com/gin-gonic/gin" ) type ComponentHandler struct { componentService *services.ComponentService localDB *localdb.LocalDB } func NewComponentHandler(componentService *services.ComponentService, localDB *localdb.LocalDB) *ComponentHandler { return &ComponentHandler{ componentService: componentService, localDB: localDB, } } func (h *ComponentHandler) List(c *gin.Context) { page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) perPage, _ := strconv.Atoi(c.DefaultQuery("per_page", "20")) filter := repository.ComponentFilter{ Category: c.Query("category"), Search: c.Query("search"), HasPrice: c.Query("has_price") == "true", ExcludeHidden: c.Query("include_hidden") != "true", // По умолчанию скрытые не показываются } result, err := h.componentService.List(filter, page, perPage) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } // If offline mode (empty result), fallback to local components isOffline := false if v, ok := c.Get("is_offline"); ok { if b, ok := v.(bool); ok { isOffline = b } } if isOffline && result.Total == 0 && h.localDB != nil { localFilter := localdb.ComponentFilter{ Category: filter.Category, Search: filter.Search, HasPrice: filter.HasPrice, } offset := (page - 1) * perPage localComps, total, err := h.localDB.ListComponents(localFilter, offset, perPage) if err == nil && len(localComps) > 0 { // Convert local components to ComponentView format components := make([]services.ComponentView, len(localComps)) for i, lc := range localComps { components[i] = services.ComponentView{ LotName: lc.LotName, Description: lc.LotDescription, Category: lc.Category, CategoryName: lc.Category, // No translation in local mode Model: lc.Model, CurrentPrice: lc.CurrentPrice, } } c.JSON(http.StatusOK, &services.ComponentListResult{ Components: components, Total: total, Page: page, PerPage: perPage, }) return } } c.JSON(http.StatusOK, result) } func (h *ComponentHandler) Get(c *gin.Context) { lotName := c.Param("lot_name") component, err := h.componentService.GetByLotName(lotName) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "component not found"}) return } c.JSON(http.StatusOK, component) } func (h *ComponentHandler) GetCategories(c *gin.Context) { categories, err := h.componentService.GetCategories() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, categories) }