diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeController.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeController.java index a23569f0b273f85ec77b0752a1ebcf0e03b80373..3ec4537a4e897e0ba791c9c6a7a36d126cbb3ff7 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeController.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/FridgeController.java @@ -60,19 +60,23 @@ public class FridgeController { } - @DeleteMapping("/group/product/delete/{fridgeProductId}/{amount}") + @DeleteMapping("/group/delete/product/{fridgeProductId}/{amount}") public ResponseEntity<?> deleteAmountFridgeProduct(@PathVariable("fridgeProductId") long fridgeProductId, @PathVariable("amount") int amount){ return fridgeService.deleteAmountFromFridge(fridgeProductId,amount).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); } - /* - @DeleteMapping("/delete/{fridgeProductId}") - public ResponseEntity<String> removeProductFromFridge(@PathVariable("fridgeProductId") long FPId) { - + /** + * Deletes a product from the fridge + * @param fridgeProductId the id of the fridge product association + * @return success if the product was deleted, bad request if the product wasn't found + */ + @DeleteMapping("/delete/product/{fridgeProductId}") + public ResponseEntity<String> removeProductFromFridge(@PathVariable("fridgeProductId") long fridgeProductId) { try { - if (fridgeService.removeProductFromFridge(FPId)){ + boolean success = fridgeService.removeProductFromFridge(fridgeProductId); + if (success){ return ResponseEntity.ok("Success"); } return ResponseEntity.badRequest().body("Product not found in the fridge"); @@ -80,6 +84,25 @@ public class FridgeController { return ResponseEntity.status(500).body("Internal server error"); } } + + /** + * Deletes all products in a fridge + * @param fridgeId the id of the fridge + * @return success if the products were deleted, bad request if the fridge doesn't exist + * + @DeleteMapping("/delete/all/{fridgeId}") + public ResponseEntity<String> deleteAllProductsInFridge(@PathVariable("fridgeId") long fridgeId) { + try { + boolean success = fridgeService.deleteAllProductsInFridge(fridgeId); + if (success){ + return ResponseEntity.ok("Success"); + } + return ResponseEntity.badRequest().body("Fridge not found"); + } catch (Exception e) { + return ResponseEntity.status(500).body("Internal server error"); + } + } + */ } diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/Fridge.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/Fridge.java index e37e378e0c89d364a70a3f965e679fec23d1f077..da4f5e880f4125d8084a85a47b4660af06e7fcc1 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/Fridge.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/Fridge.java @@ -11,6 +11,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; /** * Fridge is an entity class representing a fridge in the system. @@ -36,7 +38,8 @@ public class Fridge{ @JsonIgnoreProperties("fridge") Group group; - @OneToMany + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @OnDelete(action = OnDeleteAction.CASCADE) @JoinColumn(name = "fridge_id") @JsonIgnoreProperties("fridge") List<FridgeProductAsso> products; diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/product/Product.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/product/Product.java index 1772931f36915d996b1f2c6cc163243a444366b1..33fb63daf55f26f23eb784f15c3043a8eb783d75 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/product/Product.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/product/Product.java @@ -11,6 +11,8 @@ import ntnu.idatt2016.v233.SmartMat.entity.ShoppingList; import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge; import ntnu.idatt2016.v233.SmartMat.entity.Recipe; import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; import java.util.ArrayList; import java.util.List; @@ -70,7 +72,8 @@ public class Product{ inverseJoinColumns = @JoinColumn(name = "allergy_name")) List<Allergy> allergies; - @OneToMany + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @OnDelete(action = OnDeleteAction.CASCADE) @JoinColumn(name = "ean") @JsonIgnoreProperties({"products"}) @JsonIgnore diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/FridgeProductAssoRepository.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/FridgeProductAssoRepository.java deleted file mode 100644 index b16d73a187f94437d0c0cb0f38c3e2592276fbef..0000000000000000000000000000000000000000 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/FridgeProductAssoRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package ntnu.idatt2016.v233.SmartMat.repository.group; - -import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * FridgeProductAssoRepository is a repository class for fridge product associations - * @author Birk - * @version 1.0 - * @since 25.04.2023 - */ - -@Repository -public interface FridgeProductAssoRepository extends JpaRepository<FridgeProductAsso, Long> { - Optional<FridgeProductAsso> findById(long id); - int findAmountById(long id); - -} diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/product/FridgeProductAssoRepo.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/product/FridgeProductAssoRepo.java new file mode 100644 index 0000000000000000000000000000000000000000..2b1a9a9c825f9920ae7efe361f3c7cc8adcb2fb3 --- /dev/null +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/product/FridgeProductAssoRepo.java @@ -0,0 +1,7 @@ +package ntnu.idatt2016.v233.SmartMat.repository.product; + +import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface FridgeProductAssoRepo extends JpaRepository<FridgeProductAsso, Long> { +} diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeProductAssoService.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeProductAssoService.java deleted file mode 100644 index 3360059bbc4a6f7cb009d2b932d610e1701371b1..0000000000000000000000000000000000000000 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeProductAssoService.java +++ /dev/null @@ -1,61 +0,0 @@ -package ntnu.idatt2016.v233.SmartMat.service.group; - -import lombok.AllArgsConstructor; -import ntnu.idatt2016.v233.SmartMat.dto.request.FridgeProductRequest; -import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; -import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge; -import ntnu.idatt2016.v233.SmartMat.entity.product.Product; -import ntnu.idatt2016.v233.SmartMat.repository.product.ProductRepository; -import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeProductAssoRepository; -import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeRepository; -import org.springframework.stereotype.Service; - -import java.sql.Date; -import java.util.Calendar; -import java.util.Optional; - -@Service -@AllArgsConstructor -public class FridgeProductAssoService { - - FridgeProductAssoRepository fridgeProductAssoRepository; - - FridgeRepository fridgeRepository; - - ProductRepository productRepository; - - - - /** - * Creates a fridge product association - * the FridgeProductAssosiation object needs to be added to the fridge and product - * @param fridge the fridge to add the product to - * @param product the product to add to the fridge - * @return the fridge product association - */ - public FridgeProductAsso createFridgeProductAsso(Fridge fridge, Product product, int amount, int days) { - FridgeProductAsso temp = FridgeProductAsso.builder().fridgeId(fridge).ean(product).amount(amount).daysToExpiration(days).purchaseDate(new Date(Calendar.getInstance().getTime().getTime())).build(); - fridgeProductAssoRepository.save(temp); - fridge.addProduct(temp); - product.addFridge(temp); - fridgeRepository.save(fridge); - productRepository.save(product); - - return temp; - } - - /** - * Deletes a fridge product association - * @param fridgeProductAsso the fridge product association to delete - */ - public boolean deleteFridgeProductAsso(FridgeProductAsso fridgeProductAsso) { - fridgeProductAsso.getFridgeId().getProducts().remove(fridgeProductAsso); - fridgeProductAsso.getEan().getFridges().remove(fridgeProductAsso); - fridgeProductAssoRepository.delete(fridgeProductAsso); - fridgeRepository.save(fridgeProductAsso.getFridgeId()); - productRepository.save(fridgeProductAsso.getEan()); - - return true; - } - -} diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeService.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeService.java index 9a7d2b0c5c9d57fa0e17f4fe7a0a43fed6c72c1c..3665bc7e7ea56fc47520c7e21f48b4a0ffd6e138 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeService.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeService.java @@ -5,16 +5,15 @@ import ntnu.idatt2016.v233.SmartMat.dto.request.FridgeProductRequest; import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge; import ntnu.idatt2016.v233.SmartMat.entity.group.Group; -import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeProductAssoRepository; import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeRepository; import ntnu.idatt2016.v233.SmartMat.entity.product.Product; import ntnu.idatt2016.v233.SmartMat.repository.group.GroupRepository; +import ntnu.idatt2016.v233.SmartMat.repository.product.FridgeProductAssoRepo; import ntnu.idatt2016.v233.SmartMat.service.product.ProductService; import org.springframework.stereotype.Service; -import java.nio.channels.FileChannel; -import java.sql.Date; import java.time.LocalDate; +import java.util.Date; import java.util.Optional; /** @@ -31,12 +30,10 @@ public class FridgeService { private final FridgeRepository fridgeRepository; private final ProductService productService; - private final FridgeProductAssoRepository fridgeProductAssoRepository; - - private final FridgeProductAssoService fridgeProductAssoService; - private final GroupRepository groupRepository; + private final FridgeProductAssoRepo fridgeProductAssoRepo; + /** * Gets the fridge of a group * @@ -58,42 +55,48 @@ public class FridgeService { } - + /** + * Adds a product to the fridge of a group + * @param fridgeProductRequest the fridge product request + * @return the product that was added to the fridge + */ public Optional<Object> addProductToFridge(FridgeProductRequest fridgeProductRequest) { Optional<Product> product = productService.getProductById(fridgeProductRequest.ean()); Optional<Fridge> fridge = fridgeRepository.findByGroupGroupId(fridgeProductRequest.groupId()); + if(product.isEmpty() || fridge.isEmpty()) return Optional.empty(); - return Optional.of(fridgeProductAssoService.createFridgeProductAsso(fridge.get(), product.get(), fridgeProductRequest.amount(), fridgeProductRequest.days())); + fridge.get().addProduct(FridgeProductAsso.builder() + .fridgeId(fridge.get()) + .ean(product.get()) + .amount(fridgeProductRequest.amount()) + .purchaseDate(java.sql.Date.valueOf(LocalDate.now())) + .build()); + + fridgeRepository.save(fridge.get()); + return Optional.of(product); } /** * Remove a product from the fridge of a group * - * @param groupId the id of the group - * group must exist + * @param FPId the id of the fridge product association * @return true if the product was removed */ - /*public boolean removeProductFromFridge( long FPId) { - FridgeProductAsso fridgeProductAsso = fridgeProductAssoRepository.findById(FPId).get(); - Optional<Product> product = productService.getProductById(fridgeProductAsso.getEan().getEan()); - Fridge fridge = fridgeRepository.findByGroupGroupId(fridgeProductAsso.getFridgeId().getFridgeId()).orElseThrow(() -> new IllegalArgumentException("Fridge does not exist")); - if (product.isPresent()) { - Product productToRemove = product.get(); - if (!fridge.getProducts().contains( - new FridgeProductAsso(fridge, productToRemove,))) { - return false; - } - FridgeProductAsso fridgeProductAsso1 = FridgeProductAsso.builder().id(FPId)..build() - fridgeProductAssoService.deleteFridgeProductAsso(new FridgeProductAsso(fridge, - productToRemove, purchaseDate)); - - return true; - } else { - return false; - } - }*/ + public boolean removeProductFromFridge(long FPId) { + Optional<FridgeProductAsso> fridgeProductAsso = fridgeProductAssoRepo.findById(FPId); + + if (fridgeProductAsso.isEmpty()) return false; + + Fridge fridge = fridgeRepository.findById(fridgeProductAsso.get().getFridgeId().getFridgeId()) + .get(); + + + fridgeProductAssoRepo.delete(fridgeProductAsso.get()); + + return true; + } /** * Updates a fridge @@ -121,12 +124,31 @@ public class FridgeService { } } + /** + * Delete an amount from a fridge product + * @param fridgeProductId the id of the fridge product + * @param amount the amount to delete + * @return an optional containing the fridge product if it exists + */ public Optional<Object> deleteAmountFromFridge(long fridgeProductId, int amount) { - if(amount < fridgeProductAssoRepository.findAmountById(fridgeProductId)){ + if(amount < 0 ){ System.out.println("Given amount " + amount + " < " + " Stored in db"); } else { System.out.println("Given amount " + amount + " > " + " Stored in db"); } return Optional.empty(); } + + /** + * Delete all products in a fridge + * @param fridgeId the id of the fridge + * @return true if the fridge was deleted + * + public boolean deleteAllProductsInFridge(long fridgeId) { + Optional<Fridge> fridge = fridgeRepository.findById(fridgeId); + if(fridge.isEmpty()) return false; + fridgeProductAssoService.deleteAllFridgeProducts(fridgeId); + return true; + } + */ } diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeProductAssoServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeProductAssoServiceTest.java deleted file mode 100644 index 40e558343eefb8d7b2712edbe180f0374ad6dadf..0000000000000000000000000000000000000000 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeProductAssoServiceTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package ntnu.idatt2016.v233.SmartMat.service.group; - -import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; -import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge; -import ntnu.idatt2016.v233.SmartMat.entity.product.Product; -import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeProductAssoRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; - -import java.sql.Date; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; - -@DataJpaTest -class FridgeProductAssoServiceTest { - - @Autowired - TestEntityManager entityManager; - - @Autowired - FridgeProductAssoRepository fridgeProductAssoRepository; - - private Product product; - - private Fridge fridge; - @BeforeEach - void setUp() { - entityManager.clear(); - - product = Product.builder() - .ean(1234567890123L) - .name("Test") - .description("Test") - .build(); - - fridge = Fridge.builder() - .build(); - - FridgeProductAsso fridgeProductAsso = FridgeProductAsso.builder() - .ean(product) - .fridgeId(fridge) - .purchaseDate(Date.valueOf("2023-04-24")) - .build(); - - product.addFridge(fridgeProductAsso); - fridge.addProduct(fridgeProductAsso); - - entityManager.persist(product); - entityManager.persist(fridge); - entityManager.persist(fridgeProductAsso); - - } -/* - @Test - void createFridgeProductAsso() { - Optional<FridgeProductAsso> temp = fridgeProductAssoRepository.findById( - new FridgeProductId(fridge.getFridgeId(), product.getEan(), Date.valueOf("2023-04-24"))); - assertTrue(temp.isPresent()); - - assertTrue(entityManager.find(Fridge.class, fridge.getFridgeId()).getProducts().contains(temp.get())); - assertTrue(entityManager.find(Product.class, product.getEan()).getFridges().contains(temp.get())); - - assertEquals(product.getEan(), temp.get().getEan().getEan()); - assertEquals(fridge.getFridgeId(), temp.get().getFridgeId().getFridgeId()); - } - - @Test - void deleteFridgeProductAsso() { - - Optional<FridgeProductAsso> temp = fridgeProductAssoRepository.findById( - new FridgeProductId(fridge.getFridgeId(), product.getEan(), Date.valueOf("2023-04-24"))); - assertTrue(temp.isPresent()); - - fridgeProductAssoRepository.delete(temp.get()); - - assertFalse(fridgeProductAssoRepository.findById( - new FridgeProductId(fridge.getFridgeId(), product.getEan(), Date.valueOf("2023-04-24"))).isPresent()); - - fridge.getProducts().remove(temp.get()); - product.getFridges().remove(temp.get()); - - entityManager.persist(fridge); - entityManager.persist(product); - - assertFalse(entityManager.find(Fridge.class, fridge.getFridgeId()).getProducts().contains(temp.get())); - assertFalse(entityManager.find(Product.class, product.getEan()).getFridges().contains(temp.get())); - }*/ -} \ No newline at end of file diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeServiceTest.java index 1c960383d4a4062f4d3223180d1edd9d4d040378..4505cff9f3a233079c77b41e77802bdd2a90ca9e 100644 --- a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeServiceTest.java +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeServiceTest.java @@ -1,28 +1,14 @@ package ntnu.idatt2016.v233.SmartMat.service.group; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import java.sql.Date; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Optional; - -import ntnu.idatt2016.v233.SmartMat.entity.product.Product; import ntnu.idatt2016.v233.SmartMat.repository.group.GroupRepository; -import ntnu.idatt2016.v233.SmartMat.service.group.FridgeProductAssoService; -import ntnu.idatt2016.v233.SmartMat.service.group.FridgeService; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso; -import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge; -import ntnu.idatt2016.v233.SmartMat.entity.group.Group; import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeRepository; import ntnu.idatt2016.v233.SmartMat.service.product.ProductService; @@ -35,8 +21,6 @@ public class FridgeServiceTest { @Mock private ProductService productService; - @Mock - private FridgeProductAssoService fridgeProductAssoService; @Mock private GroupRepository groupRepository;