diff --git a/front/src/app/NavigationRoutes.js b/front/src/app/NavigationRoutes.js index 495cfc2..499a1bc 100644 --- a/front/src/app/NavigationRoutes.js +++ b/front/src/app/NavigationRoutes.js @@ -13,6 +13,7 @@ import {EditIngredientPage} from "./pages/ingredients/EditIngredientPage"; import {EditCocktailPage} from "./pages/cocktails/EditCocktailPage"; import {useEffect, useState} from "react"; import {BarChangePage} from "./pages/BarChangePage"; +import {CalcPage} from "./pages/calc/CalcPage"; export function NavigationRoutes() { const {auth} = useAuth(); @@ -59,6 +60,11 @@ const authPages = [ children: (), isPrivate: false, }, + { + path: paths.bar.calc, + children: (), + isPrivate: true, + }, { path: paths.dashboard.overview, isPrivate: true, @@ -96,11 +102,16 @@ const authPages = [ const guestPages = [ { - path: paths.home, - isPrivate: false, - children: (), + path: paths.dashboard.overview, + isPrivate: true, + children: (), exact: true, }, + { + children: (), + isPrivate: false, + path: paths.home, + }, { path: paths.auth.tg, isPrivate: false, diff --git a/front/src/app/pages/calc/CalcPage.js b/front/src/app/pages/calc/CalcPage.js new file mode 100644 index 0000000..ebb7468 --- /dev/null +++ b/front/src/app/pages/calc/CalcPage.js @@ -0,0 +1,110 @@ +import Typography from "@mui/material/Typography"; +import * as React from "react"; +import {useEffect, useMemo} from "react"; +import {api} from "../../../lib/clients/api"; +import {requests} from "../../../requests"; +import {useAlert} from "../../../hooks/useAlert"; +import Stack from "@mui/material/Stack"; +import Box from "@mui/material/Box"; +import {CocktailItemCalc} from "./CocktailItemCalc"; +import {IngredientCalcCard} from "./IngredientCalcCard"; + +export function CalcPage() { + const {createError} = useAlert(); + const [cocktails, setCocktails] = React.useState([]); + const [load, setLoad] = React.useState(false); + const [cocktailMap, setCocktailMap] = React.useState([]); + + const changeHandler = (id, value) => { + setCocktailMap((prev) => ({ + ...prev, + [id]: value + })); + } + + useEffect(() => { + if (load) { + return; + } + api().get(requests.cocktails.calc) + .then((r) => { + const data = r.data; + if (data.length === 0) { + setLoad(false); + return; + } + setCocktails(data); + let map = []; + data.map((d) => { + map[d.id] = 1 + }) + setCocktailMap(map); + setLoad(true); + }) + .catch((r) => { + setLoad(true); + createError("Ошибка загрузки данных от сервера Status:" + r.code) + }) + // eslint-disable-next-line + }, [load]); + + const ingredients = useMemo(() => { + let map = {} + if (!cocktails) { + return []; + } + cocktails.forEach((c) => { + const receipts = c.receipt; + const countMeter = cocktailMap[c.id]; + + if (!receipts) { + return + } + receipts.forEach((r) => { + const ingredient = r.ingredient; + const id = ingredient.id; + const ingredientCount = r.count; + + const resultCount = ingredientCount * countMeter; + + if (map[id]) { + map[id] = { + ...map[id], + count: map[id].count + resultCount + } + } else { + map[id] = { + ingredient: ingredient, + count: resultCount + } + } + }) + }) + return Object.values(map); + }, + [cocktails, cocktailMap]) + + const deleteHandler = (id) => { + const state = cocktails.filter((c) => c.id !== id); + setCocktails(state); + } + + return ( + + Коктейли + + {cocktails.map((item, i) => ( + + ))} + + + Ингредиенты + + {ingredients.map((item, i) => ( + + ))} + + + ) +} \ No newline at end of file diff --git a/front/src/app/pages/calc/CocktailItemCalc.js b/front/src/app/pages/calc/CocktailItemCalc.js new file mode 100644 index 0000000..e1c8b85 --- /dev/null +++ b/front/src/app/pages/calc/CocktailItemCalc.js @@ -0,0 +1,40 @@ +import {Card} from "@mui/material"; +import Stack from "@mui/material/Stack"; +import Box from "@mui/material/Box"; +import IconButton from "@mui/material/IconButton"; +import DeleteIcon from "@mui/icons-material/Delete"; +import React from "react"; +import Typography from "@mui/material/Typography"; +import {Counter} from "./Counter"; + +export function CocktailItemCalc({cocktail, deleteHandler, changeHandler}) { + return ( + + + + + {cocktail.id}/ + + + + {cocktail.name} + {cocktail.volume} + {cocktail.category} + {cocktail.alcoholic} + {cocktail.components} + + + + + + deleteHandler(cocktail.id)}> + + + + + + + + + ) +} \ No newline at end of file diff --git a/front/src/app/pages/calc/Counter.js b/front/src/app/pages/calc/Counter.js new file mode 100644 index 0000000..cdfe222 --- /dev/null +++ b/front/src/app/pages/calc/Counter.js @@ -0,0 +1,65 @@ +import React, {useState} from 'react'; +import {Box, TextField, Button} from '@mui/material'; +import {styled} from '@mui/material/styles'; + +// Стилизуем контейнер счетчика +const CounterContainer = styled(Box)` + display: flex; + align-items: center; + justify-content: center; + width: 150px; + height: 50px; + border-radius: 8px; + //box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + //background-color: #ffffff; +`; + +export function Counter({id, changeHandler}) { + const [value, setValue] = useState(1); + + const handleChange = (newValue) => { + setValue(newValue); + changeHandler(id, newValue); + } + + return ( + + + { + const newValue = parseInt(e.target.value, 10); + if (!isNaN(newValue)) { + handleChange(newValue); + } + }} + inputProps={{inputMode: 'numeric'}} + sx={{ + width: '40px', + height: '15px', + fontSize: '10px', + textAlign: 'center' + }} + /> + + + ); +} \ No newline at end of file diff --git a/front/src/app/pages/calc/IngredientCalcCard.js b/front/src/app/pages/calc/IngredientCalcCard.js new file mode 100644 index 0000000..16907d9 --- /dev/null +++ b/front/src/app/pages/calc/IngredientCalcCard.js @@ -0,0 +1,21 @@ +import {Card} from "@mui/material"; +import Stack from "@mui/material/Stack"; +import Box from "@mui/material/Box"; +import React from "react"; + +export function IngredientCalcCard({ingredient, count}) { + return ( + + + + {ingredient.id}/ + + {ingredient.name} + + {count} + + + + ) + +} \ No newline at end of file diff --git a/front/src/components/cocktails/Cocktail.js b/front/src/components/cocktails/Cocktail.js index 6289f6a..113fd81 100644 --- a/front/src/components/cocktails/Cocktail.js +++ b/front/src/components/cocktails/Cocktail.js @@ -65,7 +65,8 @@ export function Cocktail({row, handleFavourite, handleChangeRating, handleSelect {renderFavouriteBadge(handleFavourite, row)} {renderRating(handleChangeRating, row)} - {user.role !== 'USER' && + { + (user.role && user.role !== 'USER') && <> diff --git a/front/src/components/cocktails/CocktailInfoModal.js b/front/src/components/cocktails/CocktailInfoModal.js index afb6053..1f6d5c8 100644 --- a/front/src/components/cocktails/CocktailInfoModal.js +++ b/front/src/components/cocktails/CocktailInfoModal.js @@ -132,7 +132,7 @@ export function CocktailInfoModal({row}) { - {user.role !== "USER" && ( + {(user.role && user.role !== "USER") && ( selectIngredientHandler(r.ingredient)}> {r.ingredient.isHave @@ -161,7 +161,7 @@ export function CocktailInfoModal({row}) { - {user.role.includes("ADMIN") && ( + {(user.role && user.role.includes("ADMIN")) && ( )} diff --git a/front/src/components/core/UserPopover.js b/front/src/components/core/UserPopover.js index 8c271c9..e1f7773 100644 --- a/front/src/components/core/UserPopover.js +++ b/front/src/components/core/UserPopover.js @@ -7,11 +7,13 @@ import MenuList from '@mui/material/MenuList'; import Popover from '@mui/material/Popover'; import Typography from '@mui/material/Typography'; import {SignOut as SignOutIcon} from '@phosphor-icons/react/dist/ssr/SignOut'; +import {SignIn as SignInIcon} from '@phosphor-icons/react/dist/ssr/SignIn'; import {logger} from "../../lib/DefaultLogger"; import {useAuth} from "../../hooks/useAuth"; import {authClient} from "../../lib/clients/AuthClient"; import {useLocation} from "react-router-dom"; import {useUser} from "../../hooks/useUser"; +import {paths} from "../../path"; export function UserPopover({anchorEl, onClose, open}) { const {checkSession} = useAuth(); @@ -64,24 +66,28 @@ export function UserPopover({anchorEl, onClose, open}) { {/* */} {/* Профиль*/} {/**/} - - - - - Выход - + {!user.name ? window.location.replace(paths.auth.signIn)}> + + + + Вход + : + + + + + Выход + + } ); } -function userDescriptor(user, session) { - if (!user) { - return (Ошибка загрузки данных); +function userDescriptor(user) { + if (!user.name) { + return (Гость); } - - const open = (session.isActive && user.invited) ? "открыт" : "закрыт"; - return ( <> {user.name + " " + user.lastName} diff --git a/front/src/components/core/navIcons.js b/front/src/components/core/navIcons.js index ed78364..e190bcf 100644 --- a/front/src/components/core/navIcons.js +++ b/front/src/components/core/navIcons.js @@ -14,7 +14,8 @@ import { Martini, Storefront, Users, - Wallet + Wallet, + Calculator } from "@phosphor-icons/react"; export const navIcons = { @@ -31,6 +32,7 @@ export const navIcons = { 'chart-pie': ChartPieIcon, 'gear-six': GearSixIcon, 'plugs-connected': PlugsConnectedIcon, + 'calc': Calculator, 'x-square': XSquare, user: UserIcon, users: UsersIcon, diff --git a/front/src/context/UserContext.js b/front/src/context/UserContext.js index 19c8da8..6e78ab9 100644 --- a/front/src/context/UserContext.js +++ b/front/src/context/UserContext.js @@ -1,10 +1,8 @@ import * as React from "react"; +import {createContext, useCallback, useEffect, useState} from "react"; import {logger} from "../lib/DefaultLogger"; import {userClient} from "../lib/clients/UserClient"; import {tokenUtil} from "../lib/TokenUtil"; -import {createContext, useCallback, useEffect, useState} from "react"; -import {api} from "../lib/clients/api"; -import {requests} from "../requests"; export const UserContext = createContext(undefined); @@ -24,19 +22,10 @@ export function UserProvider({children}) { const checkSession = useCallback(async () => { try { setState((prev) => ({...prev, isLoading: true})); - if (!await tokenUtil.checkToken(tokenUtil.getToken())) { + if (!tokenUtil.checkToken(tokenUtil.getToken())) { setState((prev) => ({...prev, error: '', isLoading: false, user: {}})); return; } - api().get(requests.bar.session.status) - .then((r) => setState((prevState) => ({ - ...prevState, - session: r.data - }))) - .catch(() => setState((prevState) => ({ - ...prevState, - session: {} - }))) if (Object.keys(state.user).length === 0) { const {data, errorData} = await userClient.getMe(); if (errorData) { diff --git a/front/src/navItems.js b/front/src/navItems.js index d0e96a9..0e39376 100644 --- a/front/src/navItems.js +++ b/front/src/navItems.js @@ -5,5 +5,6 @@ export const navItems = [ {key: 'barList', title: 'Список баров', href: paths.bar.list, icon: 'basket', forBarmen: true}, {key: 'ingredients', title: 'Список ингредиентов', href: paths.bar.ingredients, icon: 'basket', forBarmen: true}, {key: 'ingredientEdit', title: 'Ингредиенты', href: paths.bar.ingredientEdit, icon: 'ingredients', forAdmin: true}, - {key: 'cocktailEdit', title: 'Коктейли', href: paths.bar.cocktailEdit, icon: 'cocktail', forAdmin: true} + {key: 'cocktailEdit', title: 'Коктейли', href: paths.bar.cocktailEdit, icon: 'cocktail', forAdmin: true}, + {key: 'calc', title: 'Калькулятор', href: paths.bar.calc, icon: 'calc', forAdmin: true}, ]; diff --git a/front/src/path.js b/front/src/path.js index 34913c1..e6b91b6 100644 --- a/front/src/path.js +++ b/front/src/path.js @@ -17,7 +17,8 @@ export const paths = { cocktails: "/cocktails", ingredientEdit: '/ingredients/edit', cocktailEdit: '/cocktail/edit', - menu: '/menuList' + menu: '/menuList', + calc: '/calc', }, errors: {notFound: '/errors/not-found'}, notFound: '*', diff --git a/front/src/requests.js b/front/src/requests.js index 810b4b9..b6b422c 100644 --- a/front/src/requests.js +++ b/front/src/requests.js @@ -29,7 +29,8 @@ export const requests = { rating: routes.cocktails + "/rating?id=", receipts: routes.cocktails + "/receipts?id=", byIngredient: routes.cocktails + "/byIngredient?id=", - instructions: routes.cocktails + "/instructions?id=" + instructions: routes.cocktails + "/instructions?id=", + calc: routes.cocktails + "/calc", }, visitors: { all: routes.visitor, diff --git a/src/main/java/ru/kayashov/bar/controller/AuthController.java b/src/main/java/ru/kayashov/bar/controller/AuthController.java index d602353..e40bf57 100644 --- a/src/main/java/ru/kayashov/bar/controller/AuthController.java +++ b/src/main/java/ru/kayashov/bar/controller/AuthController.java @@ -15,6 +15,7 @@ import ru.kayashov.bar.model.entity.Visitor; import ru.kayashov.bar.repository.VisitorsRepository; import ru.kayashov.bar.security.JwtTokenProvider; +import javax.annotation.security.PermitAll; import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.Optional; @@ -29,6 +30,7 @@ public class AuthController { private final VisitorsRepository visitorsRepository; private final PasswordEncoder passwordEncoder; + @PermitAll @PostMapping("/login") public AuthResponseDto checkTelegramChat(@RequestBody AuthRequestDto dto) { if (dto.getByLogin()) { @@ -75,6 +77,7 @@ public class AuthController { } } + @PermitAll @PostMapping("refresh") public AuthResponseDto refreshToken(@RequestHeader("Authorization") String token) { Claims claims = jwtTokenProvider.extractAllClaims(token); diff --git a/src/main/java/ru/kayashov/bar/controller/BarController.java b/src/main/java/ru/kayashov/bar/controller/BarController.java index d8edcad..ee856fd 100644 --- a/src/main/java/ru/kayashov/bar/controller/BarController.java +++ b/src/main/java/ru/kayashov/bar/controller/BarController.java @@ -16,12 +16,12 @@ import ru.kayashov.bar.controller.dto.cocktail.ReceiptResponseDto; import ru.kayashov.bar.model.entity.Category; import ru.kayashov.bar.model.entity.Glass; import ru.kayashov.bar.model.entity.Unit; -import ru.kayashov.bar.model.entity.UserRole; import ru.kayashov.bar.model.entity.Visitor; import ru.kayashov.bar.repository.UnitRepository; import ru.kayashov.bar.service.SessionService; import ru.kayashov.bar.service.VisitorService; +import javax.annotation.security.PermitAll; import java.util.Arrays; import java.util.List; @@ -36,21 +36,25 @@ public class BarController { private final VisitorService visitorService; private final UnitRepository unitRepository; + @PermitAll @GetMapping("/units") public List getUnitList() { return unitRepository.findAll(); } + @PermitAll @GetMapping("/glass") public List getGlass() { return Arrays.stream(Glass.values()).map(Glass::getName).toList(); } + @PermitAll @GetMapping("/category") public List getCategory() { return Arrays.stream(Category.values()).map(Category::getName).toList(); } + @PermitAll @GetMapping("/receipt") public List getReceipt(@RequestParam("id") Long id) { return sessionService.getReceiptList(id); diff --git a/src/main/java/ru/kayashov/bar/controller/CocktailController.java b/src/main/java/ru/kayashov/bar/controller/CocktailController.java index fd1f792..eb6856e 100644 --- a/src/main/java/ru/kayashov/bar/controller/CocktailController.java +++ b/src/main/java/ru/kayashov/bar/controller/CocktailController.java @@ -3,7 +3,6 @@ package ru.kayashov.bar.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -15,16 +14,16 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import ru.kayashov.bar.controller.dto.ErrorDto; import ru.kayashov.bar.controller.dto.cocktail.CocktailFilterRequestDto; import ru.kayashov.bar.controller.dto.cocktail.CocktailForIngredientModalDto; import ru.kayashov.bar.controller.dto.cocktail.CocktailForListResponseDto; -import ru.kayashov.bar.controller.dto.ErrorDto; 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.model.entity.Visitor; import ru.kayashov.bar.service.CocktailService; +import javax.annotation.security.PermitAll; import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -39,11 +38,17 @@ public class CocktailController { private final CocktailService cocktailService; //получить все + @PermitAll @PostMapping("menu") public List menu(@RequestBody CocktailFilterRequestDto dto) { return cocktailService.getMenu(dto); } + @GetMapping("calc") + public List calc() { + return cocktailService.calc(); + } + @GetMapping("/instructions") public String getInstructions(@RequestParam("id") Long id) { return cocktailService.findInstructions(id); @@ -56,7 +61,7 @@ public class CocktailController { @PostMapping("/photo") public String savePhoto(@RequestBody MultipartFile file) throws IOException { - if(file == null) { + if (file == null) { return ""; } return cocktailService.savePhoto(file); 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 d855b18..14744db 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 @@ -10,7 +10,7 @@ import java.util.List; @Setter @JsonIgnoreProperties(ignoreUnknown = true) public class CocktailFilterRequestDto { - private String search; + private String search = ""; private Boolean onlyFavourite; private List glass; private List category; diff --git a/src/main/java/ru/kayashov/bar/controller/dto/ingredient/IngredientSimpleResponseDto.java b/src/main/java/ru/kayashov/bar/controller/dto/ingredient/IngredientSimpleResponseDto.java index f996e46..475ce24 100644 --- a/src/main/java/ru/kayashov/bar/controller/dto/ingredient/IngredientSimpleResponseDto.java +++ b/src/main/java/ru/kayashov/bar/controller/dto/ingredient/IngredientSimpleResponseDto.java @@ -11,9 +11,12 @@ import ru.kayashov.bar.model.entity.IngredientEntity; public class IngredientSimpleResponseDto { private Long id; private String name; + private String image; private Boolean isHave; public static IngredientSimpleResponseDto mapToDto(IngredientEntity ingredient) { - return new IngredientSimpleResponseDto(ingredient.getId(), ingredient.getName(), false/*ingredient.getIsHave()*/); + return new IngredientSimpleResponseDto(ingredient.getId(), ingredient.getName(), + "https://thecocktaildb.com/images/ingredients/" + ingredient.getEnName() + "-Medium.png", + ingredient.getIsHave()); } } diff --git a/src/main/java/ru/kayashov/bar/mapper/CocktailMapper.java b/src/main/java/ru/kayashov/bar/mapper/CocktailMapper.java index 4abf690..68e1873 100644 --- a/src/main/java/ru/kayashov/bar/mapper/CocktailMapper.java +++ b/src/main/java/ru/kayashov/bar/mapper/CocktailMapper.java @@ -1,6 +1,8 @@ package ru.kayashov.bar.mapper; import lombok.RequiredArgsConstructor; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -30,15 +32,12 @@ public class CocktailMapper { private final BarEntityRepository barRepository; @Transactional - public List cocktailsToDtoList(List cocktails, Boolean all) { + public List cocktailsToDtoList(List cocktails, Boolean all, boolean withReceipts) { Visitor visitor = getCurrentVisitor(); -// if(checkUserNotInBar(visitor)) { -// return new ArrayList<>(); -// } List barStopList = new ArrayList<>(); List allowedIngredients = getAllowedIngredients(); return cocktails.stream() - .map(c -> cocktailToDto(c, visitor, allowedIngredients, barStopList)) + .map(c -> cocktailToDto(c, visitor, allowedIngredients, barStopList, withReceipts)) // .filter(c -> all || c.getIsAllowed()) // .filter(c -> all || c.getInMenu()) .toList(); @@ -59,7 +58,7 @@ public class CocktailMapper { .build(); } - private CocktailForListResponseDto cocktailToDto(CocktailEntity e, Visitor visitor, List allowedIngredients, List barStopList) { + private CocktailForListResponseDto cocktailToDto(CocktailEntity e, Visitor visitor, List allowedIngredients, List barStopList, boolean withReceipts) { boolean hasError = false; int volume = 0; Float abv = 0f; @@ -106,8 +105,8 @@ public class CocktailMapper { .rating(createRatingDto(e)) .isAllowed(calculateAllowed(e.getReceipt(), allowedIngredients)) .inMenu(!barStopList.contains(e.getId())) + .receipt(!withReceipts ? null : e.getReceipt().stream().map(ReceiptResponseDto::mapToDto).toList()) .build(); -// d.setReceipt(e.getReceipt().stream().map(ReceiptResponseDto::mapToDto).toList()); } private List getAllowedIngredients() { @@ -148,7 +147,14 @@ public class CocktailMapper { } private Visitor getCurrentVisitor() { - Long visitorId = ((Visitor) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId(); + SecurityContext context = SecurityContextHolder.getContext(); + Authentication authentication = context.getAuthentication(); + Long visitorId; + if (authentication.getPrincipal() instanceof Visitor) { + visitorId = ((Visitor) authentication.getPrincipal()).getId(); + } else { + visitorId = 1L; + } return visitorsRepository.findById(visitorId).orElseThrow(RuntimeException::new); } @@ -181,7 +187,7 @@ public class CocktailMapper { } private IngredientSimpleResponseDto createIngredientResponseDto(IngredientEntity i, List allowedIngredients) { - return new IngredientSimpleResponseDto(i.getId(), i.getName(), allowedIngredients.contains(i.getId())); + return new IngredientSimpleResponseDto(i.getId(), i.getName(), "https://thecocktaildb.com/images/ingredients/" + i.getEnName() + "-Medium.png", allowedIngredients.contains(i.getId())); } diff --git a/src/main/java/ru/kayashov/bar/mapper/IngredientMapper.java b/src/main/java/ru/kayashov/bar/mapper/IngredientMapper.java index 6e4c3dd..eb44bdc 100644 --- a/src/main/java/ru/kayashov/bar/mapper/IngredientMapper.java +++ b/src/main/java/ru/kayashov/bar/mapper/IngredientMapper.java @@ -54,6 +54,8 @@ public class IngredientMapper { } private IngredientSimpleResponseDto mapIngredientToSimpleDto(IngredientEntity i, List allowedIngredients) { - return new IngredientSimpleResponseDto(i.getId(), i.getName(), allowedIngredients.contains(i.getId())); + return new IngredientSimpleResponseDto(i.getId(), i.getName(), + "https://thecocktaildb.com/images/ingredients/" + i.getEnName() + "-Medium.png", + allowedIngredients.contains(i.getId())); } } diff --git a/src/main/java/ru/kayashov/bar/security/SecurityConfig.java b/src/main/java/ru/kayashov/bar/security/SecurityConfig.java index 009742f..c7c18b0 100644 --- a/src/main/java/ru/kayashov/bar/security/SecurityConfig.java +++ b/src/main/java/ru/kayashov/bar/security/SecurityConfig.java @@ -7,6 +7,7 @@ import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -26,6 +27,7 @@ import static org.springframework.security.config.http.SessionCreationPolicy.STA @Configuration @EnableWebSecurity @EnableMethodSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) @RequiredArgsConstructor public class SecurityConfig { @@ -51,8 +53,11 @@ public class SecurityConfig { private void authorizeConfiguration(AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry request) { request // Можно указать конкретный путь, * - 1 уровень вложенности, ** - любое количество уровней вложенности - .antMatchers("/api/auth/**") - .permitAll() + .antMatchers("/api/auth/**").permitAll() + .antMatchers("/api/cocktail/menu").permitAll() + .antMatchers("/api/bar/category").permitAll() + .antMatchers("/api/bar/glass").permitAll() + .antMatchers("/api/ingredient/simple").permitAll() .anyRequest() .authenticated(); } diff --git a/src/main/java/ru/kayashov/bar/service/CocktailService.java b/src/main/java/ru/kayashov/bar/service/CocktailService.java index 563cc5c..b000c39 100644 --- a/src/main/java/ru/kayashov/bar/service/CocktailService.java +++ b/src/main/java/ru/kayashov/bar/service/CocktailService.java @@ -14,6 +14,7 @@ import ru.kayashov.bar.controller.dto.cocktail.CocktailForListResponseDto; 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.controller.dto.cocktail.SortingEnum; import ru.kayashov.bar.mapper.CocktailMapper; import ru.kayashov.bar.model.entity.Alcoholic; import ru.kayashov.bar.model.entity.Category; @@ -67,7 +68,19 @@ public class CocktailService { */ @Transactional public List getMenu(CocktailFilterRequestDto dto) { - return mapper.cocktailsToDtoList(criteria(dto), dto.getAll()); + return mapper.cocktailsToDtoList(criteria(dto), dto.getAll(), false); + } + + @Transactional + public List calc() { + CocktailFilterRequestDto dto = new CocktailFilterRequestDto(); + dto.setPage(0); + dto.setSize(1000); + dto.setAll(false); + dto.setOnlyFavourite(false); + dto.setSort(SortingEnum.NAME_ASC); + + return mapper.cocktailsToDtoList(criteria(dto),false, true); } private List criteria(CocktailFilterRequestDto dto) {