152 lines
3.8 KiB
Go
152 lines
3.8 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{
|
|
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{
|
|
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
|
|
}
|