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.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.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 ? :
+
+ }
);
}
-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) {