fix products
This commit is contained in:
@@ -16,7 +16,7 @@ type ProductProcessor interface {
|
||||
CreateProduct(ctx context.Context, req *models.CreateProductRequest) (*models.ProductResponse, error)
|
||||
UpdateProduct(ctx context.Context, id uuid.UUID, req *models.UpdateProductRequest) (*models.ProductResponse, error)
|
||||
DeleteProduct(ctx context.Context, id uuid.UUID) error
|
||||
GetProductByID(ctx context.Context, id uuid.UUID) (*models.ProductResponse, error)
|
||||
GetProductByID(ctx context.Context, id uuid.UUID, outletID uuid.UUID) (*models.ProductResponse, error)
|
||||
ListProducts(ctx context.Context, filters map[string]interface{}, page, limit int) ([]models.ProductResponse, int, error)
|
||||
ListProductsAll(ctx context.Context, filters map[string]interface{}, page, limit int) ([]models.ProductResponse, int, error)
|
||||
}
|
||||
@@ -33,6 +33,7 @@ type ProductRepository interface {
|
||||
Update(ctx context.Context, product *entities.Product) error
|
||||
Delete(ctx context.Context, id uuid.UUID) error
|
||||
List(ctx context.Context, filters map[string]interface{}, limit, offset int) ([]*entities.Product, int64, error)
|
||||
ListWithOutletPrice(ctx context.Context, filters map[string]interface{}, outletID uuid.UUID, limit, offset int) ([]*entities.Product, int64, error)
|
||||
Count(ctx context.Context, filters map[string]interface{}) (int64, error)
|
||||
GetBySKU(ctx context.Context, organizationID uuid.UUID, sku string) (*entities.Product, error)
|
||||
ExistsBySKU(ctx context.Context, organizationID uuid.UUID, sku string, excludeID *uuid.UUID) (bool, error)
|
||||
@@ -217,49 +218,65 @@ func (p *ProductProcessorImpl) DeleteProduct(ctx context.Context, id uuid.UUID)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *ProductProcessorImpl) GetProductByID(ctx context.Context, id uuid.UUID) (*models.ProductResponse, error) {
|
||||
func (p *ProductProcessorImpl) GetProductByID(ctx context.Context, id uuid.UUID, outletID uuid.UUID) (*models.ProductResponse, error) {
|
||||
productEntity, err := p.productRepo.GetWithCategory(ctx, id)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("product not found: %w", err)
|
||||
}
|
||||
|
||||
response := mappers.ProductEntityToResponse(productEntity)
|
||||
|
||||
if outletID != uuid.Nil {
|
||||
// Attach outlet-specific price
|
||||
outletPrice, err := p.outletPriceRepo.GetByProductAndOutlet(ctx, id, outletID)
|
||||
if err == nil {
|
||||
response.OutletPrice = &outletPrice.Price
|
||||
}
|
||||
} else {
|
||||
// No outlet context — return all outlet prices for this product
|
||||
outletPrices, err := p.outletPriceRepo.GetByProductWithOutlet(ctx, id)
|
||||
if err == nil && len(outletPrices) > 0 {
|
||||
prices := make([]models.OutletPrice, len(outletPrices))
|
||||
for i, op := range outletPrices {
|
||||
prices[i] = models.OutletPrice{
|
||||
OutletID: op.OutletID,
|
||||
OutletName: op.Outlet.Name,
|
||||
Price: op.Price,
|
||||
}
|
||||
}
|
||||
response.OutletPrices = prices
|
||||
}
|
||||
}
|
||||
|
||||
return response, nil
|
||||
}
|
||||
|
||||
func (p *ProductProcessorImpl) ListProducts(ctx context.Context, filters map[string]interface{}, page, limit int) ([]models.ProductResponse, int, error) {
|
||||
offset := (page - 1) * limit
|
||||
|
||||
// Extract outletID from filters — it's not a products column so remove it before querying
|
||||
var outletID uuid.UUID
|
||||
if oid, ok := filters["outlet_id"]; ok {
|
||||
outletID = oid.(uuid.UUID)
|
||||
delete(filters, "outlet_id")
|
||||
}
|
||||
|
||||
productEntities, total, err := p.productRepo.List(ctx, filters, limit, offset)
|
||||
// Use the JOIN-based query when an outlet is specified so we get outlet-specific
|
||||
// prices in a single round-trip; fall back to the plain List otherwise.
|
||||
var (
|
||||
productEntities []*entities.Product
|
||||
total int64
|
||||
err error
|
||||
)
|
||||
if outletID != uuid.Nil {
|
||||
productEntities, total, err = p.productRepo.ListWithOutletPrice(ctx, filters, outletID, limit, offset)
|
||||
} else {
|
||||
productEntities, total, err = p.productRepo.List(ctx, filters, limit, offset)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, 0, fmt.Errorf("failed to list products: %w", err)
|
||||
}
|
||||
|
||||
if outletID != uuid.Nil && len(productEntities) > 0 {
|
||||
productIDs := make([]uuid.UUID, len(productEntities))
|
||||
for i, pe := range productEntities {
|
||||
productIDs[i] = pe.ID
|
||||
}
|
||||
outletPrices, err := p.outletPriceRepo.GetByProductsAndOutlet(ctx, productIDs, outletID)
|
||||
if err == nil {
|
||||
priceMap := make(map[uuid.UUID]float64, len(outletPrices))
|
||||
for _, op := range outletPrices {
|
||||
priceMap[op.ProductID] = op.Price
|
||||
}
|
||||
for _, pe := range productEntities {
|
||||
if price, ok := priceMap[pe.ID]; ok {
|
||||
pe.Price = price
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
responses := make([]models.ProductResponse, len(productEntities))
|
||||
for i, entity := range productEntities {
|
||||
response := mappers.ProductEntityToResponse(entity)
|
||||
|
||||
Reference in New Issue
Block a user