diff --git a/front/src/app/pages/cocktails/CocktailsPageContent.js b/front/src/app/pages/cocktails/CocktailsPageContent.js index 344b317..6b46ac6 100644 --- a/front/src/app/pages/cocktails/CocktailsPageContent.js +++ b/front/src/app/pages/cocktails/CocktailsPageContent.js @@ -60,7 +60,7 @@ const CocktailsPageContent = ({all}) => { sort: sortList.find((s) => s.name === filter.sorting).id, page: page + 1, size: size, - iCount: Array.isArray(filter.iCount) ? null : filter.iCount + notHaveCount: Array.isArray(filter.iCount) ? null : filter.iCount } api().post(requests.cocktails.menu, request) .then((r) => { diff --git a/src/main/java/ru/kayashov/bar/controller/dto/cocktail/CocktailFilterRequestDto.java b/src/main/java/ru/kayashov/bar/controller/dto/cocktail/CocktailFilterRequestDto.java index e6fa894..d855b18 100644 --- a/src/main/java/ru/kayashov/bar/controller/dto/cocktail/CocktailFilterRequestDto.java +++ b/src/main/java/ru/kayashov/bar/controller/dto/cocktail/CocktailFilterRequestDto.java @@ -16,7 +16,7 @@ public class CocktailFilterRequestDto { private List category; private List alcohol; private List tags; - private Integer iCount; + private Integer notHaveCount; private List ingredient; private String inMenu; diff --git a/src/main/java/ru/kayashov/bar/service/CocktailService.java b/src/main/java/ru/kayashov/bar/service/CocktailService.java index 7526218..7475d0d 100644 --- a/src/main/java/ru/kayashov/bar/service/CocktailService.java +++ b/src/main/java/ru/kayashov/bar/service/CocktailService.java @@ -9,7 +9,6 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import ru.kayashov.bar.controller.IngredientController; import ru.kayashov.bar.controller.dto.cocktail.CocktailFilterRequestDto; import ru.kayashov.bar.controller.dto.cocktail.CocktailForIngredientModalDto; import ru.kayashov.bar.controller.dto.cocktail.CocktailForListResponseDto; @@ -57,6 +56,8 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; @Slf4j @Service @@ -162,8 +163,9 @@ public class CocktailService { } } - if (dto.getICount() != null) { - log.info("iii"); + if (dto.getNotHaveCount() != null) { + List approveCocktail = findICountCocktailIds(dto.getNotHaveCount(), visitor, dto.getIngredient()); + predicates.add(root.get("id").in(approveCocktail)); } // // if (!dto.getSortField().equals("name") || !dto.getSortOrder().equals("asc")) { @@ -189,10 +191,46 @@ public class CocktailService { List cocktailEntities = query.getResultList(); log.info("Найдено {} коктейлей", cocktailEntities.size()); -// return Collections.emptyList(); return cocktailEntities; } + private List findICountCocktailIds(Integer iCount, Visitor visitor, List ingredientFilter) { + List allowedIngredient = visitor.getResidents().stream() + .filter(BarResident::getActive) + .map(BarResident::getBar) + .map(BarEntity::getIngredients) + .flatMap(List::stream) + .map(BarIngredientStorage::getIngredient) + .map(IngredientEntity::getId) + .toList(); + + Stream> receiptStream = receiptRepository.findAll() + .stream() + .collect(Collectors.groupingBy(k -> k.getCocktail().getId())) + .values() + .stream() + .filter(l -> getCountNotHaveIngredient(allowedIngredient, l).equals(iCount)); + + if (!ingredientFilter.isEmpty()) { + receiptStream = receiptStream.filter(l -> findIngredientInReceipts(ingredientFilter, l)); + } + return receiptStream + .map(l -> l.get(0)) + .map(ReceiptEntity::getCocktail) + .map(CocktailEntity::getId) + .toList(); + } + + private boolean findIngredientInReceipts(List ingredientFilter, List receipts) { + return receipts.stream().anyMatch(r -> ingredientFilter.contains(r.getIngredient().getName())); + } + + private Integer getCountNotHaveIngredient(List allowedIngredientIds, List receipts) { + return Math.toIntExact(receipts.size() - receipts.stream() + .filter(r -> allowedIngredientIds.contains(r.getIngredient().getId())) + .count()); + } + private List getStopListIds(Visitor visitor) { return visitor.getResidents() .stream()