diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/WasteController.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/WasteController.java index 33cc6d4e6f1a06d69b15e7a68899100fb88a6bb1..54653436d5aa087add55d7615c1dabe88653f249 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/WasteController.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/controller/group/WasteController.java @@ -4,6 +4,7 @@ import java.util.List; import lombok.AllArgsConstructor; import ntnu.idatt2016.v233.SmartMat.entity.Waste; import ntnu.idatt2016.v233.SmartMat.service.group.WasteService; +import ntnu.idatt2016.v233.SmartMat.util.CategoryUtil; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -53,4 +54,19 @@ public class WasteController { .map(ResponseEntity::ok) .orElseGet(() -> ResponseEntity.notFound().build()); } + + + /** + * Retrieves a list of Waste objects of a specific category from a group + * + * @param groupId the ID of the group to search for + * @param categoryNumber the number representing the category to search for + * @return a ResponseEntity containing a list of Waste objects if successful, or a not found ResponseEntity if the data is not found + */ + @GetMapping("/group/{groupId}/category/{categoryNumber}") + public ResponseEntity<List<Waste>> getWasteOfCategoryByGroupId(@PathVariable("groupId") long groupId, + @PathVariable("categoryNumber") int categoryNumber){ + return wasteService.getWasteOfCategoryByGroupId(groupId, CategoryUtil.getCategoryName(categoryNumber)).map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); + } + } diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/WasteRepository.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/WasteRepository.java index e43ed6500c217c74ffb5124f23f061d49c928216..712ccc98b34b607cd7ec3555c03a0cb6d2e1d5ca 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/WasteRepository.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/repository/group/WasteRepository.java @@ -3,9 +3,25 @@ package ntnu.idatt2016.v233.SmartMat.repository.group; import java.util.List; import ntnu.idatt2016.v233.SmartMat.entity.Waste; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.Optional; public interface WasteRepository extends JpaRepository<Waste, Long> { Optional<List<Waste>> findByGroupId(long groupId); + + + /** + * Returns a list of all waste items of a given category from a specific group. + * + * @param groupId the ID of the group + * @param categoryName the name of the category + * @return an Optional containing a List of Waste objects if at least one waste item is found, + * or an empty Optional if no waste items are found + */ + @Query(value = "SELECT * FROM wastes WHERE group_id = :groupId AND ean IN (SELECT ean FROM product WHERE category_name = :categoryName)", nativeQuery = true) + Optional<List<Waste>> findAllWasteOfOneCategoryFromGroup(@Param("groupId") long groupId, + @Param("categoryName") String categoryName); + } diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/WasteService.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/WasteService.java index f0090491f2f5389410729e8fe5ab203b5305ee1b..24ac8286656781c7c68d03f714ef9bc3e0a9c27e 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/WasteService.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/service/group/WasteService.java @@ -41,4 +41,17 @@ public class WasteService { public Optional<List<Waste>> getWasteByGroupId(long groupId) { return wasteRepository.findByGroupId(groupId); } + + /** + * Returns an Optional containing a List of Waste objects for a specific category and group id, + * or an empty Optional if there are no wastes for that category and group id. + * + * @param groupId the ID of the group to search in + * @param categoryName the name of the category to search for + * @return an Optional containing a List of Waste objects, or an empty Optional if there are no wastes for that category and group id + */ + public Optional<List<Waste>> getWasteOfCategoryByGroupId(long groupId, String categoryName){ + return wasteRepository.findAllWasteOfOneCategoryFromGroup(groupId,categoryName); + } + } diff --git a/src/main/java/ntnu/idatt2016/v233/SmartMat/util/CategoryUtil.java b/src/main/java/ntnu/idatt2016/v233/SmartMat/util/CategoryUtil.java index 1fd43e1d697e516435d2a7b341d63a15c5350019..ae6cc749d4f8a702a80e6a3b42a824539d5074c2 100644 --- a/src/main/java/ntnu/idatt2016/v233/SmartMat/util/CategoryUtil.java +++ b/src/main/java/ntnu/idatt2016/v233/SmartMat/util/CategoryUtil.java @@ -31,4 +31,22 @@ public class CategoryUtil { if(Arrays.stream(FRUIT_AND_VEGETABLES).anyMatch(response::contains)) return "fruit and vegetables"; return "other"; } + + /** + * Returns the category name corresponding to the given category number. + * + * @param categoryNumber the category number + * @return the category name + * @throws IllegalArgumentException if the given category number is invalid + */ + public static String getCategoryName(int categoryNumber) { + return switch (categoryNumber) { + case 1 -> "meat, fish and chicken"; + case 2 -> "baked goods and grains"; + case 3 -> "dairy and egg"; + case 4 -> "other"; + case 5 -> "fruit and vegetables"; + default -> throw new IllegalArgumentException("Invalid category number: " + categoryNumber); + }; + } }