From a9c8e6c1a62064b08d7c0bffd0d13911ff67a9eb Mon Sep 17 00:00:00 2001 From: ahmadafriadi Date: Fri, 27 Jun 2025 14:30:55 +0700 Subject: [PATCH] Update Filters, Limit, Search --- .../inventory/handler/collection_handler.go | 6 +++- modules/inventory/handler/colour_handler.go | 6 +++- .../handler/product_category_handler.go | 6 +++- modules/inventory/handler/product_handler.go | 10 ++++++- modules/inventory/handler/size_handler.go | 6 +++- .../inventory/repository/collection_repo.go | 15 ++++++++-- modules/inventory/repository/colour__repo.go | 15 ++++++++-- modules/inventory/repository/product__repo.go | 29 +++++++++++++++++-- .../repository/product_category_repo.go | 13 +++++++-- modules/inventory/repository/size_repo.go | 15 ++++++++-- 10 files changed, 105 insertions(+), 16 deletions(-) diff --git a/modules/inventory/handler/collection_handler.go b/modules/inventory/handler/collection_handler.go index 00da454..6cffb89 100644 --- a/modules/inventory/handler/collection_handler.go +++ b/modules/inventory/handler/collection_handler.go @@ -20,7 +20,11 @@ func NewCollectionHandler() *CollectionHandler { } func (h *CollectionHandler) GetAll(c *fiber.Ctx) error { - collections, err := h.Repo.FindAll() + limit := c.QueryInt("limit", 10) // default 10 + offset := c.QueryInt("offset", 0) // default 0 + search := c.Query("search", "") + + collections, err := h.Repo.FindAll(limit, offset, search) if err != nil { return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch collections"}) } diff --git a/modules/inventory/handler/colour_handler.go b/modules/inventory/handler/colour_handler.go index 71c1a0c..79e15be 100644 --- a/modules/inventory/handler/colour_handler.go +++ b/modules/inventory/handler/colour_handler.go @@ -20,7 +20,11 @@ func NewColourHandler() *ColourHandler { } func (h *ColourHandler) GetAll(c *fiber.Ctx) error { - colours, err := h.Repo.FindAll() + limit := c.QueryInt("limit", 10) // default 10 + offset := c.QueryInt("offset", 0) // default 0 + search := c.Query("search", "") + + colours, err := h.Repo.FindAll(limit, offset, search) if err != nil { return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch colours"}) } diff --git a/modules/inventory/handler/product_category_handler.go b/modules/inventory/handler/product_category_handler.go index 84d876b..36f7ccd 100644 --- a/modules/inventory/handler/product_category_handler.go +++ b/modules/inventory/handler/product_category_handler.go @@ -20,7 +20,11 @@ func NewCategoryHandler() *CategoryHandler { } func (h *CategoryHandler) GetAll(c *fiber.Ctx) error { - categories, err := h.Repo.FindAll() + limit := c.QueryInt("limit", 10) // default 10 + offset := c.QueryInt("offset", 0) // default 0 + search := c.Query("search", "") + + categories, err := h.Repo.FindAll(limit, offset, search) if err != nil { return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch categories"}) } diff --git a/modules/inventory/handler/product_handler.go b/modules/inventory/handler/product_handler.go index 400af3b..0d683fd 100644 --- a/modules/inventory/handler/product_handler.go +++ b/modules/inventory/handler/product_handler.go @@ -21,7 +21,15 @@ func NewProductHandler() *ProductHandler { } func (h *ProductHandler) GetAll(c *fiber.Ctx) error { - products, err := h.Repo.FindAll() + limit := c.QueryInt("limit", 10) // default 10 + offset := c.QueryInt("offset", 0) // default 0 + search := c.Query("search", "") + categoryID := c.QueryInt("category_id", 0) + collectionID := c.QueryInt("collection_id", 0) + colourID := c.QueryInt("colour_id", 0) + sizeID := c.QueryInt("size_id", 0) + + products, err := h.Repo.FindAll(limit, offset, search, uint(categoryID), uint(collectionID), uint(colourID), uint(sizeID)) if err != nil { return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch products"}) } diff --git a/modules/inventory/handler/size_handler.go b/modules/inventory/handler/size_handler.go index 175bbab..f49d12c 100644 --- a/modules/inventory/handler/size_handler.go +++ b/modules/inventory/handler/size_handler.go @@ -20,7 +20,11 @@ func NewSizeHandler() *SizeHandler { } func (h *SizeHandler) GetAll(c *fiber.Ctx) error { - sizes, err := h.Repo.FindAll() + limit := c.QueryInt("limit", 10) // default 10 + offset := c.QueryInt("offset", 0) // default 0 + search := c.Query("search", "") + + sizes, err := h.Repo.FindAll(limit, offset, search) if err != nil { return c.Status(500).JSON(fiber.Map{"error": "Failed to fetch sizes"}) } diff --git a/modules/inventory/repository/collection_repo.go b/modules/inventory/repository/collection_repo.go index 1bc94fe..503d7e9 100644 --- a/modules/inventory/repository/collection_repo.go +++ b/modules/inventory/repository/collection_repo.go @@ -14,9 +14,20 @@ func NewCollectionRepository(db *gorm.DB) *CollectionRepository { return &CollectionRepository{DB: db} } -func (r *CollectionRepository) FindAll() ([]models.Collection, error) { +func (r *CollectionRepository) FindAll(limit, offset int, search string) ([]models.Collection, error) { + var collections []models.Collection - err := r.DB.Find(&collections).Error + query := r.DB.Model(&models.Collection{}) + + if search != "" { + query = query.Where("name ILIKE ? OR code ILIKE ?", "%"+search+"%", "%"+search+"%") + } + + err := query. + Limit(limit). + Offset(offset). + Find(&collections).Error + return collections, err } diff --git a/modules/inventory/repository/colour__repo.go b/modules/inventory/repository/colour__repo.go index 93ff9ee..9f0c4ed 100644 --- a/modules/inventory/repository/colour__repo.go +++ b/modules/inventory/repository/colour__repo.go @@ -14,9 +14,20 @@ func NewColourRepository(db *gorm.DB) *ColourRepository { return &ColourRepository{DB: db} } -func (r *ColourRepository) FindAll() ([]models.Colour, error) { +func (r *ColourRepository) FindAll(limit, offset int, search string) ([]models.Colour, error) { var colours []models.Colour - err := r.DB.Find(&colours).Error + + query := r.DB.Model(&models.Colour{}) + + if search != "" { + query = query.Where("name ILIKE ? OR code ILIKE ? OR hex ILIKE ?", "%"+search+"%", "%"+search+"%", "%"+search+"%") + } + + err := query. + Limit(limit). + Offset(offset). + Find(&colours).Error + return colours, err } diff --git a/modules/inventory/repository/product__repo.go b/modules/inventory/repository/product__repo.go index 85fb3e1..e208049 100644 --- a/modules/inventory/repository/product__repo.go +++ b/modules/inventory/repository/product__repo.go @@ -16,14 +16,37 @@ func NewProductRepository(db *gorm.DB) *ProductRepository { return &ProductRepository{DB: db} } -func (r *ProductRepository) FindAll() ([]models.Product, error) { +func (r *ProductRepository) FindAll(limit, offset int, search string, categoryID, collectionID, colourID, sizeID uint) ([]models.Product, error) { var products []models.Product - err := r.DB. + + query := r.DB.Model(&models.Product{}). Preload("Category"). Preload("Collection"). Preload("Colour"). - Preload("Size"). + Preload("Size") + + if search != "" { + query = query.Where("name ILIKE ? OR sku ILIKE ?", "%"+search+"%", "%"+search+"%") + } + + if categoryID != 0 { + query = query.Where("category_id = ?", categoryID) + } + if collectionID != 0 { + query = query.Where("collection_id = ?", collectionID) + } + if colourID != 0 { + query = query.Where("colour_id = ?", colourID) + } + if sizeID != 0 { + query = query.Where("size_id = ?", sizeID) + } + + err := query. + Limit(limit). + Offset(offset). Find(&products).Error + return products, err } diff --git a/modules/inventory/repository/product_category_repo.go b/modules/inventory/repository/product_category_repo.go index 7c4c11c..db7ef97 100644 --- a/modules/inventory/repository/product_category_repo.go +++ b/modules/inventory/repository/product_category_repo.go @@ -14,9 +14,18 @@ func NewCategoryRepository(db *gorm.DB) *CategoryRepository { return &CategoryRepository{DB: db} } -func (r *CategoryRepository) FindAll() ([]models.ProductCategory, error) { +func (r *CategoryRepository) FindAll(limit, offset int, search string) ([]models.ProductCategory, error) { var categories []models.ProductCategory - err := r.DB.Find(&categories).Error + query := r.DB.Model(&models.ProductCategory{}) + + if search != "" { + query = query.Where("name ILIKE ? OR code ILIKE", "%"+search+"%", "%"+search+"%") + } + + err := query. + Limit(limit). + Offset(offset). + Find(&categories).Error return categories, err } diff --git a/modules/inventory/repository/size_repo.go b/modules/inventory/repository/size_repo.go index 9a1028c..76fb6b1 100644 --- a/modules/inventory/repository/size_repo.go +++ b/modules/inventory/repository/size_repo.go @@ -14,9 +14,20 @@ func NewSizeRepository(db *gorm.DB) *SizeRepository { return &SizeRepository{DB: db} } -func (r *SizeRepository) FindAll() ([]models.Size, error) { +func (r *SizeRepository) FindAll(limit, offset int, search string) ([]models.Size, error) { var sizes []models.Size - err := r.DB.Find(&sizes).Error + + query := r.DB.Model(&models.Size{}) + + if search != "" { + query = query.Where("name ILIKE ? OR code ILIKE ?", "%"+search+"%", "%"+search+"%") + } + + err := query. + Limit(limit). + Offset(offset). + Find(&sizes).Error + return sizes, err }