Cart.java
// FILE: src/main/java/com/ctrlbuy/webshop/model/Cart.java
package com.ctrlbuy.webshop.model;
import com.ctrlbuy.webshop.security.entity.User;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name = "carts")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Cart {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// För inloggade användare
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
// För session-baserade carts (innan inloggning)
@Column(name = "session_id")
private String sessionId;
@OneToMany(mappedBy = "cart", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@Builder.Default
private List<CartItem> items = new ArrayList<>();
@Column(name = "created_at")
private LocalDateTime createdAt;
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@PrePersist
protected void onCreate() {
createdAt = LocalDateTime.now();
updatedAt = LocalDateTime.now();
}
@PreUpdate
protected void onUpdate() {
updatedAt = LocalDateTime.now();
}
// Beräkna total summa för hela kundvagnen
public BigDecimal getTotalAmount() {
return items.stream()
.map(CartItem::getTotalPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
// Få totalt antal varor i kundvagnen
public Integer getTotalItems() {
return items.stream()
.mapToInt(CartItem::getQuantity)
.sum();
}
// Lägg till item i kundvagnen
public void addItem(CartItem item) {
item.setCart(this);
this.items.add(item);
}
// Ta bort item från kundvagnen
public void removeItem(CartItem item) {
this.items.remove(item);
item.setCart(null);
}
// Hitta item baserat på produkt
public CartItem findItemByProduct(Product product) {
return items.stream()
.filter(item -> item.getProduct().getId().equals(product.getId()))
.findFirst()
.orElse(null);
}
// Kontrollera om kundvagnen är tom
public boolean isEmpty() {
return items.isEmpty();
}
// Rensa hela kundvagnen
public void clear() {
items.clear();
}
}