MIF_E31222379_BE/internal/services/trashcart_service.go

155 lines
3.9 KiB
Go

package services
import (
"log"
"time"
"rijig/dto"
"rijig/internal/repositories"
"rijig/model"
"github.com/google/uuid"
)
type CartService struct {
Repo repositories.CartRepository
}
func NewCartService(repo repositories.CartRepository) *CartService {
return &CartService{Repo: repo}
}
func (s *CartService) CommitCartToDatabase(userID string) error {
items, err := GetCartItems(userID)
if err != nil || len(items) == 0 {
log.Printf("No items to commit for user: %s", userID)
return err
}
var cartItems []model.CartItem
var totalAmount float32
var estimatedTotal float32
for _, item := range items {
trash, err := s.Repo.GetTrashCategoryByID(item.TrashID)
if err != nil {
log.Printf("Trash category not found for trashID: %s", item.TrashID)
continue
}
subTotal := float32(trash.EstimatedPrice) * item.Amount
totalAmount += item.Amount
estimatedTotal += subTotal
cartItems = append(cartItems, model.CartItem{
ID: uuid.NewString(),
TrashID: item.TrashID,
Amount: item.Amount,
SubTotalEstimatedPrice: subTotal,
})
}
cart := &model.Cart{
ID: uuid.NewString(),
UserID: userID,
CartItems: cartItems,
TotalAmount: totalAmount,
EstimatedTotalPrice: estimatedTotal,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
if err := s.Repo.DeleteCartByUserID(userID); err != nil {
log.Printf("Failed to delete old cart: %v", err)
}
if err := s.Repo.CreateCart(cart); err != nil {
log.Printf("Failed to create cart: %v", err)
return err
}
if err := ClearCart(userID); err != nil {
log.Printf("Failed to clear Redis cart: %v", err)
}
log.Printf("Cart committed successfully for user: %s", userID)
return nil
}
func (s *CartService) GetCartFromRedis(userID string) (*dto.CartResponse, error) {
items, err := GetCartItems(userID)
if err != nil || len(items) == 0 {
return nil, err
}
var totalAmount float32
var estimatedTotal float32
var cartItemDTOs []dto.CartItemResponse
for _, item := range items {
trash, err := s.Repo.GetTrashCategoryByID(item.TrashID)
if err != nil {
continue
}
subtotal := float32(trash.EstimatedPrice) * item.Amount
totalAmount += item.Amount
estimatedTotal += subtotal
cartItemDTOs = append(cartItemDTOs, dto.CartItemResponse{
TrashId: trash.ID,
TrashIcon: trash.Icon,
TrashName: trash.Name,
Amount: item.Amount,
EstimatedSubTotalPrice: subtotal,
})
}
resp := &dto.CartResponse{
ID: "N/A",
UserID: userID,
TotalAmount: totalAmount,
EstimatedTotalPrice: estimatedTotal,
CreatedAt: time.Now().Format(time.RFC3339),
UpdatedAt: time.Now().Format(time.RFC3339),
CartItems: cartItemDTOs,
}
return resp, nil
}
func (s *CartService) GetCart(userID string) (*dto.CartResponse, error) {
cartRedis, err := s.GetCartFromRedis(userID)
if err == nil && len(cartRedis.CartItems) > 0 {
return cartRedis, nil
}
cartDB, err := s.Repo.GetCartByUserID(userID)
if err != nil {
return nil, err
}
var items []dto.CartItemResponse
for _, item := range cartDB.CartItems {
items = append(items, dto.CartItemResponse{
ItemId: item.ID,
TrashId: item.TrashID,
TrashIcon: item.TrashCategory.Icon,
TrashName: item.TrashCategory.Name,
Amount: item.Amount,
EstimatedSubTotalPrice: item.SubTotalEstimatedPrice,
})
}
resp := &dto.CartResponse{
ID: cartDB.ID,
UserID: cartDB.UserID,
TotalAmount: cartDB.TotalAmount,
EstimatedTotalPrice: cartDB.EstimatedTotalPrice,
CreatedAt: cartDB.CreatedAt.Format(time.RFC3339),
UpdatedAt: cartDB.UpdatedAt.Format(time.RFC3339),
CartItems: items,
}
return resp, nil
}