fix products
This commit is contained in:
@@ -189,3 +189,47 @@ func (r *ProductRepositoryImpl) GetLowCostProducts(ctx context.Context, organiza
|
||||
err := r.db.WithContext(ctx).Where("organization_id = ? AND cost <= ? AND is_active = ?", organizationID, maxCost, true).Find(&products).Error
|
||||
return products, err
|
||||
}
|
||||
|
||||
// ListWithOutletPrice fetches products with the same filters as List, but overrides
|
||||
// each product's Price with the outlet-specific price from product_outlet_prices when
|
||||
// outletID is provided. A single LEFT JOIN is used so no second round-trip is needed.
|
||||
func (r *ProductRepositoryImpl) ListWithOutletPrice(ctx context.Context, filters map[string]interface{}, outletID uuid.UUID, limit, offset int) ([]*entities.Product, int64, error) {
|
||||
var products []*entities.Product
|
||||
var total int64
|
||||
|
||||
// Base query with category and variant preloads
|
||||
query := r.db.WithContext(ctx).Model(&entities.Product{}).
|
||||
Preload("Category").
|
||||
Preload("ProductVariants")
|
||||
|
||||
// Apply filters
|
||||
for key, value := range filters {
|
||||
switch key {
|
||||
case "search":
|
||||
searchValue := "%" + value.(string) + "%"
|
||||
query = query.Where("products.name ILIKE ? OR products.description ILIKE ? OR products.sku ILIKE ?", searchValue, searchValue, searchValue)
|
||||
case "price_min":
|
||||
query = query.Where("products.price >= ?", value)
|
||||
case "price_max":
|
||||
query = query.Where("products.price <= ?", value)
|
||||
default:
|
||||
query = query.Where("products."+key+" = ?", value)
|
||||
}
|
||||
}
|
||||
|
||||
// When outletID is provided, INNER JOIN product_outlet_prices so only products
|
||||
// that have been explicitly assigned to this outlet are returned, with their
|
||||
// outlet-specific price.
|
||||
if outletID != uuid.Nil {
|
||||
query = query.
|
||||
Joins("INNER JOIN product_outlet_prices pop ON pop.product_id = products.id AND pop.outlet_id = ?", outletID).
|
||||
Select("products.*, pop.price AS price")
|
||||
}
|
||||
|
||||
if err := query.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
err := query.Limit(limit).Offset(offset).Find(&products).Error
|
||||
return products, total, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user