diff --git a/api/src/main/java/no/freshify/api/controller/HouseholdController.java b/api/src/main/java/no/freshify/api/controller/HouseholdController.java index 7fbcf9a5e22f211c23cd29a0c19c961fd4611677..36a272e2e128c7e1e59d4052c90ea3a84039bc04 100644 --- a/api/src/main/java/no/freshify/api/controller/HouseholdController.java +++ b/api/src/main/java/no/freshify/api/controller/HouseholdController.java @@ -6,6 +6,7 @@ import no.freshify.api.exception.InvalidHouseholdMemberRoleException; import no.freshify.api.exception.UserDoesNotBelongToHouseholdException; import no.freshify.api.exception.UserNotFoundException; import no.freshify.api.model.*; +import no.freshify.api.model.dto.UserFull; import no.freshify.api.model.dto.UserTypeRequest; import no.freshify.api.repository.HouseholdMemberRepository; import no.freshify.api.repository.HouseholdRepository; @@ -79,7 +80,7 @@ public class HouseholdController { * @return A list of users in the given household */ @GetMapping("/{id}/users") - public ResponseEntity<List<User>> getUsers(@PathVariable("id") long householdId) throws HouseholdNotFoundException { + public ResponseEntity<List<UserFull>> getUsers(@PathVariable("id") long householdId) throws HouseholdNotFoundException { return ResponseEntity.ok(householdService.getUsers(householdId)); } diff --git a/api/src/main/java/no/freshify/api/controller/ShoppingListController.java b/api/src/main/java/no/freshify/api/controller/ShoppingListController.java new file mode 100644 index 0000000000000000000000000000000000000000..54b8231e5c45c39cf3bf609d3a6d104ed8f4ead3 --- /dev/null +++ b/api/src/main/java/no/freshify/api/controller/ShoppingListController.java @@ -0,0 +1,60 @@ +package no.freshify.api.controller; + +import lombok.RequiredArgsConstructor; +import no.freshify.api.exception.HouseholdNotFoundException; +import no.freshify.api.exception.ItemTypeNotFoundException; +import no.freshify.api.exception.ShoppingListEntryAlreadyExistsException; +import no.freshify.api.model.*; +import no.freshify.api.model.dto.ShoppingListEntryRequest; +import no.freshify.api.service.HouseholdService; +import no.freshify.api.service.ItemTypeService; +import no.freshify.api.service.ShoppingListService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/household/{id}/shoppinglist") +@RequiredArgsConstructor +public class ShoppingListController { + + private final HouseholdService householdService; + private final ShoppingListService shoppingListService; + private final ItemTypeService itemTypeService; + + private final Logger logger = LoggerFactory.getLogger(InventoryController.class); + + + /** + * Adds an item to the given household's shopping list + * @param householdId The household whose shopping list we want to add an item to + * @param requestBody The item to be added + * @return + * @throws HouseholdNotFoundException If the household was not found + * @throws ItemTypeNotFoundException If the item type was not found + * @throws ShoppingListEntryAlreadyExistsException If the shopping list entry already exists in the shopping list + */ + //TODO: legg til 'addedBy' i shoppingListEntry + @PostMapping() + public ResponseEntity<ShoppingListEntry> addItem(@PathVariable("id") long householdId, + @RequestBody ShoppingListEntryRequest requestBody) + throws HouseholdNotFoundException, ItemTypeNotFoundException, ShoppingListEntryAlreadyExistsException { + + // Find the household by ID + Household household = householdService.findHouseholdByHouseholdId(householdId); + + // Create a new ShoppingListEntry object + ShoppingListEntry shoppingListEntry = new ShoppingListEntry(); + shoppingListEntry.setType(itemTypeService.getItemTypeById(requestBody.getItemTypeId())); + shoppingListEntry.setCount(requestBody.getCount()); + shoppingListEntry.setSuggested(requestBody.getSuggested()); + shoppingListEntry.setHousehold(household); + + // Add the new ShoppingListEntry to the household's shopping list + shoppingListService.addItem(shoppingListEntry); + + // Return the updated shopping list + return ResponseEntity.ok(shoppingListEntry); + } +} diff --git a/api/src/main/java/no/freshify/api/exception/ShoppingListEntryAlreadyExistsException.java b/api/src/main/java/no/freshify/api/exception/ShoppingListEntryAlreadyExistsException.java new file mode 100644 index 0000000000000000000000000000000000000000..c17daed0e3de3054621c0312003accfe3d9752de --- /dev/null +++ b/api/src/main/java/no/freshify/api/exception/ShoppingListEntryAlreadyExistsException.java @@ -0,0 +1,9 @@ +package no.freshify.api.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.CONFLICT) +public class ShoppingListEntryAlreadyExistsException extends Exception { + public ShoppingListEntryAlreadyExistsException() { super("Shopping list entry already exists in the shopping list"); } +} \ No newline at end of file diff --git a/api/src/main/java/no/freshify/api/model/dto/ShoppingListEntryRequest.java b/api/src/main/java/no/freshify/api/model/dto/ShoppingListEntryRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..471ebf7e7f1f724392a258580acab78a2af5ee98 --- /dev/null +++ b/api/src/main/java/no/freshify/api/model/dto/ShoppingListEntryRequest.java @@ -0,0 +1,12 @@ +package no.freshify.api.model.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ShoppingListEntryRequest { + Long itemTypeId; + Long count; + Boolean suggested; +} diff --git a/api/src/main/java/no/freshify/api/model/dto/UserFull.java b/api/src/main/java/no/freshify/api/model/dto/UserFull.java index 02c273f562e9ce8ebf92c4513d7cc83cca3e45ff..d9d2043eae51fde4afb3d1c37a38ed08d365893c 100644 --- a/api/src/main/java/no/freshify/api/model/dto/UserFull.java +++ b/api/src/main/java/no/freshify/api/model/dto/UserFull.java @@ -1,13 +1,13 @@ package no.freshify.api.model.dto; -import lombok.Getter; -import lombok.Setter; -import no.freshify.api.model.User; +import lombok.*; @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor public class UserFull { - private long id; + private Long id; private String firstName; private String email; } diff --git a/api/src/main/java/no/freshify/api/service/HouseholdService.java b/api/src/main/java/no/freshify/api/service/HouseholdService.java index b15f6e753109778827d22a53c4bd032d121dc598..b1d4e354590183a7d8219572919cce0ea4c7e981 100644 --- a/api/src/main/java/no/freshify/api/service/HouseholdService.java +++ b/api/src/main/java/no/freshify/api/service/HouseholdService.java @@ -6,6 +6,7 @@ import no.freshify.api.exception.UserNotFoundException; import no.freshify.api.model.Household; import no.freshify.api.model.HouseholdMember; import no.freshify.api.model.User; +import no.freshify.api.model.dto.UserFull; import no.freshify.api.repository.HouseholdMemberRepository; import no.freshify.api.repository.HouseholdRepository; import no.freshify.api.repository.UserRepository; @@ -15,6 +16,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; @Service @@ -27,16 +29,22 @@ public class HouseholdService { private final Logger logger = LoggerFactory.getLogger(HouseholdService.class); - public List<User> getUsers(long householdId) throws HouseholdNotFoundException { + public List<UserFull> getUsers(long householdId) throws HouseholdNotFoundException { logger.info("Getting users in household with id: " + householdId); if (!householdRepository.existsById(householdId)) { logger.warn("Household with id " + householdId + " not found"); throw new HouseholdNotFoundException(); } - return householdMemberRepository.findHouseholdMembersByHouseholdId(householdId) - .stream() - .map(HouseholdMember::getUser).toList(); + List<HouseholdMember> householdMembers = householdMemberRepository.findHouseholdMembersByHouseholdId(householdId); + List<UserFull> users = new ArrayList<>(); + for (HouseholdMember householdMember : householdMembers) { + User user = householdMember.getUser(); + UserFull userFull = new UserFull(user.getId(), user.getFirstName(), user.getEmail()); + users.add(userFull); + } + + return users; } public List<Household> getHouseholds(long userId) throws UserNotFoundException { diff --git a/api/src/main/java/no/freshify/api/service/ShoppingListService.java b/api/src/main/java/no/freshify/api/service/ShoppingListService.java new file mode 100644 index 0000000000000000000000000000000000000000..74b5f7fb8e2a28dbb6e8d5f32569b6500496c8b9 --- /dev/null +++ b/api/src/main/java/no/freshify/api/service/ShoppingListService.java @@ -0,0 +1,29 @@ +package no.freshify.api.service; + +import lombok.RequiredArgsConstructor; +import no.freshify.api.exception.ShoppingListEntryAlreadyExistsException; +import no.freshify.api.model.Item; +import no.freshify.api.model.ShoppingListEntry; +import no.freshify.api.repository.ShoppingListEntryRepository; +import no.freshify.api.repository.UserRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ShoppingListService { + + private final ShoppingListEntryRepository shoppingListEntryRepository; + + private final Logger logger = LoggerFactory.getLogger(UserService.class); + + public void addItem(ShoppingListEntry shoppingListEntry) throws ShoppingListEntryAlreadyExistsException { + logger.info("Adding item to shopping list"); + if (shoppingListEntryRepository.existsById(shoppingListEntry.getId())) { + logger.warn("Shopping list entry already exists in the shopping list"); + throw new ShoppingListEntryAlreadyExistsException(); + } + shoppingListEntryRepository.save(shoppingListEntry); + } +}