From d5afdc6cca4ccf3297fcd95bec51e6c0172d5ac3 Mon Sep 17 00:00:00 2001
From: birkon <birkon@stud.ntnu.no>
Date: Tue, 25 Apr 2023 13:33:55 +0200
Subject: [PATCH] added services for creating assosiation

---
 .../controller/group/FridgeController.java    |  5 +-
 .../fridgeProduct/FridgeProductAsso.java      |  4 +-
 .../entity/fridgeProduct/FridgeProductId.java |  3 +
 .../v233/SmartMat/entity/group/Fridge.java    | 17 ++----
 .../group/FridgeProductAssoRepository.java    | 14 +++++
 .../group/FridgeProductAssoService.java       | 55 +++++++++++++++++++
 .../SmartMat/service/group/FridgeService.java | 31 +++++++++--
 .../service/product/ProductService.java       | 11 ++++
 8 files changed, 120 insertions(+), 20 deletions(-)
 create mode 100644 src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/FridgeProductAssoRepository.java
 create mode 100644 src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeProductAssoService.java

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 6e6ce1e9..9053405f 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
@@ -8,6 +8,8 @@ import ntnu.idatt2016.v233.SmartMat.service.group.FridgeService;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import java.sql.Date;
+
 /**
  * Controller for fridges API, providing endpoints for fridge management
  *
@@ -64,6 +66,7 @@ public class FridgeController {
 
     /**
      * Removes a product from the fridge of a group
+     * todo: remove the date parameter when the frontend is done
      *
      * @param groupId the id of the group
      *                group must exist
@@ -80,7 +83,7 @@ public class FridgeController {
         }
 
         try {
-            if (fridgeService.removeProductFromFridge(groupId, productId)) {
+            if (fridgeService.removeProductFromFridge(groupId, productId, Date.valueOf("2023-04-24"))) {
                 return ResponseEntity.ok("Success");
             }
             return ResponseEntity.badRequest().body("Product not found in the fridge");
diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/fridgeProduct/FridgeProductAsso.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/fridgeProduct/FridgeProductAsso.java
index 6cdbc636..4719dc3c 100644
--- a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/fridgeProduct/FridgeProductAsso.java
+++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/fridgeProduct/FridgeProductAsso.java
@@ -4,7 +4,7 @@ import jakarta.persistence.*;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import ntnu.idatt2016.v233.SmartMat.entity.Fridge;
+import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge;
 import ntnu.idatt2016.v233.SmartMat.entity.product.Product;
 
 import java.sql.Date;
@@ -27,6 +27,8 @@ public class FridgeProductAsso {
     @JoinColumn(name = "ean")
     private Product ean;
 
+    @Id
+    @MapsId("purchase_date")
     @Column(name = "purchase_date")
     private Date purchaseDate;
 
diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/fridgeProduct/FridgeProductId.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/fridgeProduct/FridgeProductId.java
index 7bbec60d..513bb5e9 100644
--- a/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/fridgeProduct/FridgeProductId.java
+++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/entity/fridgeProduct/FridgeProductId.java
@@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.sql.Date;
 
 /**
  * This class represents a fridge product association id
@@ -20,4 +21,6 @@ public class FridgeProductId implements Serializable {
     private long fridgeId;
 
     private long ean;
+
+    private Date purchaseDate;
 }
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 b875e8ae..056f80fb 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
@@ -10,14 +10,13 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso;
-import ntnu.idatt2016.v233.SmartMat.entity.product.Product;
 
 /**
  * Fridge is an entity class representing a fridge in the system.
  *
- * @author Anders
- * @version 1.1.002
- * @since 15.04.2023
+ * @author Anders & Birk
+ * @version 1.2
+ * @since 25.04.2023
  */
 
 @NoArgsConstructor
@@ -34,17 +33,9 @@ public class Fridge{
     @Column(name = "group_id")
     long groupId;
     
-<<<<<<< HEAD:src/main/java/ntnu/idatt2016/v233/SmartMat/entity/Fridge.java
     @OneToMany
     @JoinColumn(name = "ean")
     @JsonIgnoreProperties("fridge")
     List<FridgeProductAsso> products;
-=======
-    @ManyToMany
-    @JoinTable(name = "fridge_product",
-        joinColumns = @JoinColumn(name = "fridge_id"),
-        inverseJoinColumns = @JoinColumn(name = "ean"))
-    @JsonIgnoreProperties({"allergies", "fridges"})
-    List<Product> products;
->>>>>>> 538a2102fb1b5e656159ddd04dad3543ea253234:src/main/java/ntnu/idatt2016/v233/SmartMat/entity/group/Fridge.java
+
 }
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
new file mode 100644
index 00000000..4402cc48
--- /dev/null
+++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/FridgeProductAssoRepository.java
@@ -0,0 +1,14 @@
+package ntnu.idatt2016.v233.SmartMat.repository.group;
+
+import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso;
+import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductId;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ * FridgeProductAssoRepository is a repository class for fridge product associations
+ * @author Birk
+ * @version 1.0
+ * @since 25.04.2023
+ */
+public interface FridgeProductAssoRepository extends JpaRepository<FridgeProductAsso, FridgeProductId> {
+}
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
new file mode 100644
index 00000000..34f0e7cd
--- /dev/null
+++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/FridgeProductAssoService.java
@@ -0,0 +1,55 @@
+package ntnu.idatt2016.v233.SmartMat.service.group;
+
+import lombok.AllArgsConstructor;
+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.ProductRepository;
+import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeProductAssoRepository;
+import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeRepository;
+import ntnu.idatt2016.v233.SmartMat.service.product.ProductService;
+import org.springframework.stereotype.Service;
+
+import java.sql.Date;
+
+@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
+     * @param purchaseDate the date the product was purchased
+     * @return the fridge product association
+     */
+    public FridgeProductAsso createFridgeProductAsso(Fridge fridge, Product product, Date purchaseDate) {
+        FridgeProductAsso temp = new FridgeProductAsso();
+        temp.setFridgeId(fridge);
+        temp.setEan(product);
+        temp.setPurchaseDate(purchaseDate);
+        fridgeProductAssoRepository.save(temp);
+        return temp;
+    }
+
+    /**
+     * Deletes a fridge product association
+     * @param fridgeProductAsso the fridge product association to delete
+     */
+    public void deleteFridgeProductAsso(FridgeProductAsso fridgeProductAsso) {
+        fridgeProductAsso.getFridgeId().getProducts().remove(fridgeProductAsso);
+        fridgeProductAsso.getEan().getFridges().remove(fridgeProductAsso);
+        fridgeProductAssoRepository.delete(fridgeProductAsso);
+
+        fridgeRepository.save(fridgeProductAsso.getFridgeId());
+
+        productRepository.save(fridgeProductAsso.getEan());
+    }
+}
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 c36c8084..d458bf76 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
@@ -1,12 +1,15 @@
 package ntnu.idatt2016.v233.SmartMat.service.group;
 
 import lombok.AllArgsConstructor;
+import ntnu.idatt2016.v233.SmartMat.entity.fridgeProduct.FridgeProductAsso;
 import ntnu.idatt2016.v233.SmartMat.entity.group.Fridge;
 import ntnu.idatt2016.v233.SmartMat.repository.group.FridgeRepository;
 import ntnu.idatt2016.v233.SmartMat.entity.product.Product;
 import ntnu.idatt2016.v233.SmartMat.service.product.ProductService;
 import org.springframework.stereotype.Service;
 
+import java.sql.Date;
+import java.time.LocalDate;
 import java.util.Optional;
 
 /**
@@ -23,6 +26,8 @@ public class FridgeService {
     private final FridgeRepository fridgeRepository;
     private final ProductService productService;
 
+    private final FridgeProductAssoService fridgeProductAssoService;
+
     /**
      * Gets the fridge of a group
      *
@@ -47,10 +52,11 @@ public class FridgeService {
 
         if (product.isPresent()) {
             Product productToAdd = product.get();
-            if (fridge.getProducts().contains(productToAdd)) {
+            FridgeProductAsso temp = new FridgeProductAsso(fridge, productToAdd, new Date(LocalDate.now().toEpochDay()));
+            if (fridge.getProducts().contains(temp)) {
                 return false;
             }
-            fridge.getProducts().add(productToAdd);
+            fridge.getProducts().add(temp);
             fridgeRepository.save(fridge);
             return true;
         } else {
@@ -66,20 +72,35 @@ public class FridgeService {
      * @param ean the ean of the product
      * @return true if the product was removed
      */
-    public boolean removeProductFromFridge(long groupId, long ean) {
+    public boolean removeProductFromFridge(long groupId, long ean, Date purchaseDate) {
         Optional<Product> product = productService.getProductById(ean);
         Fridge fridge = fridgeRepository.findByGroupId(groupId).orElseThrow(() -> new IllegalArgumentException("Fridge does not exist"));
 
+
+
         if (product.isPresent()) {
             Product productToRemove = product.get();
-            if (!fridge.getProducts().contains(productToRemove)) {
+            if (!fridge.getProducts().contains(
+                    new FridgeProductAsso(fridge, productToRemove, purchaseDate))) {
                 return false;
             }
-            fridge.getProducts().remove(productToRemove);
+            fridgeProductAssoService.deleteFridgeProductAsso(new FridgeProductAsso(fridge,
+                    productToRemove, purchaseDate));
+
             fridgeRepository.save(fridge);
             return true;
         } else {
             return false;
         }
     }
+
+    /**
+     * Updates a fridge
+     * @param fridge the fridge to update
+     */
+    public void updateFridge(Fridge fridge) {
+        if (fridgeRepository.findById(fridge.getFridgeId()).isEmpty())
+            return;
+        fridgeRepository.save(fridge);
+    }
 }
diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductService.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductService.java
index 13d85862..e668812f 100644
--- a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductService.java
+++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/product/ProductService.java
@@ -83,5 +83,16 @@ public class ProductService {
         return ProductUtil.getVolumeFromProduct(productRepository.findById(id).get());
     }
 
+    /**
+     * Updates a product
+     * @param product The product to update
+     */
+    public void updateProduct(Product product) {
+        if(productRepository.findById(product.getEan()).isEmpty())
+            return;
+
+        productRepository.save(product);
+    }
+
 
 }
-- 
GitLab