Files
backend_fiesta/controllers/catalogueController.go
2026-08-29 16:45:47 +05:30

194 lines
4.5 KiB
Go

package controllers
import (
"errors"
"nearle/repositories"
"nearle/services"
"net/http"
"strconv"
"github.com/gofiber/fiber/v2"
)
type CatalogueController struct {
catalogueService services.CatalogueService
}
func NewCatalogueController(catalogueService services.CatalogueService) *CatalogueController {
return &CatalogueController{catalogueService: catalogueService}
}
func (ctl *CatalogueController) GetBrands(c *fiber.Ctx) error {
brands, err := ctl.catalogueService.GetBrands()
if err != nil {
return c.JSON(fiber.Map{
"code": 500,
"message": "Failed to fetch catalogue brands",
"status": false,
})
}
return c.JSON(fiber.Map{
"code": http.StatusOK,
"message": "Success",
"status": true,
"details": brands,
})
}
func (ctl *CatalogueController) GetCategories(c *fiber.Ctx) error {
brand := c.Query("brand")
if brand == "" {
return c.JSON(fiber.Map{
"code": 400,
"message": "brand is required",
"status": false,
})
}
categories, err := ctl.catalogueService.GetCategories(brand)
if err != nil {
if errors.Is(err, repositories.ErrUnknownBrand) {
return c.JSON(fiber.Map{
"code": 400,
"message": "Unknown brand: " + brand,
"status": false,
})
}
return c.JSON(fiber.Map{
"code": 500,
"message": "Failed to fetch categories",
"status": false,
})
}
return c.JSON(fiber.Map{
"code": http.StatusOK,
"message": "Success",
"status": true,
"details": categories,
})
}
func (ctl *CatalogueController) GetProducts(c *fiber.Ctx) error {
// brand is an optional filter: omitting it browses the entire catalogue
// across every brand, which is the entry point for "show everything,
// then let the store owner choose".
brand := c.Query("brand")
category := c.Query("category")
keyword := c.Query("keyword")
pageno, _ := strconv.Atoi(c.Query("pageno"))
pagesize, _ := strconv.Atoi(c.Query("pagesize"))
products, total, err := ctl.catalogueService.GetProducts(brand, category, keyword, pageno, pagesize)
if err != nil {
if errors.Is(err, repositories.ErrUnknownBrand) {
return c.JSON(fiber.Map{
"code": 400,
"message": "Unknown brand: " + brand,
"status": false,
})
}
return c.JSON(fiber.Map{
"code": 500,
"message": "Failed to fetch catalogue products",
"status": false,
})
}
return c.JSON(fiber.Map{
"code": http.StatusOK,
"message": "Success",
"status": true,
"total": total,
"details": products,
})
}
func (ctl *CatalogueController) GetProductBySKU(c *fiber.Ctx) error {
brand := c.Query("brand")
sku := c.Query("sku")
if brand == "" || sku == "" {
return c.JSON(fiber.Map{
"code": 400,
"message": "brand and sku are required",
"status": false,
})
}
product, err := ctl.catalogueService.GetProductBySKU(brand, sku)
if err != nil {
if errors.Is(err, repositories.ErrUnknownBrand) {
return c.JSON(fiber.Map{
"code": 400,
"message": "Unknown brand: " + brand,
"status": false,
})
}
return c.JSON(fiber.Map{
"code": 500,
"message": "Failed to fetch catalogue product",
"status": false,
})
}
if product == nil {
return c.JSON(fiber.Map{
"code": 404,
"message": "Product not found",
"status": false,
})
}
return c.JSON(fiber.Map{
"code": http.StatusOK,
"message": "Success",
"status": true,
"details": product,
})
}
// GetProductByImageID resolves a catalogue row by the id the ingest pipeline
// treats as canonical, so a caller holding an ingest manifest can find the
// catalogueid it needs to import the product into a shop.
func (ctl *CatalogueController) GetProductByImageID(c *fiber.Ctx) error {
brand := c.Query("brand")
imageID := c.Query("image_id")
if brand == "" || imageID == "" {
return c.JSON(fiber.Map{
"code": 400,
"message": "brand and image_id are required",
"status": false,
})
}
product, err := ctl.catalogueService.GetProductByImageID(brand, imageID)
if err != nil {
if errors.Is(err, repositories.ErrUnknownBrand) {
return c.JSON(fiber.Map{
"code": 400,
"message": "Unknown brand: " + brand,
"status": false,
})
}
return c.JSON(fiber.Map{
"code": 500,
"message": "Failed to fetch catalogue product",
"status": false,
})
}
if product == nil {
return c.JSON(fiber.Map{
"code": 404,
"message": "Product not found",
"status": false,
})
}
return c.JSON(fiber.Map{
"code": http.StatusOK,
"message": "Success",
"status": true,
"details": product,
})
}