diff --git a/pom.xml b/pom.xml index b4d3df74265279114c82de6ff3a3d64174adcd7c..8e6ffc99f922ecc924c2569e8f579bebd689006b 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,12 @@ <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> - </dependencies> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-annotations</artifactId> + <version>2.16.1</version> + </dependency> + </dependencies> <build> <plugins> diff --git a/src/main/java/com/hepia/demobdd/controller/ProductController.java b/src/main/java/com/hepia/demobdd/controller/ProductController.java new file mode 100644 index 0000000000000000000000000000000000000000..b7408face00db6923e85803ff3104142f9c21195 --- /dev/null +++ b/src/main/java/com/hepia/demobdd/controller/ProductController.java @@ -0,0 +1,30 @@ +package com.hepia.demobdd.controller; + +import com.hepia.demobdd.entity.Product; +import com.hepia.demobdd.repository.ProductRepository; +import org.springframework.beans.factory.annotation.*; +import org.springframework.web.bind.annotation.*; + + +import java.util.List; + +@RestController +@RequestMapping("/products") +public class ProductController { + + @Autowired + private ProductRepository productRepository; + + @GetMapping + public List<Product> getAllProducts() { + return productRepository.findAll(); + } + + @GetMapping("/{id}") + public Product getProductById(@PathVariable Long id) { + return productRepository.findById(id).orElse(null); + } + + + +} diff --git a/src/main/java/com/hepia/demobdd/controller/PurchaseController.java b/src/main/java/com/hepia/demobdd/controller/PurchaseController.java new file mode 100644 index 0000000000000000000000000000000000000000..ace3065984e7d65d6f74b3ccd2ca8b4e9c1a60a0 --- /dev/null +++ b/src/main/java/com/hepia/demobdd/controller/PurchaseController.java @@ -0,0 +1,66 @@ +package com.hepia.demobdd.controller; + +import com.hepia.demobdd.dto.PurchaseRequest; +import com.hepia.demobdd.entity.Product; +import com.hepia.demobdd.entity.Purchase; +import com.hepia.demobdd.entity.User; +import com.hepia.demobdd.repository.ProductRepository; +import com.hepia.demobdd.repository.PurchaseRepository; +import com.hepia.demobdd.repository.UserRepository; +import jakarta.transaction.Transactional; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +@RestController +@RequestMapping("/purchases") +public class PurchaseController { + + @Autowired + private PurchaseRepository purchaseRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private ProductRepository productRepository; + + @GetMapping + public List<Purchase> getAllPurchases() { + return purchaseRepository.findAll(); + } + + @GetMapping("/{id}") + public Purchase getPurchaseById(@PathVariable Long id) { + return purchaseRepository.findById(id).orElse(null); + } + + @Transactional + @PostMapping + public ResponseEntity<String> addPurchase(@RequestBody PurchaseRequest purchaseRequest) { + User user = userRepository.findById(purchaseRequest.getUserId()) + .orElseThrow(() -> new IllegalArgumentException("Utilisateur non trouvé")); + + Product product = productRepository.findById(purchaseRequest.getProductId()) + .orElseThrow(() -> new IllegalArgumentException("Produit non trouvé")); + + if (product.getStock() < purchaseRequest.getQuantity()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Stock insuffisant pour le produit."); + } + + if (purchaseRequest.getQuantity() <= 0) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("La quantité doit être supérieure à 0."); + } + + Purchase purchase = new Purchase(user, product, purchaseRequest.getQuantity()); + product.setStock(product.getStock() - purchaseRequest.getQuantity()); + + purchaseRepository.save(purchase); + productRepository.save(product); + + return ResponseEntity.status(HttpStatus.CREATED).body("Commande ajoutée avec succès."); + } + +} diff --git a/src/main/java/com/hepia/demobdd/dto/PurchaseRequest.java b/src/main/java/com/hepia/demobdd/dto/PurchaseRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..aaae36c098e1a593fe4209dbc421ccada742acce --- /dev/null +++ b/src/main/java/com/hepia/demobdd/dto/PurchaseRequest.java @@ -0,0 +1,39 @@ +package com.hepia.demobdd.dto; + +public class PurchaseRequest { + private Long userId; + private Long productId; + private int quantity; + + //#region getters + + public Long getUserId() { + return userId; + } + + public Long getProductId() { + return productId; + } + + public int getQuantity() { + return quantity; + } + + //#endregion + + //#region setters + + public void setUserId(Long userId) { + this.userId = userId; + } + + public void setProductId(Long productId) { + this.productId = productId; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + //#endregion +} diff --git a/src/main/java/com/hepia/demobdd/entity/Product.java b/src/main/java/com/hepia/demobdd/entity/Product.java new file mode 100644 index 0000000000000000000000000000000000000000..71598f2b5a723f8e46af90a32ba586e1aff7499d --- /dev/null +++ b/src/main/java/com/hepia/demobdd/entity/Product.java @@ -0,0 +1,58 @@ +package com.hepia.demobdd.entity; + +import jakarta.persistence.*; +import java.math.BigDecimal; + +@Entity +@Table(name = "product") +public class Product { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + @Column(precision = 10, scale = 2) + private BigDecimal price; + + private int stock; + + //#region getters + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public BigDecimal getPrice() { + return price; + } + + public int getStock() { + return stock; + } + + //#endregion + + //#region setters + + public void setId(Long id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public void setStock(int stock) { + this.stock = stock; + } + //#endregion +} diff --git a/src/main/java/com/hepia/demobdd/entity/Purchase.java b/src/main/java/com/hepia/demobdd/entity/Purchase.java new file mode 100644 index 0000000000000000000000000000000000000000..c31a673c54480bb32d72f79fc27689770aba8f2a --- /dev/null +++ b/src/main/java/com/hepia/demobdd/entity/Purchase.java @@ -0,0 +1,80 @@ +package com.hepia.demobdd.entity; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.*; +import java.math.BigDecimal; + +@Entity +@Table(name = "purchase") +public class Purchase { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JsonIgnoreProperties("purchases") + private User user; + + @ManyToOne + private Product product; + + private int quantity; + + public Purchase() { + } + + public Purchase(User user, Product product, int quantity) { + this.user = user; + this.product = product; + this.quantity = quantity; + } + + + //#region getters + + public Long getId() { + return id; + } + + public User getUser() { + return user; + } + + public Product getProduct() { + return product; + } + + public int getQuantity() { + return quantity; + } + + public BigDecimal getTotalAmount() { + return getProduct().getPrice().multiply(BigDecimal.valueOf(getQuantity())); + } + + + //#endregion + + //#region setters + + public void setId(Long id) { + this.id = id; + } + + public void setUser(User user) { + this.user = user; + } + + public void setProduct(Product product) { + this.product = product; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + + + //#endregion +} diff --git a/src/main/java/com/hepia/demobdd/entity/User.java b/src/main/java/com/hepia/demobdd/entity/User.java index 14dc2cf150fb814c31c42f7c3611b7642ff00fba..0504437ebebb9ce57699d1f961ed4a47111c73e3 100644 --- a/src/main/java/com/hepia/demobdd/entity/User.java +++ b/src/main/java/com/hepia/demobdd/entity/User.java @@ -1,11 +1,11 @@ package com.hepia.demobdd.entity; -import jakarta.persistence.Id; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.*; +import java.util.List; @Entity +@Table(name = "user") public class User { @Id @@ -14,6 +14,9 @@ public class User { private String name; private String email; + @OneToMany(mappedBy = "user") + @JsonIgnoreProperties("user") + private List<Purchase> purchases; //#region getters public Long getId() { @@ -27,6 +30,10 @@ public class User { public String getEmail() { return email; } + + public List<Purchase> getPurchases() { + return purchases; + } //#endregion //#region setters @@ -42,6 +49,10 @@ public class User { public void setEmail(String email) { this.email = email; } + + public void setPurchases(List<Purchase> purchases) { + this.purchases = purchases; + } //#endregion } \ No newline at end of file diff --git a/src/main/java/com/hepia/demobdd/repository/ProductRepository.java b/src/main/java/com/hepia/demobdd/repository/ProductRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..1d6006cede40b6fd9b40fe240e47b2e921c7d950 --- /dev/null +++ b/src/main/java/com/hepia/demobdd/repository/ProductRepository.java @@ -0,0 +1,8 @@ +package com.hepia.demobdd.repository; + +import com.hepia.demobdd.entity.Product; +import org.springframework.data.jpa.repository.JpaRepository; + + +public interface ProductRepository extends JpaRepository<Product, Long> { +} \ No newline at end of file diff --git a/src/main/java/com/hepia/demobdd/repository/PurchaseRepository.java b/src/main/java/com/hepia/demobdd/repository/PurchaseRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..efbca20afeee3c9cfd6f1c734b8eab25efef7d28 --- /dev/null +++ b/src/main/java/com/hepia/demobdd/repository/PurchaseRepository.java @@ -0,0 +1,9 @@ +package com.hepia.demobdd.repository; + +import com.hepia.demobdd.entity.Purchase; +import com.hepia.demobdd.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PurchaseRepository extends JpaRepository<Purchase, Long> { + +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c0a7fae5f69294480d5e6e9026f92b26e5706976..5f318101e9bfeed64c5742f42a02d4c985b5f45d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,4 +4,6 @@ spring.datasource.password=root spring.datasource.driver-class-name=org.mariadb.jdbc.Driver spring.flyway.enabled=true -spring.flyway.baseline-on-migrate=true \ No newline at end of file +spring.flyway.baseline-on-migrate=true +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl +spring.sql.init.mode=always \ No newline at end of file diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql new file mode 100644 index 0000000000000000000000000000000000000000..4cbe8bda2ac42f5c2199ef8a0304df7c46c8fef6 --- /dev/null +++ b/src/main/resources/data.sql @@ -0,0 +1 @@ +UPDATE product SET stock = 10; \ No newline at end of file diff --git a/src/main/resources/db/migration/V2_0__Order_table.sql b/src/main/resources/db/migration/V2_0__Order_table.sql new file mode 100644 index 0000000000000000000000000000000000000000..beb61fd2a7e24a3f687f66e6673fa7caa704850a --- /dev/null +++ b/src/main/resources/db/migration/V2_0__Order_table.sql @@ -0,0 +1,15 @@ +CREATE TABLE product ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50), + price DECIMAL(10, 2), + stock INT +); + +CREATE TABLE purchase ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + user_id BIGINT, + product_id BIGINT, + quantity INT, + FOREIGN KEY (user_id) REFERENCES user(id), + FOREIGN KEY (product_id) REFERENCES product(id) +); \ No newline at end of file diff --git a/src/main/resources/db/migration/V2_1__Initial_data.sql b/src/main/resources/db/migration/V2_1__Initial_data.sql new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391