apskel-pos-backend/internal/services/v2/product/get_product_details.go
2025-03-08 00:35:23 +07:00

57 lines
1.6 KiB
Go

package product
import (
"enaklo-pos-be/internal/common/logger"
"enaklo-pos-be/internal/common/mycontext"
"enaklo-pos-be/internal/entity"
"github.com/pkg/errors"
"go.uber.org/zap"
)
func (s *productSvc) GetProductDetails(ctx mycontext.Context, productIDs []int64, partnerID int64) (*entity.ProductDetails, error) {
if len(productIDs) == 0 {
return &entity.ProductDetails{
Products: make(map[int64]*entity.Product),
}, nil
}
productDetails, err := s.repo.GetProductDetails(ctx, productIDs, partnerID)
if err != nil {
logger.ContextLogger(ctx).Error("failed to get product details",
zap.Int64s("productIDs", productIDs),
zap.Int64("partnerID", partnerID),
zap.Error(err))
return nil, errors.Wrap(err, "failed to get product details")
}
if len(productDetails.Products) != len(productIDs) {
missingIDs := findMissingProductIDs(productIDs, productDetails.Products)
logger.ContextLogger(ctx).Warn("some products not found",
zap.Int("requestedCount", len(productIDs)),
zap.Int("foundCount", len(productDetails.Products)),
zap.Int64s("missingIDs", missingIDs))
if len(productDetails.Products) == 0 {
return nil, errors.New("no products found")
}
}
return productDetails, nil
}
func findMissingProductIDs(requestedIDs []int64, foundProducts map[int64]*entity.Product) []int64 {
var missingIDs []int64
for _, id := range requestedIDs {
if _, exists := foundProducts[id]; !exists {
missingIDs = append(missingIDs, id)
}
}
return missingIDs
}
func (s *productSvc) IsProductAvailable(product *entity.Product) bool {
return product.Status == "ACTIVE"
}