diff --git a/front/src/app/pages/cocktails/CocktailsPageContent.js b/front/src/app/pages/cocktails/CocktailsPageContent.js index b3ae2e5..3957eac 100644 --- a/front/src/app/pages/cocktails/CocktailsPageContent.js +++ b/front/src/app/pages/cocktails/CocktailsPageContent.js @@ -191,23 +191,13 @@ const CocktailsPageContent = () => { const handleSelectCocktail = (row) => { selectCocktail(row.id) } - const handleEditMenu = (row, value) => { - const newState = rows.map((r) => { - if (r.id !== row.id) { - return r; - } - if (filter.all) { - return { - ...r, - inMenu: value - } - } - return null - }).filter((r) => r !== null); - - api().post(`${requests.cocktails.menu}?id=${row.id}&value=${value}`) - .then(() => setRows(newState)) - .catch(() => createError("Ошибка сохранения данных")) + const deleteHandle = (row) => { + api().delete(requests.cocktails.cocktail + row.id) + .then(() => { + setRows(rows.filter((r) => r.id !== row.id)) + createSuccess("Коктейль удален") + }) + .catch(() => createError("Ошибка удаления коктейля")) } return ( @@ -242,6 +232,7 @@ const CocktailsPageContent = () => { ) })} diff --git a/front/src/components/cocktails/Cocktail.js b/front/src/components/cocktails/Cocktail.js index 622aa56..5fcd76c 100644 --- a/front/src/components/cocktails/Cocktail.js +++ b/front/src/components/cocktails/Cocktail.js @@ -1,22 +1,22 @@ import {CardActions, CardContent, CardMedia, Rating} from "@mui/material"; -import {useAlert} from "../../hooks/useAlert"; import Typography from "@mui/material/Typography"; -import Button from "@mui/material/Button"; import Grid from "@mui/material/Grid"; -import {requests} from "../../requests"; import {CocktailItemStyled} from "./CocktailItemStyled"; import IconButton from "@mui/material/IconButton"; import FavoriteBorderIcon from '@mui/icons-material/FavoriteTwoTone'; import FavoriteIcon from '@mui/icons-material/Favorite'; -import {api} from "../../lib/clients/api"; import Box from "@mui/material/Box"; -import {useUser} from "../../hooks/useUser"; import {CocktailDescription} from "./CocktailDescription"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/Delete'; +import LocalBarIcon from '@mui/icons-material/LocalBar'; +import {paths} from "../../path"; function renderFavouriteBadge(handleFavourite, row) { - const childIcon = row.rating.favourite ? : ; + const childIcon = row.rating.favourite ? : ; return ( - handleFavourite(row)}> + handleFavourite(row)}> {childIcon} ) @@ -25,16 +25,14 @@ function renderFavouriteBadge(handleFavourite, row) { function renderRating(handleChangeRating, row) { return ( handleChangeRating(row, newValue)} /> ) } -export function Cocktail({row, handleFavourite, handleChangeRating, handleSelect}) { +export function Cocktail({row, handleFavourite, handleChangeRating, handleSelect, deleteHandler}) { return ( @@ -56,15 +54,25 @@ export function Cocktail({row, handleFavourite, handleChangeRating, handleSelect image={row.image.includes("thecocktaildb") ? (row.image + "/preview") : row.image} /> - {renderFavouriteBadge(handleFavourite, row)} - {renderRating(handleChangeRating, row)} - + + + + + {renderFavouriteBadge(handleFavourite, row)} + {renderRating(handleChangeRating, row)} + + + + + deleteHandler(row)}> + + + + {row.name} - - - + diff --git a/front/src/components/cocktails/FilterBlock.js b/front/src/components/cocktails/FilterBlock.js index a343da8..62449ec 100644 --- a/front/src/components/cocktails/FilterBlock.js +++ b/front/src/components/cocktails/FilterBlock.js @@ -19,36 +19,9 @@ export function FilterBlock({filter, handleFilterChange, handleClearFilter, barm const {createError} = useAlert(); const [glass, setGlass] = useState([]); const [category, setCategory] = useState([]); - const alcohol = [ - { - name: "Алкогольный", - id: "alcohol1" - }, - { - name: "Безалкогольный", - id: "alcohol2" - }]; - const ingredientCount = [ - { - id: "1IngredientCount", - name: 1 - }, - { - id: "2IngredientCount", - name: 2 - }, - { - id: "3IngredientCount", - name: 3 - }, - { - id: "4IngredientCount", - name: 4 - }, - { - id: "5IngredientCount", - name: 5 - }] + const alcohol = ['Алкогольный', 'Безалкогольный']; + const ingredientCount = [1,2,3,4,5]; + const sort = ['Название по возрастанию', 'Название по убыванию']; useEffect(() => { api().get(requests.bar.category) @@ -88,8 +61,8 @@ export function FilterBlock({filter, handleFilterChange, handleClearFilter, barm {/*Блок фильтров*/} @@ -117,18 +90,18 @@ export function FilterBlock({filter, handleFilterChange, handleClearFilter, barm /> {/*Фильтр по алкогольности*/} + filterValue={filter.alcohol} filterName={"alcohol"} identity/> {/*Фильтр по категории*/} {category.length > 0 && ( )} + filterName={"category"} handleChange={handleFilterChange} identity/>)} {/*Фильтр по посуде*/} {glass.length > 0 && ()} + filterValue={filter.glass} filterName={"glass"} identity/>)} {/*Фильтр по нехватке ингредиентов*/} {(barmen && filter.all) && ()} diff --git a/src/main/java/ru/kayashov/bar/mapper/CocktailMapper.java b/src/main/java/ru/kayashov/bar/mapper/CocktailMapper.java index 8536c7f..4abf690 100644 --- a/src/main/java/ru/kayashov/bar/mapper/CocktailMapper.java +++ b/src/main/java/ru/kayashov/bar/mapper/CocktailMapper.java @@ -10,10 +10,12 @@ import ru.kayashov.bar.controller.dto.cocktail.CocktailModalDto; import ru.kayashov.bar.controller.dto.cocktail.RatingResponseDto; import ru.kayashov.bar.controller.dto.cocktail.ReceiptResponseDto; import ru.kayashov.bar.controller.dto.ingredient.IngredientSimpleResponseDto; +import ru.kayashov.bar.model.entity.BarEntity; import ru.kayashov.bar.model.entity.CocktailEntity; import ru.kayashov.bar.model.entity.IngredientEntity; import ru.kayashov.bar.model.entity.ReceiptEntity; import ru.kayashov.bar.model.entity.Visitor; +import ru.kayashov.bar.repository.BarEntityRepository; import ru.kayashov.bar.repository.VisitorsRepository; import java.util.ArrayList; @@ -25,6 +27,7 @@ import java.util.stream.Collectors; public class CocktailMapper { private final VisitorsRepository visitorsRepository; + private final BarEntityRepository barRepository; @Transactional public List cocktailsToDtoList(List cocktails, Boolean all) { @@ -33,7 +36,7 @@ public class CocktailMapper { // return new ArrayList<>(); // } List barStopList = new ArrayList<>(); - List allowedIngredients = getAllowedIngredients(visitor); + List allowedIngredients = getAllowedIngredients(); return cocktails.stream() .map(c -> cocktailToDto(c, visitor, allowedIngredients, barStopList)) // .filter(c -> all || c.getIsAllowed()) @@ -42,7 +45,7 @@ public class CocktailMapper { } public CocktailForListResponseDto cocktailToFullDto(CocktailEntity e) { - List allowed = getAllowedIngredients(getCurrentVisitor()); + List allowed = getAllowedIngredients(); return CocktailForListResponseDto.builder() .id(e.getId()) .name(e.getName()) @@ -107,8 +110,13 @@ public class CocktailMapper { // d.setReceipt(e.getReceipt().stream().map(ReceiptResponseDto::mapToDto).toList()); } - private List getAllowedIngredients(Visitor visitor) { - return new ArrayList<>(); + private List getAllowedIngredients() { + return barRepository.findByActiveTrue() + .map(BarEntity::getIngredients) + .orElseThrow() + .stream() + .map(IngredientEntity::getId) + .toList(); // return visitor.getResidents().stream() // .filter(BarResident::getActive) // .map(BarResident::getBar) @@ -145,8 +153,7 @@ public class CocktailMapper { } public CocktailModalDto cocktailToModalDto(CocktailEntity e) { - Visitor visitor = getCurrentVisitor(); - List allowedIngredients = getAllowedIngredients(visitor); + List allowedIngredients = getAllowedIngredients(); return CocktailModalDto.builder() .id(e.getId()) .name(e.getName()) diff --git a/src/main/java/ru/kayashov/bar/mapper/IngredientMapper.java b/src/main/java/ru/kayashov/bar/mapper/IngredientMapper.java index f8f7764..6e4c3dd 100644 --- a/src/main/java/ru/kayashov/bar/mapper/IngredientMapper.java +++ b/src/main/java/ru/kayashov/bar/mapper/IngredientMapper.java @@ -4,8 +4,9 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import ru.kayashov.bar.controller.dto.ingredient.IngredientResponseDto; import ru.kayashov.bar.controller.dto.ingredient.IngredientSimpleResponseDto; +import ru.kayashov.bar.model.entity.BarEntity; import ru.kayashov.bar.model.entity.IngredientEntity; -import ru.kayashov.bar.service.VisitorService; +import ru.kayashov.bar.repository.BarEntityRepository; import java.util.List; @@ -13,15 +14,24 @@ import java.util.List; @RequiredArgsConstructor public class IngredientMapper { - private final VisitorService visitorService; + private final BarEntityRepository barRepository; public List mapIngredientsToDtoList(List ingredients) { - List allowedIngredients = visitorService.getAllowedIngredients(); + List allowedIngredients = getAllowedIngredients(); return ingredients.stream() .map(i -> mapIngredientToDto(i, allowedIngredients)) .toList(); } + private List getAllowedIngredients() { + return barRepository.findByActiveTrue() + .map(BarEntity::getIngredients) + .orElseThrow() + .stream() + .map(IngredientEntity::getId) + .toList(); + } + private IngredientResponseDto mapIngredientToDto(IngredientEntity i, List allowedIngredients) { return IngredientResponseDto .builder() @@ -37,7 +47,7 @@ public class IngredientMapper { } public List mapIngredientsToSimpleDtoList(List ingredients) { - List allowedIngredients = visitorService.getAllowedIngredients(); + List allowedIngredients = getAllowedIngredients(); return ingredients.stream() .map(i -> mapIngredientToSimpleDto(i, allowedIngredients)) .toList(); diff --git a/src/main/java/ru/kayashov/bar/model/entity/BarEntity.java b/src/main/java/ru/kayashov/bar/model/entity/BarEntity.java index 689150c..e07cc95 100644 --- a/src/main/java/ru/kayashov/bar/model/entity/BarEntity.java +++ b/src/main/java/ru/kayashov/bar/model/entity/BarEntity.java @@ -7,6 +7,9 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.Table; import java.util.List; @@ -20,7 +23,13 @@ public class BarEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; + private Boolean active; - @OneToMany(mappedBy = "bar") - private List ingredients; + @ManyToMany + @JoinTable( + name = "bar_ingredient", + joinColumns = @JoinColumn(name = "bar"), + inverseJoinColumns = @JoinColumn(name = "ingredient") + ) + private List ingredients; } diff --git a/src/main/java/ru/kayashov/bar/model/entity/BarIngredientStorage.java b/src/main/java/ru/kayashov/bar/model/entity/BarIngredientStorage.java deleted file mode 100644 index 952f204..0000000 --- a/src/main/java/ru/kayashov/bar/model/entity/BarIngredientStorage.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.kayashov.bar.model.entity; - -import lombok.Getter; -import lombok.Setter; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.ManyToOne; - -@Entity -@Getter -@Setter -public class BarIngredientStorage { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - private IngredientEntity ingredient; - - @ManyToOne - private BarEntity bar; -} diff --git a/src/main/java/ru/kayashov/bar/model/entity/IngredientEntity.java b/src/main/java/ru/kayashov/bar/model/entity/IngredientEntity.java index f8f2409..67d8a2d 100644 --- a/src/main/java/ru/kayashov/bar/model/entity/IngredientEntity.java +++ b/src/main/java/ru/kayashov/bar/model/entity/IngredientEntity.java @@ -10,6 +10,8 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; @@ -40,6 +42,11 @@ public class IngredientEntity { @JoinColumn(name = "type") private TypeEntity type; - @OneToMany(mappedBy = "ingredient") - private List barIngredients; + @ManyToMany + @JoinTable( + name = "bar_ingredient", + joinColumns = @JoinColumn(name = "ingredient"), + inverseJoinColumns = @JoinColumn(name = "bar") + ) + private List bars; } diff --git a/src/main/java/ru/kayashov/bar/repository/BarEntityRepository.java b/src/main/java/ru/kayashov/bar/repository/BarEntityRepository.java index 18e456e..cf3dfa0 100644 --- a/src/main/java/ru/kayashov/bar/repository/BarEntityRepository.java +++ b/src/main/java/ru/kayashov/bar/repository/BarEntityRepository.java @@ -3,5 +3,9 @@ package ru.kayashov.bar.repository; import org.springframework.data.jpa.repository.JpaRepository; import ru.kayashov.bar.model.entity.BarEntity; +import java.util.List; +import java.util.Optional; + public interface BarEntityRepository extends JpaRepository { + Optional findByActiveTrue(); } \ No newline at end of file diff --git a/src/main/java/ru/kayashov/bar/repository/BarIngredientStorageRepository.java b/src/main/java/ru/kayashov/bar/repository/BarIngredientStorageRepository.java deleted file mode 100644 index ff50f13..0000000 --- a/src/main/java/ru/kayashov/bar/repository/BarIngredientStorageRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.kayashov.bar.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import ru.kayashov.bar.model.entity.BarIngredientStorage; - -public interface BarIngredientStorageRepository extends JpaRepository { -} \ No newline at end of file diff --git a/src/main/java/ru/kayashov/bar/service/CocktailService.java b/src/main/java/ru/kayashov/bar/service/CocktailService.java index 3e872ed..c870942 100644 --- a/src/main/java/ru/kayashov/bar/service/CocktailService.java +++ b/src/main/java/ru/kayashov/bar/service/CocktailService.java @@ -15,8 +15,8 @@ import ru.kayashov.bar.controller.dto.cocktail.CocktailModalDto; import ru.kayashov.bar.controller.dto.cocktail.CocktailSimpleResponseDto; import ru.kayashov.bar.controller.dto.cocktail.ReceiptResponseDto; import ru.kayashov.bar.mapper.CocktailMapper; +import ru.kayashov.bar.model.Ingredient; import ru.kayashov.bar.model.entity.Alcoholic; -import ru.kayashov.bar.model.entity.BarIngredientStorage; import ru.kayashov.bar.model.entity.Category; import ru.kayashov.bar.model.entity.CocktailEntity; import ru.kayashov.bar.model.entity.Glass; @@ -30,12 +30,14 @@ import ru.kayashov.bar.repository.ReceiptRepository; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; import javax.persistence.criteria.Join; import javax.persistence.criteria.JoinType; import javax.persistence.criteria.Order; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.persistence.criteria.Subquery; +import javax.print.attribute.standard.MediaSize; import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -72,8 +74,6 @@ public class CocktailService { } private List criteria(CocktailFilterRequestDto dto) { - Visitor visitor = visitorService.getCurrentVisitor(); - Session session = entityManager.unwrap(Session.class); CriteriaBuilder cb = session.getCriteriaBuilder(); CriteriaQuery criteriaQuery = cb.createQuery(CocktailEntity.class); @@ -82,14 +82,7 @@ public class CocktailService { criteriaQuery.distinct(true); if (!dto.getAll()) { -// Long barId = visitor.getResidents().stream() -// .filter(BarResident::getActive) -// .map(BarResident::getBar) -// .map(BarEntity::getId) -// .toList() -// .get(0); - Long barId = 1L; - List cocktailIds = getAllowedCocktailIds(barId); + List cocktailIds = findICountCocktailIds(0, new ArrayList<>()); Predicate pr = root.get("id").in(cocktailIds); predicates.add(pr); } @@ -110,19 +103,19 @@ public class CocktailService { } if (dto.getGlass() != null && !dto.getGlass().isEmpty()) { - predicates.add(root.get("glassEntity").get("name").in(dto.getGlass())); + predicates.add(root.get("glass").in(dto.getGlass().stream().map(Glass::findValue).toList())); } if (dto.getCategory() != null && !dto.getCategory().isEmpty()) { - predicates.add(root.get("categoryEntity").get("name").in(dto.getCategory())); + predicates.add(root.get("category").in(dto.getCategory().stream().map(Category::findValue).toList())); } if (dto.getAlcohol() != null && !dto.getAlcohol().isEmpty()) { - predicates.add(root.get("alcoholicEntity").get("name").in(dto.getAlcohol())); + predicates.add(root.get("alcoholic").in(dto.getAlcohol().stream().map(Alcoholic::findValue).toList())); } if (dto.getNotHaveCount() != null) { - List approveCocktail = findICountCocktailIds(dto.getNotHaveCount(), visitor, dto.getIngredient()); + List approveCocktail = findICountCocktailIds(dto.getNotHaveCount(), dto.getIngredient()); predicates.add(root.get("id").in(approveCocktail)); } // @@ -152,8 +145,8 @@ public class CocktailService { return cocktailEntities; } - private List findICountCocktailIds(Integer iCount, Visitor visitor, List ingredientFilter) { - List allowedIngredient = new ArrayList<>(); + private List findICountCocktailIds(Integer iCount, List ingredientFilter) { + List allowedIngredient = visitorService.getAllowedIngredients(); Stream> receiptStream = receiptRepository.findAll() .stream() @@ -182,46 +175,85 @@ public class CocktailService { .count()); } - private List getAllowedCocktailIds(Long barId) { +// private List getAllowedCocktailIds(Long barId) { +// CriteriaBuilder cb = entityManager.getCriteriaBuilder(); +// CriteriaQuery query = cb.createQuery(Long.class); +// +// Root receiptRoot = query.from(ReceiptEntity.class); +// Join ingredientJoin = receiptRoot.join("ingredient", JoinType.LEFT); +// Join barIngredientStorageJoin = ingredientJoin.join("bars", JoinType.LEFT); +// +// // Внешний подзапрос с NOT EXISTS +// Subquery subquery = query.subquery(Long.class); +// Root receiptSubRoot = subquery.from(ReceiptEntity.class); +// Join ingredientSubJoin = receiptSubRoot.join("ingredient", JoinType.LEFT); +// +// // Внутренний подзапрос с NOT EXISTS +// Subquery innerSubquery = subquery.subquery(Long.class); +// Root barIngredientStorageInnerRoot = innerSubquery.from(BarIngredientStorage.class); +// +// // Условия внутреннего подзапроса +// innerSubquery.select(barIngredientStorageInnerRoot.get("id")) +// .where( +// cb.equal(barIngredientStorageInnerRoot.get("ingredient"), ingredientSubJoin.get("id")), +// cb.equal(barIngredientStorageInnerRoot.get("bar").get("id"), barId) +// ); +// +// // Условия внешнего подзапроса +// subquery.select(receiptSubRoot.get("id")) +// .where( +// cb.equal(receiptSubRoot.get("cocktail").get("id"), receiptRoot.get("cocktail").get("id")), +// cb.not(cb.exists(innerSubquery)) +// ); +// +// // Основной запрос +// query.select(receiptRoot.get("cocktail").get("id")) +// .distinct(true) +// .where( +// cb.equal(barIngredientStorageJoin.get("bar").get("id"), barId), +// cb.not(cb.exists(subquery)) +// ); +// +// return entityManager.createQuery(query).getResultList(); +// } + + /* + select cifc.cocktail_id + from (select r.cocktail_id, COUNT(CASE WHEN i.is_have THEN 0 END) as false_count + from receipt r + left join public.ingredient i on i.id = r.ingredient_id + group by r.cocktail_id) as cifc + where false_count = 0 + */ + private List findCocktailByCountNotHaveIngredient(Integer notHaveCount, List currentIngredient) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); - CriteriaQuery query = cb.createQuery(Long.class); + List predicates = new ArrayList<>(); + CriteriaQuery mainQuery = cb.createQuery(Long.class); - Root receiptRoot = query.from(ReceiptEntity.class); - Join ingredientJoin = receiptRoot.join("ingredient", JoinType.LEFT); - Join barIngredientStorageJoin = ingredientJoin.join("barIngredients", JoinType.LEFT); + // Создаем корневые сущности + Subquery sq = mainQuery.subquery(Long.class); + Root rsq = sq.from(ReceiptEntity.class); + Join ingredientJoin = rsq.join("ingredient", JoinType.LEFT); + // Создаем подзапрос + sq.select(cb.count(cb.selectCase(cb.isFalse(ingredientJoin.get("isHave"))))) + .groupBy(rsq.get("cocktail")) + .having(cb.equal(sq.getSelection(), notHaveCount)); - // Внешний подзапрос с NOT EXISTS - Subquery subquery = query.subquery(Long.class); - Root receiptSubRoot = subquery.from(ReceiptEntity.class); - Join ingredientSubJoin = receiptSubRoot.join("ingredient", JoinType.LEFT); + // Создаем внешний запрос + mainQuery.select(rsq.get("cocktail")); + Predicate predicate = cb.exists(sq); + predicates.add(predicate); +// mainQuery.where(cb.exists(sq)); - // Внутренний подзапрос с NOT EXISTS - Subquery innerSubquery = subquery.subquery(Long.class); - Root barIngredientStorageInnerRoot = innerSubquery.from(BarIngredientStorage.class); + if(!currentIngredient.isEmpty()) { + predicates.add(rsq.get("ingredient").in(currentIngredient)); + } - // Условия внутреннего подзапроса - innerSubquery.select(barIngredientStorageInnerRoot.get("id")) - .where( - cb.equal(barIngredientStorageInnerRoot.get("ingredient"), ingredientSubJoin.get("id")), - cb.equal(barIngredientStorageInnerRoot.get("bar").get("id"), barId) - ); + mainQuery.where(predicates.toArray(new Predicate[0])); - // Условия внешнего подзапроса - subquery.select(receiptSubRoot.get("id")) - .where( - cb.equal(receiptSubRoot.get("cocktail").get("id"), receiptRoot.get("cocktail").get("id")), - cb.not(cb.exists(innerSubquery)) - ); - - // Основной запрос - query.select(receiptRoot.get("cocktail").get("id")) - .distinct(true) - .where( - cb.equal(barIngredientStorageJoin.get("bar").get("id"), barId), - cb.not(cb.exists(subquery)) - ); - - return entityManager.createQuery(query).getResultList(); + // Выполняем запрос + return entityManager.createQuery(mainQuery) + .getResultList(); } public CocktailForListResponseDto findById(Long id) { @@ -307,7 +339,6 @@ public class CocktailService { receiptEntity.setIngredient(ingredient); receiptEntity.setCount(receipt.getCount()); receiptEntity.setUnit(receipt.getUnit()); -// receiptEntity.setMeasure(receipt.getMeasure()); receiptEntity.setCocktail(cocktail); receiptRepository.save(receiptEntity); } diff --git a/src/main/java/ru/kayashov/bar/service/IngredientService.java b/src/main/java/ru/kayashov/bar/service/IngredientService.java index b47bf50..17f69c6 100644 --- a/src/main/java/ru/kayashov/bar/service/IngredientService.java +++ b/src/main/java/ru/kayashov/bar/service/IngredientService.java @@ -6,12 +6,14 @@ import org.springframework.stereotype.Service; import ru.kayashov.bar.controller.dto.ingredient.IngredientResponseDto; import ru.kayashov.bar.controller.dto.ingredient.IngredientSimpleResponseDto; import ru.kayashov.bar.mapper.IngredientMapper; -import ru.kayashov.bar.repository.BarIngredientStorageRepository; +import ru.kayashov.bar.model.entity.BarEntity; import ru.kayashov.bar.model.entity.IngredientEntity; import ru.kayashov.bar.model.entity.TypeEntity; +import ru.kayashov.bar.repository.BarEntityRepository; import ru.kayashov.bar.repository.IngredientRepository; import ru.kayashov.bar.repository.TypeRepository; +import java.util.ArrayList; import java.util.List; @Slf4j @@ -19,16 +21,10 @@ import java.util.List; @RequiredArgsConstructor public class IngredientService { - private final VisitorService visitorService; private final TypeRepository typeRepository; private final IngredientRepository repository; private final IngredientMapper mapper; - private final BarIngredientStorageRepository barIngredientStorageRepository; - - public IngredientEntity findIngredientByName(String name) { - return repository.findByEnNameIgnoreCase(name) - .orElseThrow(() -> new RuntimeException("Не удалось найти ингредиент с названием " + name)); - } + private final BarEntityRepository barEntityRepository; private TypeEntity findTypeByName(String name) { return typeRepository.findByName(name) @@ -53,20 +49,15 @@ public class IngredientService { } public void changeBarIngredient(Long id, boolean isHave) { -// Visitor visitor = visitorService.getCurrentVisitor(); -// List storage = bar.getIngredients(); -// IngredientEntity ingredientEntity = getIngredientById(id); -// if (isHave) { -// BarIngredientStorage entity = new BarIngredientStorage(); -// entity.setBar(bar); -// entity.setIngredient(ingredientEntity); -// entity = barIngredientStorageRepository.save(entity); -// storage.add(entity); -// } else { -// storage.stream() -// .filter(s -> Objects.equals(s.getIngredient().getId(), ingredientEntity.getId())) -// .forEach(s -> barIngredientStorageRepository.deleteById(s.getId())); -// } + BarEntity bar = barEntityRepository.findByActiveTrue().orElseThrow(); + IngredientEntity ingredientEntity = getIngredientById(id); + + if (isHave) { + bar.getIngredients().add(ingredientEntity); + } else { + bar.getIngredients().remove(ingredientEntity); + } + barEntityRepository.save(bar); } public boolean saveChange(IngredientResponseDto dto) { @@ -81,8 +72,6 @@ public class IngredientService { entity.setName(dto.getName()); entity.setDescription(dto.getDescription()); -// entity.setEnName(dto.getEnName()); -// entity.setIsHave(dto.isHave()); entity.setAbv(dto.getAbv()); entity.setAlcohol(dto.getAlcohol()); diff --git a/src/main/java/ru/kayashov/bar/service/VisitorService.java b/src/main/java/ru/kayashov/bar/service/VisitorService.java index b58a96e..135cd46 100644 --- a/src/main/java/ru/kayashov/bar/service/VisitorService.java +++ b/src/main/java/ru/kayashov/bar/service/VisitorService.java @@ -3,7 +3,9 @@ package ru.kayashov.bar.service; import lombok.RequiredArgsConstructor; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import ru.kayashov.bar.model.entity.IngredientEntity; import ru.kayashov.bar.model.entity.Visitor; +import ru.kayashov.bar.repository.BarEntityRepository; import ru.kayashov.bar.repository.VisitorsRepository; import java.util.ArrayList; @@ -14,6 +16,7 @@ import java.util.List; public class VisitorService { private final VisitorsRepository visitorsRepository; + private final BarEntityRepository barRepository; public Visitor getCurrentVisitor() { Long id = ((Visitor) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId(); @@ -25,15 +28,10 @@ public class VisitorService { } public List getAllowedIngredients() { - return new ArrayList<>(); -// return getCurrentVisitor().getResidents() -// .stream() -// .filter(BarResident::getActive) -// .map(BarResident::getBar) -// .map(BarEntity::getIngredients) -// .flatMap(List::stream) -// .map(BarIngredientStorage::getIngredient) -// .map(IngredientEntity::getId) -// .toList(); + return barRepository.findByActiveTrue().orElseThrow() + .getIngredients() + .stream() + .map(IngredientEntity::getId) + .toList(); } }