diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..89ef737 Binary files /dev/null and b/.DS_Store differ diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..fb931e8 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/main/java/cat/udl/eps/softarch/demo/domain/Basket.java b/src/main/java/cat/udl/eps/softarch/demo/domain/Basket.java index fc030eb..2ddfac6 100644 --- a/src/main/java/cat/udl/eps/softarch/demo/domain/Basket.java +++ b/src/main/java/cat/udl/eps/softarch/demo/domain/Basket.java @@ -7,6 +7,8 @@ import lombok.EqualsAndHashCode; import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.List; @Entity @Data @@ -22,6 +24,9 @@ public class Basket extends UriEntity { @JsonIdentityReference(alwaysAsId = true) private Customer customer; + @OneToMany(mappedBy = "basket", cascade = CascadeType.ALL, orphanRemoval = true) + private List items = new ArrayList<>(); + @Column(nullable = false, updatable = false) private ZonedDateTime createdAt; @@ -39,4 +44,5 @@ protected void onCreate() { protected void onUpdate() { this.updatedAt = ZonedDateTime.now(); } -} \ No newline at end of file +} + diff --git a/src/main/java/cat/udl/eps/softarch/demo/domain/BasketItem.java b/src/main/java/cat/udl/eps/softarch/demo/domain/BasketItem.java new file mode 100644 index 0000000..90769bb --- /dev/null +++ b/src/main/java/cat/udl/eps/softarch/demo/domain/BasketItem.java @@ -0,0 +1,33 @@ +package cat.udl.eps.softarch.demo.domain; + +import com.fasterxml.jackson.annotation.JsonIdentityReference; +import jakarta.persistence.*; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Entity +@Data +@EqualsAndHashCode(callSuper = true) +public class BasketItem extends UriEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne + @JsonIdentityReference(alwaysAsId = true) + private Basket basket; + + @NotNull + @ManyToOne + @JsonIdentityReference(alwaysAsId = true) + private Product product; + + @NotNull + @Min(1) + private Integer quantity = 1; +} + diff --git a/src/main/java/cat/udl/eps/softarch/demo/handler/BasketItemEventHandler.java b/src/main/java/cat/udl/eps/softarch/demo/handler/BasketItemEventHandler.java new file mode 100644 index 0000000..08d7694 --- /dev/null +++ b/src/main/java/cat/udl/eps/softarch/demo/handler/BasketItemEventHandler.java @@ -0,0 +1,32 @@ +package cat.udl.eps.softarch.demo.handler; + +import cat.udl.eps.softarch.demo.domain.BasketItem; +import cat.udl.eps.softarch.demo.repository.BasketRepository; +import org.springframework.data.rest.core.annotation.*; +import org.springframework.stereotype.Component; + +@Component +@RepositoryEventHandler +public class BasketItemEventHandler { + + private final BasketRepository basketRepository; + + public BasketItemEventHandler(BasketRepository basketRepository) { + this.basketRepository = basketRepository; + } + + @HandleBeforeCreate + @HandleBeforeSave + public void handleBasketItemSave(BasketItem item) { + if (item.getBasket() != null) { + basketRepository.save(item.getBasket()); // Updates basket updatedAt + } + } + + @HandleBeforeDelete + public void handleBasketItemDelete(BasketItem item) { + if (item.getBasket() != null) { + basketRepository.save(item.getBasket()); + } + } +} diff --git a/src/main/java/cat/udl/eps/softarch/demo/repository/BasketItemRepository.java b/src/main/java/cat/udl/eps/softarch/demo/repository/BasketItemRepository.java new file mode 100644 index 0000000..056fb9e --- /dev/null +++ b/src/main/java/cat/udl/eps/softarch/demo/repository/BasketItemRepository.java @@ -0,0 +1,16 @@ +package cat.udl.eps.softarch.demo.repository; + +import cat.udl.eps.softarch.demo.domain.Basket; +import cat.udl.eps.softarch.demo.domain.BasketItem; +import cat.udl.eps.softarch.demo.domain.Product; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.PagingAndSortingRepository; + +import java.util.List; +import java.util.Optional; + +public interface BasketItemRepository extends CrudRepository, PagingAndSortingRepository { + + List findByBasket(Basket basket); + Optional findByBasketAndProduct(Basket basket, Product product); +} diff --git a/src/test/.DS_Store b/src/test/.DS_Store new file mode 100644 index 0000000..922f7e1 Binary files /dev/null and b/src/test/.DS_Store differ diff --git a/src/test/resources/.DS_Store b/src/test/resources/.DS_Store new file mode 100644 index 0000000..c70cd79 Binary files /dev/null and b/src/test/resources/.DS_Store differ