Cart.java
package com.ctrlbuy.webshop.entity;
import com.ctrlbuy.webshop.security.entity.User;
import com.ctrlbuy.webshop.entity.Product;
import jakarta.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "carts")
public class Cart {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@OneToMany(mappedBy = "cart", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private List<CartItem> items = new ArrayList<>();
@Column(name = "total_price", precision = 10)
private BigDecimal totalPrice = BigDecimal.ZERO;
@Column(name = "created_at")
private LocalDateTime createdAt;
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@Column(name = "session_id")
private String sessionId;
@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
updatedAt = LocalDateTime.now();
}
@PreUpdate
protected void onUpdate() {
updatedAt = LocalDateTime.now();
}
// Constructors
public Cart() {}
public Cart(User user) {
this.user = user;
this.totalPrice = BigDecimal.ZERO;
this.items = new ArrayList<>();
}
public Cart(String sessionId) {
this.sessionId = sessionId;
this.totalPrice = BigDecimal.ZERO;
this.items = new ArrayList<>();
}
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<CartItem> getItems() {
return items;
}
public void setItems(List<CartItem> items) {
this.items = items;
}
public BigDecimal getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(BigDecimal totalPrice) {
this.totalPrice = totalPrice;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}
public String getSessionId() {
return sessionId;
}
public void setSessionId(String sessionId) {
this.sessionId = sessionId;
}
// Business methods
public CartItem findItemByProduct(Product product) {
return items.stream()
.filter(item -> item.getProduct().equals(product))
.findFirst()
.orElse(null);
}
public void addItem(CartItem item) {
items.add(item);
item.setCart(this);
updateTotalPrice();
}
public void removeItem(CartItem item) {
items.remove(item);
item.setCart(null);
updateTotalPrice();
}
public void clear() {
items.clear();
updateTotalPrice();
}
public void clearItems() {
clear();
}
public BigDecimal getTotalAmount() {
return getTotalPrice();
}
public void updateTotalPrice() {
this.totalPrice = items.stream()
.map(CartItem::getSubtotal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
public int getTotalItems() {
return items.stream()
.mapToInt(CartItem::getQuantity)
.sum();
}
public boolean isEmpty() {
return items.isEmpty();
}
@Override
public String toString() {
return "Cart{" +
"id=" + id +
", user=" + (user != null ? user.getEmail() : "null") +
", totalPrice=" + totalPrice +
", itemCount=" + items.size() +
", sessionId='" + sessionId + '\'' +
'}';
}
}