From ef99a4a3c1f79e1f99b642328242218c0afdea51 Mon Sep 17 00:00:00 2001 From: aguhh18 Date: Fri, 24 Oct 2025 13:29:37 +0700 Subject: [PATCH] FIX[BE] : fix productwarehouses flags faram become multiple param --- .../product_warehouse.controller.go | 1 + .../services/product_warehouse.service.go | 8 ++++ .../product_warehouse.validation.go | 9 +++-- internal/utils/strings.go | 38 ++++++++++++++++++- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/internal/modules/inventory/product-warehouses/controllers/product_warehouse.controller.go b/internal/modules/inventory/product-warehouses/controllers/product_warehouse.controller.go index b44eab28..26f23278 100644 --- a/internal/modules/inventory/product-warehouses/controllers/product_warehouse.controller.go +++ b/internal/modules/inventory/product-warehouses/controllers/product_warehouse.controller.go @@ -28,6 +28,7 @@ func (u *ProductWarehouseController) GetAll(c *fiber.Ctx) error { Limit: c.QueryInt("limit", 10), ProductId: uint(c.QueryInt("product_id", 0)), WarehouseId: uint(c.QueryInt("warehouse_id", 0)), + Flags: c.Query("flags", ""), } if query.Page < 1 || query.Limit < 1 { diff --git a/internal/modules/inventory/product-warehouses/services/product_warehouse.service.go b/internal/modules/inventory/product-warehouses/services/product_warehouse.service.go index e9e31ab5..3a0468ca 100644 --- a/internal/modules/inventory/product-warehouses/services/product_warehouse.service.go +++ b/internal/modules/inventory/product-warehouses/services/product_warehouse.service.go @@ -71,6 +71,8 @@ func (s productWarehouseService) GetAll(c *fiber.Ctx, params *validation.Query) offset := (params.Page - 1) * params.Limit + cleanFlags := utils.ParseFlags(params.Flags) + productWarehouses, total, err := s.Repository.GetAll(c.Context(), offset, params.Limit, func(db *gorm.DB) *gorm.DB { db = s.withRelations(db) @@ -82,6 +84,12 @@ func (s productWarehouseService) GetAll(c *fiber.Ctx, params *validation.Query) db = db.Where("warehouse_id = ?", params.WarehouseId) } + if len(cleanFlags) > 0 { + db = db.Joins("JOIN products ON products.id = product_warehouses.product_id"). + Joins("JOIN flags ON flags.flagable_id = products.id AND flags.flagable_type = ?", "products"). + Where("flags.name IN ?", cleanFlags) + } + return db.Order("created_at DESC").Order("updated_at DESC") }) diff --git a/internal/modules/inventory/product-warehouses/validations/product_warehouse.validation.go b/internal/modules/inventory/product-warehouses/validations/product_warehouse.validation.go index 02648300..3a3acb28 100644 --- a/internal/modules/inventory/product-warehouses/validations/product_warehouse.validation.go +++ b/internal/modules/inventory/product-warehouses/validations/product_warehouse.validation.go @@ -13,8 +13,9 @@ type Update struct { } type Query struct { - Page int `query:"page" validate:"omitempty,number,min=1"` - Limit int `query:"limit" validate:"omitempty,number,min=1,max=100"` - ProductId uint `query:"product_id" validate:"omitempty,number,min=1"` - WarehouseId uint `query:"warehouse_id" validate:"omitempty,number,min=1"` + Page int `query:"page" validate:"omitempty,number,min=1"` + Limit int `query:"limit" validate:"omitempty,number,min=1,max=100"` + ProductId uint `query:"product_id" validate:"omitempty,number,min=1"` + WarehouseId uint `query:"warehouse_id" validate:"omitempty,number,min=1"` + Flags string `query:"flags" validate:"omitempty"` } diff --git a/internal/utils/strings.go b/internal/utils/strings.go index f6560191..a58ba1ac 100644 --- a/internal/utils/strings.go +++ b/internal/utils/strings.go @@ -1,6 +1,9 @@ package utils -import "strings" +import ( + "sort" + "strings" +) // NormalizeTrim returns the input string without leading/trailing whitespace. func NormalizeTrim(value string) string { @@ -11,3 +14,36 @@ func NormalizeTrim(value string) string { func NormalizeUpper(value string) string { return strings.ToUpper(NormalizeTrim(value)) } + +// NormalizeFlag trims whitespace, removes surrounding brackets/quotes and returns upper-case flag +func NormalizeFlag(value string) string { + v := NormalizeTrim(value) + v = strings.Trim(v, "[]\"'") + return strings.ToUpper(v) +} + +// ParseFlags parses a raw flags string like "[DOC, PAKAN]" or "DOC,PAKAN" +// and returns a deduplicated, sorted slice of normalized flags (upper-case, trimmed). +func ParseFlags(raw string) []string { + if raw == "" { + return nil + } + parts := strings.Split(raw, ",") + set := make(map[string]struct{}, len(parts)) + for _, p := range parts { + f := NormalizeFlag(p) + if f == "" { + continue + } + set[f] = struct{}{} + } + if len(set) == 0 { + return nil + } + res := make([]string, 0, len(set)) + for k := range set { + res = append(res, k) + } + sort.Strings(res) + return res +}