package com.ufund.api.ufundapi.service; import java.io.IOException; import java.util.Arrays; import com.ufund.api.ufundapi.model.Need; import com.ufund.api.ufundapi.persistence.CupboardDAO; import org.springframework.stereotype.Component; import com.ufund.api.ufundapi.DuplicateKeyException; @Component public class CupboardService { private final CupboardDAO cupboardDAO; public CupboardService(CupboardDAO cupboardDAO) { this.cupboardDAO = cupboardDAO; } /** * Creates a new Need * * @param name The name of the need to create * @param maxGoal The max goal of the new need * @param goalType The goal type of the new need * @return The need that was created * @throws IOException Thrown if there was any issue saving the data * @throws DuplicateKeyException If there already exists a need with the same name */ public Need createNeed(String name, int maxGoal, Need.GoalType goalType) throws IOException, DuplicateKeyException { Need need = new Need(name, goalType, maxGoal); if (need.getMaxGoal() <= 0) { throw new IllegalArgumentException("Max Goal must be greater than zero"); } else { for (Need searchNeed : cupboardDAO.getNeeds()) { if (need.getName().equalsIgnoreCase(searchNeed.getName())) { throw new DuplicateKeyException("Duplicate names are not allowed"); } } return cupboardDAO.addNeed(need); } } /** * Get all the needs in the cupboard * * @return An array containing all needs * @throws IOException Thrown if there was any issue saving the data */ public Need[] getNeeds() throws IOException { return cupboardDAO.getNeeds(); } /** * Returns an array of needs filtered by a search * * @param search The search substring * @return The requested array * @throws IOException Thrown if there was any issue saving the data */ public Need[] searchNeeds(String search) throws IOException { return Arrays.stream(cupboardDAO.getNeeds()) .filter(i -> i.getName().toLowerCase().contains(search.toLowerCase())) .toArray(Need[]::new); } /** * Gets a need with the specified ID * * @param id the ID of the need * @return The resulting Need or null if the need was not found */ public Need getNeed(int id) throws IOException { return cupboardDAO.getNeed(id); } /** * Updates a need * * @param id The ID of the need to update * @param need The need object to set (note: the ID is ignored) * @return The updated need object * @throws IOException Thrown if there was an issue saving the changes */ public Need updateNeed(Need need, int id) throws IOException { if (need.getId() != id) { throw new IllegalArgumentException("ID in URL and body must match"); } return cupboardDAO.updateNeed(need); } /** * Delete a need from the cupboard * * @param id the ID of the need * @return True if the need was deleted * @throws IOException Thrown on any problem removing the need */ public boolean deleteNeed(int id) throws IOException { return cupboardDAO.deleteNeed(id); } }