Skip to content
Snippets Groups Projects
Commit ace84c25 authored by Birk Øvstetun Narvhus's avatar Birk Øvstetun Narvhus
Browse files

added delete product from fridge endpoint, and fixed assosiation

parent 5ebd986f
No related branches found
No related tags found
No related merge requests found
Showing
with 97 additions and 231 deletions
......@@ -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");
}
}
*/
}
......@@ -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;
......
......@@ -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
......
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);
}
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> {
}
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;
}
}
......@@ -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;
}
*/
}
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
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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment