From 0f39e223106c16266e71a9633b360524172e4577 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Thu, 24 Apr 2025 15:17:02 +0400 Subject: [PATCH 01/31] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=82=D0=B5=D0=BB=D0=B5=D0=B3=D1=80=D0=B0=D0=BC=20?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=20=D0=BD=D0=B0=20=D0=BA=D0=B0=D1=84=D0=BA?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 11 ++ .../bar/bot/annotation/CommandData.java | 15 -- .../bar/bot/config/TelegramBotConfig.java | 28 ---- .../bar/bot/config/TelegramBotMapper.java | 41 ----- .../bar/bot/config/TelegramBotMapperImpl.java | 128 -------------- .../bar/bot/config/TelegramBotProperty.java | 17 -- .../bar/bot/config/TelegramExecutorBot.java | 138 --------------- .../java/ru/kayashov/bar/bot/domain/Bot.java | 24 --- .../bot/domain/command/CommandContainer.java | 52 ------ .../bar/bot/domain/command/api/Command.java | 45 ----- .../bot/domain/command/impl/HideCommand.java | 24 --- .../bot/domain/command/impl/LoginCommand.java | 49 ------ .../bot/domain/command/impl/StartCommand.java | 55 ------ .../domain/command/impl/UnknownCommand.java | 27 --- .../inline/InlineKeyboardMarker.java | 157 ------------------ .../keyboards/reply/ReplyKeyboardMarker.java | 36 ---- .../domain/methods/AbstractDeleteMessage.java | 22 --- .../methods/AbstractInlineKeyboard.java | 25 --- .../bot/domain/methods/AbstractMethod.java | 13 -- .../methods/AbstractSendKeyboardMessage.java | 23 --- .../domain/methods/AbstractSendMessage.java | 19 --- .../domain/model/AbstractCallbackQuery.java | 11 -- .../bar/bot/domain/model/AbstractChat.java | 12 -- .../bot/domain/model/AbstractKeyboard.java | 16 -- .../domain/model/AbstractKeyboardButton.java | 21 --- .../bar/bot/domain/model/AbstractMessage.java | 13 -- .../bar/bot/domain/model/AbstractUpdate.java | 12 -- .../bar/bot/domain/utils/MethodUtils.java | 40 ----- .../ru/kayashov/bar/config/KafkaConfig.java | 39 +++++ .../bar/controller/OrderController.java | 16 +- .../bar/model/AbstractSendMessage.java | 11 ++ .../service/AbstractMessageSerializer.java | 42 +++++ .../ru/kayashov/bar/service/KafkaSender.java | 28 ++++ .../ru/kayashov/bar/service/OrderService.java | 3 +- src/main/resources/application.properties | 2 + 35 files changed, 144 insertions(+), 1071 deletions(-) delete mode 100644 src/main/java/ru/kayashov/bar/bot/annotation/CommandData.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/config/TelegramBotConfig.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/config/TelegramBotMapper.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/config/TelegramBotMapperImpl.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/config/TelegramBotProperty.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/config/TelegramExecutorBot.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/Bot.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/command/CommandContainer.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/command/api/Command.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/command/impl/HideCommand.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/command/impl/LoginCommand.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/command/impl/StartCommand.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/command/impl/UnknownCommand.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/keyboards/inline/InlineKeyboardMarker.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/keyboards/reply/ReplyKeyboardMarker.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractDeleteMessage.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractInlineKeyboard.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractMethod.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractSendKeyboardMessage.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractSendMessage.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/model/AbstractCallbackQuery.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/model/AbstractChat.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/model/AbstractKeyboard.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/model/AbstractKeyboardButton.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/model/AbstractMessage.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/model/AbstractUpdate.java delete mode 100644 src/main/java/ru/kayashov/bar/bot/domain/utils/MethodUtils.java create mode 100644 src/main/java/ru/kayashov/bar/config/KafkaConfig.java create mode 100644 src/main/java/ru/kayashov/bar/model/AbstractSendMessage.java create mode 100644 src/main/java/ru/kayashov/bar/service/AbstractMessageSerializer.java create mode 100644 src/main/java/ru/kayashov/bar/service/KafkaSender.java diff --git a/pom.xml b/pom.xml index 3954f63..63917e3 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,10 @@ org.springframework.boot spring-boot-starter-security + + org.springframework.kafka + spring-kafka + org.springframework.boot @@ -73,6 +77,8 @@ 2.18.2 + + org.postgresql postgresql @@ -83,6 +89,11 @@ lombok provided + + org.springframework.kafka + spring-kafka + 3.2.4 + diff --git a/src/main/java/ru/kayashov/bar/bot/annotation/CommandData.java b/src/main/java/ru/kayashov/bar/bot/annotation/CommandData.java deleted file mode 100644 index 2ab6144..0000000 --- a/src/main/java/ru/kayashov/bar/bot/annotation/CommandData.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.kayashov.bar.bot.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Аннотация для пометки команд бота - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface CommandData { - String name(); -} \ No newline at end of file diff --git a/src/main/java/ru/kayashov/bar/bot/config/TelegramBotConfig.java b/src/main/java/ru/kayashov/bar/bot/config/TelegramBotConfig.java deleted file mode 100644 index 66a0b71..0000000 --- a/src/main/java/ru/kayashov/bar/bot/config/TelegramBotConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.kayashov.bar.bot.config; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.telegram.telegrambots.meta.TelegramBotsApi; -import org.telegram.telegrambots.meta.exceptions.TelegramApiException; -import org.telegram.telegrambots.updatesreceivers.DefaultBotSession; - -@Slf4j -@Configuration -@RequiredArgsConstructor -public class TelegramBotConfig { - - private final TelegramExecutorBot bot; - - @Bean - TelegramBotsApi telegramBotsApi() throws TelegramApiException { - TelegramBotsApi telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class); - try { - telegramBotsApi.registerBot(bot); - } catch (TelegramApiException e) { - log.error("Bot did not register", e); - } - return telegramBotsApi; - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/config/TelegramBotMapper.java b/src/main/java/ru/kayashov/bar/bot/config/TelegramBotMapper.java deleted file mode 100644 index b91b043..0000000 --- a/src/main/java/ru/kayashov/bar/bot/config/TelegramBotMapper.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.kayashov.bar.bot.config; - -import org.telegram.telegrambots.meta.api.objects.CallbackQuery; -import org.telegram.telegrambots.meta.api.objects.Chat; -import org.telegram.telegrambots.meta.api.objects.Message; -import org.telegram.telegrambots.meta.api.objects.Update; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; -import ru.kayashov.bar.bot.domain.model.AbstractCallbackQuery; -import ru.kayashov.bar.bot.domain.model.AbstractChat; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboard; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboardButton; -import ru.kayashov.bar.bot.domain.model.AbstractMessage; -import ru.kayashov.bar.bot.domain.model.AbstractUpdate; - -import java.util.List; - -public interface TelegramBotMapper { - - AbstractUpdate toAbstractUpdate(Update update); - - AbstractMessage toAbstractMessage(Message message); - - AbstractCallbackQuery toAbstractCallbackQuery(CallbackQuery query); - - AbstractChat toAbstractChat(Chat chat); - - InlineKeyboardMarkup toInlineKeyboard(AbstractKeyboard replyKeyboard); - - ReplyKeyboardMarkup toReplyKeyboard(AbstractKeyboard replyKeyboard); - - List> toInlineKeyboard(List> buttons); - - List toListButtons(List buttons); - - List toKeyboardRows(List> rows); - - KeyboardRow toKeyboardRow(List row); -} diff --git a/src/main/java/ru/kayashov/bar/bot/config/TelegramBotMapperImpl.java b/src/main/java/ru/kayashov/bar/bot/config/TelegramBotMapperImpl.java deleted file mode 100644 index bfb6b56..0000000 --- a/src/main/java/ru/kayashov/bar/bot/config/TelegramBotMapperImpl.java +++ /dev/null @@ -1,128 +0,0 @@ -package ru.kayashov.bar.bot.config; - -import org.springframework.stereotype.Component; -import org.telegram.telegrambots.meta.api.objects.CallbackQuery; -import org.telegram.telegrambots.meta.api.objects.Chat; -import org.telegram.telegrambots.meta.api.objects.Message; -import org.telegram.telegrambots.meta.api.objects.Update; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow; -import ru.kayashov.bar.bot.domain.model.AbstractCallbackQuery; -import ru.kayashov.bar.bot.domain.model.AbstractChat; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboard; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboardButton; -import ru.kayashov.bar.bot.domain.model.AbstractMessage; -import ru.kayashov.bar.bot.domain.model.AbstractUpdate; - -import java.util.List; - -@Component -public class TelegramBotMapperImpl implements TelegramBotMapper { - - @Override - public AbstractUpdate toAbstractUpdate(Update update) { - if (update == null) return null; - - AbstractUpdate abstractUpdate = new AbstractUpdate(); - - abstractUpdate.setMessage(toAbstractMessage(update.getMessage())); - abstractUpdate.setCallbackQuery(toAbstractCallbackQuery(update.getCallbackQuery())); - - return abstractUpdate; - } - - @Override - public AbstractMessage toAbstractMessage(Message message) { - if (message == null) { - return null; - } - AbstractMessage abstractMessage = new AbstractMessage(); - - abstractMessage.setMessage(message.getText()); - abstractMessage.setMessageId(message.getMessageId()); - abstractMessage.setChat(toAbstractChat(message.getChat())); - abstractMessage.setChatId(message.getChatId()); - - return abstractMessage; - } - - @Override - public AbstractCallbackQuery toAbstractCallbackQuery(CallbackQuery query) { - if (query == null) { - return null; - } - AbstractCallbackQuery callbackQuery = new AbstractCallbackQuery(); - callbackQuery.setData(query.getData()); - callbackQuery.setMessage(toAbstractMessage(query.getMessage())); - return callbackQuery; - } - - @Override - public AbstractChat toAbstractChat(Chat chat) { - if (chat == null) { - return null; - } - AbstractChat abstractChat = new AbstractChat(); - abstractChat.setId(chat.getId()); - abstractChat.setFirstName(chat.getFirstName()); - abstractChat.setLastName(chat.getLastName()); - return abstractChat; - } - - @Override - public InlineKeyboardMarkup toInlineKeyboard(AbstractKeyboard replyKeyboard) { - InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); - - inlineKeyboardMarkup.setKeyboard(toInlineKeyboard(replyKeyboard.getKeyboard())); - - return inlineKeyboardMarkup; - } - - @Override - public ReplyKeyboardMarkup toReplyKeyboard(AbstractKeyboard replyKeyboard) { - return ReplyKeyboardMarkup.builder() - .keyboard(toKeyboardRows(replyKeyboard.getKeyboard())) - .resizeKeyboard(replyKeyboard.getResizeKeyboard()) - .inputFieldPlaceholder(replyKeyboard.getInputFieldPlaceholder()) - .oneTimeKeyboard(replyKeyboard.getOneTimeKeyboard()) - .selective(replyKeyboard.getSelective()) - .build(); - } - - @Override - public List> toInlineKeyboard(List> buttons) { - return buttons.stream() - .map(this::toListButtons) - .toList(); - } - - @Override - public List toListButtons(List buttons) { - return buttons.stream().map(this::toInlineKeyboardButton).toList(); - } - - private InlineKeyboardButton toInlineKeyboardButton(AbstractKeyboardButton button) { - InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); - - inlineKeyboardButton.setCallbackData(button.getCallbackData()); - inlineKeyboardButton.setText(button.getText()); - - return inlineKeyboardButton; - } - - @Override - public List toKeyboardRows(List> rows) { - return rows.stream() - .map(this::toKeyboardRow) - .toList(); - } - - @Override - public KeyboardRow toKeyboardRow(List row) { - KeyboardRow keyboardRow = new KeyboardRow(); - row.forEach(b -> keyboardRow.add(b.getText())); - return keyboardRow; - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/config/TelegramBotProperty.java b/src/main/java/ru/kayashov/bar/bot/config/TelegramBotProperty.java deleted file mode 100644 index 18b5b73..0000000 --- a/src/main/java/ru/kayashov/bar/bot/config/TelegramBotProperty.java +++ /dev/null @@ -1,17 +0,0 @@ -package ru.kayashov.bar.bot.config; - -import lombok.Getter; -import lombok.Setter; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Setter -@Getter -@Component -@ConfigurationProperties(prefix = "telegram.bot") -public class TelegramBotProperty { - - private String username; - - private String botToken; -} diff --git a/src/main/java/ru/kayashov/bar/bot/config/TelegramExecutorBot.java b/src/main/java/ru/kayashov/bar/bot/config/TelegramExecutorBot.java deleted file mode 100644 index 0222ead..0000000 --- a/src/main/java/ru/kayashov/bar/bot/config/TelegramExecutorBot.java +++ /dev/null @@ -1,138 +0,0 @@ -package ru.kayashov.bar.bot.config; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.telegram.telegrambots.bots.TelegramLongPollingBot; -import org.telegram.telegrambots.meta.api.methods.send.SendMessage; -import org.telegram.telegrambots.meta.api.methods.updatingmessages.DeleteMessage; -import org.telegram.telegrambots.meta.api.objects.Message; -import org.telegram.telegrambots.meta.api.objects.Update; -import org.telegram.telegrambots.meta.api.objects.User; -import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboard; -import org.telegram.telegrambots.meta.exceptions.TelegramApiException; -import ru.kayashov.bar.bot.domain.Bot; -import ru.kayashov.bar.bot.domain.command.CommandContainer; -import ru.kayashov.bar.bot.domain.command.api.Command; -import ru.kayashov.bar.bot.domain.methods.AbstractDeleteMessage; -import ru.kayashov.bar.bot.domain.methods.AbstractInlineKeyboard; -import ru.kayashov.bar.bot.domain.methods.AbstractMethod; -import ru.kayashov.bar.bot.domain.methods.AbstractSendKeyboardMessage; -import ru.kayashov.bar.bot.domain.methods.AbstractSendMessage; -import ru.kayashov.bar.bot.domain.model.AbstractUpdate; - -import java.util.List; - -@Slf4j -@Component -@RequiredArgsConstructor -public class TelegramExecutorBot extends TelegramLongPollingBot implements Bot { - - private final TelegramBotMapper mapper; - private final TelegramBotProperty botConfig; - private final CommandContainer commandContainer; - - @Override - public String getBotUsername() { - return botConfig.getUsername(); - } - - @Override - public String getBotToken() { - return botConfig.getBotToken(); - } - - @Override - public void onUpdateReceived(Update update) { - if (update.hasMessage()) { - Message reply = update.getMessage().getReplyToMessage(); - if (reply != null) { - String text = update.getMessage().getText(); - String data = "Cocktail:jump:" + text + ":" + reply.getMessageId(); - AbstractUpdate message = mapper.toAbstractUpdate(update); - message.getMessage().setMessage(data); - methodExecute(commandContainer.retrieveCommand("Cocktail").execute(message)); - return; - } - if (update.hasMessage()) { - String data = update.getMessage().getText(); - int dot = data.indexOf(':'); - if (dot > -1) { - data = data.substring(0, data.indexOf(":")); - } - methodExecute(commandContainer - .retrieveCommand(data) - .execute(mapper.toAbstractUpdate(update))); - } - } else if (update.hasCallbackQuery() && !update.getCallbackQuery().getData().equals("null")) { - String callbackData = update.getCallbackQuery().getData(); - String callbackCommand = callbackData.substring(0, callbackData.indexOf(":"));/*.replace("{\"", "");*/ - Command command = commandContainer.retrieveCommand(callbackCommand); - List methods = command.execute(mapper.toAbstractUpdate(update)); - methodExecute(methods); - } - } - - @Override - public void sendMessage(AbstractSendMessage message) { - SendMessage sendMessage = SendMessage.builder() - .chatId(message.getChatId()) - .text(message.getMessage()) - .parseMode("HTML") - .build(); - try { - execute(sendMessage); - log.info("AbstractMessage successfully sent to chat with id {}", message.getChatId()); - } catch (TelegramApiException e) { - log.error("AbstractMessage {} didn't send to chat with id {}", message, message.getChatId(), e); - } - } - - @Override - public void sendKeyboardMessage(AbstractSendKeyboardMessage message) { - send(getMessage(message.getChatId(), message.getMessage(), mapper.toReplyKeyboard(message.getKeyboard()))); - } - - @Override - public void sendInlineKeyboard(AbstractInlineKeyboard message) { - send(getMessage(message.getChatId(), message.getMessage(), mapper.toInlineKeyboard(message.getKeyboard()))); - } - - @Override - public void deleteMessage(AbstractDeleteMessage message) { - delete(getDeleteMessage(message.getChatId(), message.getMessageId())); - } - - private SendMessage getMessage(Long chatId, String message, ReplyKeyboard replyKeyboard) { - return SendMessage.builder() - .chatId(chatId) - .text(message) - .parseMode("HTML") - .replyMarkup(replyKeyboard) - .build(); - } - - private DeleteMessage getDeleteMessage(Long chatId, Integer messageId) { - return DeleteMessage.builder() - .chatId(chatId) - .messageId(messageId) - .build(); - } - - private void delete(DeleteMessage abstractDeleteMessage) { - try { - execute(abstractDeleteMessage); - } catch (TelegramApiException e) { - e.printStackTrace(); - } - } - - private void send(SendMessage sendMessage) { - try { - execute(sendMessage); - log.info("AbstractMessage {} successfully sent to chat with id {}", sendMessage.getText(), sendMessage.getChatId()); - } catch (TelegramApiException e) { - log.error("AbstractMessage {} didn't send to chat with id {}", sendMessage.getText(), sendMessage.getChatId(), e); - } - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/Bot.java b/src/main/java/ru/kayashov/bar/bot/domain/Bot.java deleted file mode 100644 index a87f837..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/Bot.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.kayashov.bar.bot.domain; - -import ru.kayashov.bar.bot.domain.methods.AbstractDeleteMessage; -import ru.kayashov.bar.bot.domain.methods.AbstractInlineKeyboard; -import ru.kayashov.bar.bot.domain.methods.AbstractMethod; -import ru.kayashov.bar.bot.domain.methods.AbstractSendKeyboardMessage; -import ru.kayashov.bar.bot.domain.methods.AbstractSendMessage; - -import java.util.List; - -public interface Bot { - - default void methodExecute(List methods) { - methods.forEach(x -> x.execute(this)); - } - - void deleteMessage(AbstractDeleteMessage abstractDeleteMessage); - - void sendMessage(AbstractSendMessage abstractSendMessage); - - void sendKeyboardMessage(AbstractSendKeyboardMessage keyboardMessage); - - void sendInlineKeyboard(AbstractInlineKeyboard keyboardMessage); -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/command/CommandContainer.java b/src/main/java/ru/kayashov/bar/bot/domain/command/CommandContainer.java deleted file mode 100644 index b1b1cfa..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/command/CommandContainer.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.kayashov.bar.bot.domain.command; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; -import ru.kayashov.bar.bot.annotation.CommandData; -import ru.kayashov.bar.bot.domain.command.api.Command; - -import javax.annotation.PostConstruct; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Getter -@Component -@RequiredArgsConstructor -public class CommandContainer { - - private final List commandList; - - @Qualifier("unknownCommand") - private final Command unknownCommand; - - private final Map commandMap = new HashMap<>(); - - - /** - * Метод, собирающий команды, помеченные аннотацией в список - */ - @PostConstruct - private void createCommandMap() throws ClassNotFoundException { - for(Command command : commandList) { - String proxyName = command.getClass().getName(); - String className = proxyName.substring(0, proxyName.indexOf("$$")); - String name = Class.forName(className) - .getAnnotation(CommandData.class) - .name(); - commandMap.put(name, command); - } - } - - /** - * Метод поиска команды - * - * @param commandIdentifier - название команды, пришедшее от пользователя - * @return - Команда бота {@link }, либо сообщение о неизвестной команде - */ - public Command retrieveCommand(String commandIdentifier) { - return commandMap.getOrDefault(commandIdentifier, unknownCommand); - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/command/api/Command.java b/src/main/java/ru/kayashov/bar/bot/domain/command/api/Command.java deleted file mode 100644 index d532cf6..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/command/api/Command.java +++ /dev/null @@ -1,45 +0,0 @@ -package ru.kayashov.bar.bot.domain.command.api; - -import org.springframework.transaction.annotation.Transactional; -import ru.kayashov.bar.bot.domain.methods.AbstractMethod; -import ru.kayashov.bar.bot.domain.model.AbstractCallbackQuery; -import ru.kayashov.bar.bot.domain.model.AbstractMessage; -import ru.kayashov.bar.bot.domain.model.AbstractUpdate; - -import java.util.List; - -public interface Command { - - @Transactional - List execute (AbstractUpdate abstractUpdate); - - default Long getChatId(AbstractUpdate abstractUpdate) { - AbstractMessage message = abstractUpdate.getMessage(); - AbstractCallbackQuery query = abstractUpdate.getCallbackQuery(); - - if(message != null) { - return message.getChat().getId(); - } - - if (query != null) { - return query.getMessage().getChatId(); - } - - throw new RuntimeException("Не возможно найти id чата"); - } - - default Integer getMessageId(AbstractUpdate abstractUpdate) { - AbstractMessage message = abstractUpdate.getMessage(); - AbstractCallbackQuery query = abstractUpdate.getCallbackQuery(); - - if(message != null) { - return message.getMessageId(); - } - - if (query != null) { - return query.getMessage().getMessageId(); - } - - throw new RuntimeException("Не возможно найти id сообщения"); - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/command/impl/HideCommand.java b/src/main/java/ru/kayashov/bar/bot/domain/command/impl/HideCommand.java deleted file mode 100644 index 1262a53..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/command/impl/HideCommand.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.kayashov.bar.bot.domain.command.impl; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import ru.kayashov.bar.bot.annotation.CommandData; -import ru.kayashov.bar.bot.domain.command.api.Command; -import ru.kayashov.bar.bot.domain.methods.AbstractMethod; -import ru.kayashov.bar.bot.domain.model.AbstractUpdate; - -import java.util.List; - -import static ru.kayashov.bar.bot.domain.utils.MethodUtils.deleteMessage; - -@Component -@CommandData(name = "hide") -@RequiredArgsConstructor -public class HideCommand implements Command { - - @Override - public List execute(AbstractUpdate abstractUpdate) { - return List.of(deleteMessage(abstractUpdate.getCallbackQuery().getMessage().getChatId(), - abstractUpdate.getCallbackQuery().getMessage().getMessageId())); - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/command/impl/LoginCommand.java b/src/main/java/ru/kayashov/bar/bot/domain/command/impl/LoginCommand.java deleted file mode 100644 index f408fcc..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/command/impl/LoginCommand.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.kayashov.bar.bot.domain.command.impl; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import ru.kayashov.bar.bot.annotation.CommandData; -import ru.kayashov.bar.bot.domain.command.api.Command; -import ru.kayashov.bar.bot.domain.methods.AbstractMethod; -import ru.kayashov.bar.bot.domain.model.AbstractChat; -import ru.kayashov.bar.bot.domain.model.AbstractUpdate; -import ru.kayashov.bar.model.entity.Visitor; -import ru.kayashov.bar.repository.VisitorsRepository; - -import java.util.Base64; -import java.util.List; -import java.util.Optional; -import java.util.Random; - -import static ru.kayashov.bar.bot.domain.utils.MethodUtils.sendMessage; - -@Component -@CommandData(name = "\uD83D\uDD11 Вход") -@RequiredArgsConstructor -public class LoginCommand implements Command { - - private final VisitorsRepository visitorsRepository; - - @Override - public List execute(AbstractUpdate abstractUpdate) { - AbstractChat chat = abstractUpdate.getMessage().getChat(); - Random random = new Random(); - final Integer code = random.nextInt(1010, 9999); - - Optional visitorOpt = visitorsRepository.findById(chat.getId()); - if (visitorOpt.isPresent()) { - Visitor visitor = visitorOpt.get(); - visitor.setCode(code); - visitorsRepository.save(visitor); - String responseCode = chat.getId() + ":" + code; - responseCode = Base64.getEncoder().encodeToString(responseCode.getBytes()); - - String message = "Скопируйте код: " + responseCode + " или " - + "перейдите по ссылке"; - return List.of(sendMessage(chat.getId(), message)); - } - String errorMessage = "Не удалось найти вас в системе. Попробуйте выполнить команду /start"; - return List.of(sendMessage(chat.getId(), errorMessage)); - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/command/impl/StartCommand.java b/src/main/java/ru/kayashov/bar/bot/domain/command/impl/StartCommand.java deleted file mode 100644 index 2fb0a1c..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/command/impl/StartCommand.java +++ /dev/null @@ -1,55 +0,0 @@ -package ru.kayashov.bar.bot.domain.command.impl; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import ru.kayashov.bar.bot.annotation.CommandData; -import ru.kayashov.bar.bot.domain.command.api.Command; -import ru.kayashov.bar.bot.domain.methods.AbstractMethod; -import ru.kayashov.bar.bot.domain.model.AbstractChat; -import ru.kayashov.bar.bot.domain.model.AbstractUpdate; -import ru.kayashov.bar.model.entity.Visitor; -import ru.kayashov.bar.repository.VisitorsRepository; - -import java.util.List; -import java.util.Optional; - -import static ru.kayashov.bar.bot.domain.keyboards.reply.ReplyKeyboardMarker.getMainMenu; -import static ru.kayashov.bar.bot.domain.utils.MethodUtils.sendKeyboardMessage; - -/** - * Команда обработки запроса меню - *

- * Реализация {@link } - */ -@Component -@CommandData(name = "/start") -@RequiredArgsConstructor -public class StartCommand implements Command { - - private final VisitorsRepository visitorsRepository; - - @Override - public List execute(AbstractUpdate abstractUpdate) { - AbstractChat chat = abstractUpdate.getMessage().getChat(); - - Optional visitorOpt = visitorsRepository.findById(chat.getId()); - String message; - Visitor visitor; - if (visitorOpt.isPresent()) { - visitor = visitorOpt.get(); - message = "С возвращением "; - } else { - message = "Спасибо за регистрацию "; - visitor = new Visitor(); - visitor.setId(chat.getId()); - visitor.setName(chat.getFirstName()); - visitor.setLastName(chat.getLastName()); - visitor = visitorsRepository.save(visitor); - } - message = message + visitor.getName().strip() + - (visitor.getLastName() != null ? (" " + visitor.getLastName().strip() + "!") : "!"); - - - return List.of(sendKeyboardMessage(chat.getId(), message, getMainMenu())); - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/command/impl/UnknownCommand.java b/src/main/java/ru/kayashov/bar/bot/domain/command/impl/UnknownCommand.java deleted file mode 100644 index 2130921..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/command/impl/UnknownCommand.java +++ /dev/null @@ -1,27 +0,0 @@ -package ru.kayashov.bar.bot.domain.command.impl; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import ru.kayashov.bar.bot.annotation.CommandData; -import ru.kayashov.bar.bot.domain.command.api.Command; -import ru.kayashov.bar.bot.domain.methods.AbstractMethod; -import ru.kayashov.bar.bot.domain.model.AbstractUpdate; - -import java.util.Collections; -import java.util.List; - -/** - * Обработка неизвестных команд - *

- * Реализация {@link Command} - */ -@Component -@CommandData(name = "unknownCommand") -@RequiredArgsConstructor -public class UnknownCommand implements Command { - - @Override - public List execute(AbstractUpdate abstractUpdate) { - return Collections.emptyList(); - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/keyboards/inline/InlineKeyboardMarker.java b/src/main/java/ru/kayashov/bar/bot/domain/keyboards/inline/InlineKeyboardMarker.java deleted file mode 100644 index b7256ce..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/keyboards/inline/InlineKeyboardMarker.java +++ /dev/null @@ -1,157 +0,0 @@ -package ru.kayashov.bar.bot.domain.keyboards.inline; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboard; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboardButton; - -import java.util.ArrayList; -import java.util.List; - -/** - * Класс методов для создания инлайн клавиатур - */ -@Component -@RequiredArgsConstructor -public class InlineKeyboardMarker { - - /** - * Преобразование списка кнопок в блок основных кнопок - * - * @param sizeRow опциональный размер строки - * @param abstractKeyboardButtons список кнопок для блока - * @return блок основных кнопок - */ - public List> getMainButtons(Integer sizeRow, List abstractKeyboardButtons) { -// int rowSize = PaginationUtil.getRowSize(sizeRow); - int rowSize = sizeRow; - int rowCountInPage = getRowCount(abstractKeyboardButtons.size(), rowSize); - List> buttons = new ArrayList<>(); - - for (int row = 0; row < rowCountInPage; row++) { - List rowButtons = new ArrayList<>(rowSize); - for (int i = 0; i < rowSize; i++) { - int index = (row * rowSize) + i; - if (index >= abstractKeyboardButtons.size()) { - break; - } - rowButtons.add(abstractKeyboardButtons.get(index)); - } - buttons.add(rowButtons); - } - - return buttons; - } - - - /** - * Запрос количества строк для основных кнопок - * - * @param elementsOnPage элементов на странице или общее количество - * @param rowSize количество элементов в строке - * @return число строк основных кнопок - */ - private int getRowCount(int elementsOnPage, int rowSize) { - return elementsOnPage / rowSize + (elementsOnPage % rowSize == 0 ? 0 : 1); - } - - /** - * Метод создания кнопок пагинации - * - * @return ряд кнопок для пагинации - */ - public List getPaginationButtons(int index, int total) { - List buttons = new ArrayList<>(); - - String pageName = "⏪"; - String callback = index != 0 ? "Cocktail:get:" + (index - 1) : "null"; - buttons.add(getButtonForPage(callback, pageName)); - - buttons.add(AbstractKeyboardButton.builder().text(index + 1 + "/" + total).callbackData("null").build()); - - pageName = "⏩"; - callback = index < total - 1 ? "Cocktail:get:" + (index + 1) : "null"; - buttons.add(getButtonForPage(callback, pageName)); - - return buttons; - } - - /** - * Метод создания кнопки - * - * @param callBack данные, возвращаемые на сервер - * @param text текст, видимый пользователю - * @return кнопка для вставки в текст - */ - public AbstractKeyboardButton getButtonForPage(String callBack, String text) { - return AbstractKeyboardButton.builder() - .text(text) - .callbackData(callBack) - .build(); - } - - public static class builder { - private final List> buttons = new ArrayList<>(); - private List> mainButtons; - private List pagination; - private List back; - private List hideButton; - private List stop; - - public builder() { - } - - public builder buttons(List> buttons) { - this.mainButtons = buttons; - return this; - } - - public builder pagination(List buttons) { - this.pagination = buttons; - return this; - } - - public builder backButton(AbstractKeyboardButton button) { - if (button != null) - this.back = List.of(button); - return this; - } - - public builder hidden(boolean isActive) { - if (isActive) { - AbstractKeyboardButton button = AbstractKeyboardButton.builder() - .text("Скрыть") - .callbackData("hide:") - .build(); - this.hideButton = List.of(button); - } - return this; - } - - public builder stopList(boolean isActive, Long cocktailId) { - if (isActive) { - AbstractKeyboardButton button = AbstractKeyboardButton.builder() - .text("Стоп-лист") - .callbackData("Cocktail:stop:" + cocktailId) - .build(); - this.stop = List.of(button); - } - return this; - } - - public AbstractKeyboard build() { - if (mainButtons != null) - buttons.addAll(mainButtons); - if (pagination != null) - buttons.add(pagination); - if (back != null) - buttons.add(back); - if (hideButton != null) - buttons.add(hideButton); - if (stop != null) - buttons.add(stop); - - return AbstractKeyboard.builder().keyboard(buttons).build(); - } - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/keyboards/reply/ReplyKeyboardMarker.java b/src/main/java/ru/kayashov/bar/bot/domain/keyboards/reply/ReplyKeyboardMarker.java deleted file mode 100644 index e8c0d87..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/keyboards/reply/ReplyKeyboardMarker.java +++ /dev/null @@ -1,36 +0,0 @@ -package ru.kayashov.bar.bot.domain.keyboards.reply; - -import lombok.experimental.UtilityClass; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboard; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboardButton; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -@UtilityClass -public class ReplyKeyboardMarker { - - public static AbstractKeyboard getMainMenu() { - String[] menu; - String mainMenu = "\uD83D\uDD11 Вход"; - menu = new String[]{mainMenu/*, "ℹ️ Ингредиенты", "✅ Взять заказ", "💵 Что докупить?"*/}; - - List> keyboard = getKeyboardRows(menu); - - return AbstractKeyboard.builder() - .keyboard(keyboard) - .inputFieldPlaceholder("Меню") - .resizeKeyboard(true) - .selective(true) - .oneTimeKeyboard(false) - .build(); - } - - private static List> getKeyboardRows(String... buttons) { - return Arrays - .stream(buttons) - .map(x -> List.of(new AbstractKeyboardButton(x))) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractDeleteMessage.java b/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractDeleteMessage.java deleted file mode 100644 index c435f67..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractDeleteMessage.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.kayashov.bar.bot.domain.methods; - -import lombok.Builder; -import lombok.Getter; -import ru.kayashov.bar.bot.domain.Bot; - -@Getter -public class AbstractDeleteMessage extends AbstractMethod { - - Integer messageId; - - @Builder - public AbstractDeleteMessage(Long chatId, Integer messageId) { - super(chatId); - this.messageId = messageId; - } - - @Override - public void execute(Bot nBot) { - nBot.deleteMessage(this); - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractInlineKeyboard.java b/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractInlineKeyboard.java deleted file mode 100644 index 7fada6b..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractInlineKeyboard.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.kayashov.bar.bot.domain.methods; - -import lombok.Builder; -import lombok.Getter; -import ru.kayashov.bar.bot.domain.Bot; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboard; - -@Getter -public class AbstractInlineKeyboard extends AbstractMethod { - - private final String message; - private final AbstractKeyboard keyboard; - - @Builder - public AbstractInlineKeyboard(Long chatId, String message, AbstractKeyboard keyboard) { - super(chatId); - this.message = message; - this.keyboard = keyboard; - } - - @Override - public void execute(Bot nBot) { - nBot.sendInlineKeyboard(this); - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractMethod.java b/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractMethod.java deleted file mode 100644 index 6f2d1f4..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractMethod.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.kayashov.bar.bot.domain.methods; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import ru.kayashov.bar.bot.domain.Bot; - -@Getter -@AllArgsConstructor -public abstract class AbstractMethod { - private Long chatId; - - public abstract void execute(Bot nBot); -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractSendKeyboardMessage.java b/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractSendKeyboardMessage.java deleted file mode 100644 index e35cfc5..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractSendKeyboardMessage.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.kayashov.bar.bot.domain.methods; - -import lombok.Builder; -import lombok.Getter; -import ru.kayashov.bar.bot.domain.Bot; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboard; - -@Getter -public class AbstractSendKeyboardMessage extends AbstractMethod { - String message; - AbstractKeyboard keyboard; - @Builder - public AbstractSendKeyboardMessage(Long chatId, String message, AbstractKeyboard keyboard) { - super(chatId); - this.keyboard = keyboard; - this.message = message; - } - - @Override - public void execute(Bot nBot) { - nBot.sendKeyboardMessage(this); - } -} \ No newline at end of file diff --git a/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractSendMessage.java b/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractSendMessage.java deleted file mode 100644 index 1fc0ecf..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/methods/AbstractSendMessage.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.kayashov.bar.bot.domain.methods; - -import lombok.Builder; -import lombok.Getter; -import ru.kayashov.bar.bot.domain.Bot; - -@Getter -public class AbstractSendMessage extends AbstractMethod { - String message; - @Builder - public AbstractSendMessage(Long chatId, String message) { - super(chatId); - this.message = message; - } - - public void execute(Bot bot) { - bot.sendMessage(this); - } -} \ No newline at end of file diff --git a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractCallbackQuery.java b/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractCallbackQuery.java deleted file mode 100644 index 639550c..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractCallbackQuery.java +++ /dev/null @@ -1,11 +0,0 @@ -package ru.kayashov.bar.bot.domain.model; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class AbstractCallbackQuery { - private AbstractMessage message; - private String data; -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractChat.java b/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractChat.java deleted file mode 100644 index 87eb481..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractChat.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.kayashov.bar.bot.domain.model; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class AbstractChat { - private Long id; - private String firstName; - private String lastName; -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractKeyboard.java b/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractKeyboard.java deleted file mode 100644 index 267bcb0..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractKeyboard.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.kayashov.bar.bot.domain.model; - -import lombok.Builder; -import lombok.Data; - -import java.util.List; - -@Data -@Builder -public class AbstractKeyboard { - private List> keyboard; - private String inputFieldPlaceholder; - private Boolean resizeKeyboard; - private Boolean selective; - private Boolean oneTimeKeyboard; -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractKeyboardButton.java b/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractKeyboardButton.java deleted file mode 100644 index 0b9379d..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractKeyboardButton.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.kayashov.bar.bot.domain.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class AbstractKeyboardButton { - private String text; - private String callbackData; - - public AbstractKeyboardButton(String text) { - this.text = text; - } -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractMessage.java b/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractMessage.java deleted file mode 100644 index c82065f..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractMessage.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.kayashov.bar.bot.domain.model; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class AbstractMessage { - private Long chatId; - private Integer messageId; - private String message; - private AbstractChat chat; -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractUpdate.java b/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractUpdate.java deleted file mode 100644 index f0c56d3..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/model/AbstractUpdate.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.kayashov.bar.bot.domain.model; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class AbstractUpdate { - private AbstractCallbackQuery callbackQuery; - private AbstractMessage message; - -} diff --git a/src/main/java/ru/kayashov/bar/bot/domain/utils/MethodUtils.java b/src/main/java/ru/kayashov/bar/bot/domain/utils/MethodUtils.java deleted file mode 100644 index 9783d17..0000000 --- a/src/main/java/ru/kayashov/bar/bot/domain/utils/MethodUtils.java +++ /dev/null @@ -1,40 +0,0 @@ -package ru.kayashov.bar.bot.domain.utils; - -import ru.kayashov.bar.bot.domain.methods.AbstractDeleteMessage; -import ru.kayashov.bar.bot.domain.methods.AbstractInlineKeyboard; -import ru.kayashov.bar.bot.domain.methods.AbstractSendKeyboardMessage; -import ru.kayashov.bar.bot.domain.methods.AbstractSendMessage; -import ru.kayashov.bar.bot.domain.model.AbstractKeyboard; - -public class MethodUtils { - - public static AbstractDeleteMessage deleteMessage(Long chatId, Integer messageId) { - return AbstractDeleteMessage.builder() - .messageId(messageId) - .chatId(chatId) - .build(); - } - - public static AbstractSendMessage sendMessage(Long chatId, String message) { - return AbstractSendMessage.builder() - .message(message) - .chatId(chatId) - .build(); - } - - public static AbstractSendKeyboardMessage sendKeyboardMessage(Long chatId, String message, AbstractKeyboard keyboard) { - return AbstractSendKeyboardMessage.builder() - .keyboard(keyboard) - .message(message) - .chatId(chatId) - .build(); - } - - public static AbstractInlineKeyboard sendInlineKeyboard(Long chatId, String message, AbstractKeyboard keyboard) { - return AbstractInlineKeyboard.builder() - .keyboard(keyboard) - .message(message) - .chatId(chatId) - .build(); - } -} diff --git a/src/main/java/ru/kayashov/bar/config/KafkaConfig.java b/src/main/java/ru/kayashov/bar/config/KafkaConfig.java new file mode 100644 index 0000000..4d06a56 --- /dev/null +++ b/src/main/java/ru/kayashov/bar/config/KafkaConfig.java @@ -0,0 +1,39 @@ +package ru.kayashov.bar.config; + +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.common.serialization.StringSerializer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.core.ProducerFactory; +import ru.kayashov.bar.model.AbstractSendMessage; +import ru.kayashov.bar.service.AbstractMessageSerializer; + +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class KafkaConfig { + + @Value("${spring.kafka.bootstrap-servers}") + private String bootstrapServers; + + @Bean + public ProducerFactory producerFactory() { + Map configProps = new HashMap<>(); + configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); + configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, AbstractMessageSerializer.class); + configProps.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, 31457280); + return new DefaultKafkaProducerFactory<>(configProps); + } + + @Bean + public KafkaTemplate kafkaTemplate(ProducerFactory factory) { + KafkaTemplate broker = new KafkaTemplate<>(factory); + broker.flush(); + return broker; + } +} diff --git a/src/main/java/ru/kayashov/bar/controller/OrderController.java b/src/main/java/ru/kayashov/bar/controller/OrderController.java index 48100b4..6cf3b11 100644 --- a/src/main/java/ru/kayashov/bar/controller/OrderController.java +++ b/src/main/java/ru/kayashov/bar/controller/OrderController.java @@ -2,6 +2,7 @@ package ru.kayashov.bar.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.DeleteMapping; @@ -11,13 +12,13 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import ru.kayashov.bar.bot.domain.Bot; -import ru.kayashov.bar.bot.domain.methods.AbstractSendMessage; import ru.kayashov.bar.controller.dto.OrderResponseDto; +import ru.kayashov.bar.model.AbstractSendMessage; import ru.kayashov.bar.model.entity.BarEntity; import ru.kayashov.bar.model.entity.BarResident; import ru.kayashov.bar.model.entity.SessionEntity; import ru.kayashov.bar.model.entity.Visitor; +import ru.kayashov.bar.service.KafkaSender; import ru.kayashov.bar.service.OrderService; import ru.kayashov.bar.service.VisitorService; @@ -32,28 +33,31 @@ import java.util.concurrent.ExecutorService; @RequiredArgsConstructor public class OrderController { + @Value("${kafka-topic") + private String topic; + private final ExecutorService executor; private final OrderService orderService; - private final Bot bot; + private final KafkaSender kafkaSender; private final VisitorService visitorService; @PostMapping public void pay(@RequestParam Long cocktail) { Long id = ((Visitor) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getId(); List messages = orderService.createOrder(id, cocktail); - executor.submit(() -> messages.forEach(bot::sendMessage)); + executor.submit(() -> messages.forEach(m -> kafkaSender.send(topic, m))); } @DeleteMapping public void cancelOrder(@RequestParam Long id) { AbstractSendMessage message = orderService.updateOrder(false, id); - executor.submit(() -> bot.sendMessage(message)); + executor.submit(() -> kafkaSender.send(topic, message)); } @PutMapping public void doneOrder(@RequestParam Long id) { AbstractSendMessage message = orderService.updateOrder(true, id); - executor.submit(() -> bot.sendMessage(message)); + executor.submit(() -> kafkaSender.send(topic, message)); } @GetMapping diff --git a/src/main/java/ru/kayashov/bar/model/AbstractSendMessage.java b/src/main/java/ru/kayashov/bar/model/AbstractSendMessage.java new file mode 100644 index 0000000..e498031 --- /dev/null +++ b/src/main/java/ru/kayashov/bar/model/AbstractSendMessage.java @@ -0,0 +1,11 @@ +package ru.kayashov.bar.model; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class AbstractSendMessage { + private Long chatId; + private String message; +} \ No newline at end of file diff --git a/src/main/java/ru/kayashov/bar/service/AbstractMessageSerializer.java b/src/main/java/ru/kayashov/bar/service/AbstractMessageSerializer.java new file mode 100644 index 0000000..c602dc3 --- /dev/null +++ b/src/main/java/ru/kayashov/bar/service/AbstractMessageSerializer.java @@ -0,0 +1,42 @@ +package ru.kayashov.bar.service; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.common.errors.SerializationException; +import org.apache.kafka.common.header.Headers; +import org.apache.kafka.common.serialization.Serializer; +import ru.kayashov.bar.model.AbstractSendMessage; + +import java.util.Map; + +@Slf4j +public class AbstractMessageSerializer implements Serializer { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public void configure(Map configs, boolean isKey) { + } + + @Override + public byte[] serialize(String topic, AbstractSendMessage data) { + try { + if (data == null){ + log.warn("Отсутствует объект для отправки сообщения"); + return null; + } + return objectMapper.writeValueAsBytes(data); + } catch (Exception e) { + throw new SerializationException("Ошибка сериализации объекта"); + } + } + + @Override + public byte[] serialize(String topic, Headers headers, AbstractSendMessage data) { + return Serializer.super.serialize(topic, headers, data); + } + + @Override + public void close() { + } +} diff --git a/src/main/java/ru/kayashov/bar/service/KafkaSender.java b/src/main/java/ru/kayashov/bar/service/KafkaSender.java new file mode 100644 index 0000000..0decc24 --- /dev/null +++ b/src/main/java/ru/kayashov/bar/service/KafkaSender.java @@ -0,0 +1,28 @@ +package ru.kayashov.bar.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Component; +import ru.kayashov.bar.model.AbstractSendMessage; + +import java.util.Arrays; + +@Slf4j +@Component +@RequiredArgsConstructor +public class KafkaSender { + + private final KafkaTemplate kafkaTemplate; + + public String send(String topic, AbstractSendMessage message) { + try { + kafkaTemplate.send(topic, message); + log.info("отправлено сообщение в топик {}, сообщение {}", topic, message.getMessage()); + return null; + } catch (Exception e) { + log.error(e.getMessage(), Arrays.toString(e.getStackTrace())); + return e.getMessage(); + } + } +} diff --git a/src/main/java/ru/kayashov/bar/service/OrderService.java b/src/main/java/ru/kayashov/bar/service/OrderService.java index f067e53..53b5f52 100644 --- a/src/main/java/ru/kayashov/bar/service/OrderService.java +++ b/src/main/java/ru/kayashov/bar/service/OrderService.java @@ -2,7 +2,7 @@ package ru.kayashov.bar.service; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import ru.kayashov.bar.bot.domain.methods.AbstractSendMessage; +import ru.kayashov.bar.model.AbstractSendMessage; import ru.kayashov.bar.model.entity.BarEntity; import ru.kayashov.bar.model.entity.BarResident; import ru.kayashov.bar.model.entity.CocktailEntity; @@ -11,7 +11,6 @@ import ru.kayashov.bar.model.entity.SessionEntity; import ru.kayashov.bar.model.entity.Visitor; import ru.kayashov.bar.repository.CocktailRepository; import ru.kayashov.bar.repository.OrdersRepository; -import ru.kayashov.bar.repository.VisitorsRepository; import java.time.LocalDateTime; import java.util.List; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9335316..86cb4a6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,6 @@ spring.application.name=myBar +spring.kafka.bootstrap-servers=192.168.1.100:29092 +kafka-topic=my-bar-bot-message cocktail.photo.path=${COCKTAIL_PHOTO_PATH:/mnt/sdb1/my-bar-front/build/assets/cocktails} From 4ca95f65a323892737076fe461a874e039c96664 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Thu, 24 Apr 2025 16:08:34 +0400 Subject: [PATCH 02/31] =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D1=81i-cd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 18 ++++++++++++++++++ Dockerfile | 10 ++++------ Dockerfile-handmade | 12 ++++++++++++ 3 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 .gitlab-ci.yml create mode 100644 Dockerfile-handmade diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..65bb350 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,18 @@ +stages: + - build + - docker + +maven-build: + image: maven:3.6.3-openjdk-17-slim + stage: build + script: "mvn -am clean package" + artifacts: + paths: + - target/*.jar + +docker-build: + stage: docker + script: + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN http://192.168.1.100:9093 + - docker build -t 192.168.1.100:9093/kayashov/my-bar . + - docker push 192.168.1.100:9093/kayashov/my-bar \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 7c61fda..f01a0c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,4 @@ -# Создание образа keenetic-vpn -FROM openjdk:17-jdk-slim as my-bar -COPY . /target/MyBar-1.0.0.jar /data/app/ -WORKDIR /data/app -EXPOSE 8080 -ENTRYPOINT "java" $JAVA_OPTS "-jar" "/data/app/MyBar-1.0.0.jar" \ No newline at end of file +FROM openjdk:17-jdk-slim +VOLUME /tmp +ADD /target/*.jar my-bar.jar +ENTRYPOINT "java", "-jar", "/my-bar.jar" \ No newline at end of file diff --git a/Dockerfile-handmade b/Dockerfile-handmade new file mode 100644 index 0000000..77c23eb --- /dev/null +++ b/Dockerfile-handmade @@ -0,0 +1,12 @@ +# Создание рабочей среды для сборки +FROM maven:3.6.3-openjdk-17-slim as build +RUN mkdir -p /build/source +COPY . /build/source +WORKDIR /build/source +RUN mvn -pl myBar -am clean package +# Создание образа my-bar +FROM openjdk:17-jdk-slim as my-bar +COPY --from=build /build/source/myBar/target/*jar /data/app/my-bar.jar +WORKDIR /data/app +EXPOSE 8080 +ENTRYPOINT "java" $JAVA_OPTS "-jar" "/data/app/my-bar.jar" \ No newline at end of file From 0df61f686a7471218d5373b3b44e653bac8367e7 Mon Sep 17 00:00:00 2001 From: Administrator Date: Thu, 24 Apr 2025 12:14:54 +0000 Subject: [PATCH 03/31] Update .gitlab-ci.yml file --- .gitlab-ci.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..252f542 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,36 @@ +# This file is a template, and might need editing before it works on your project. +# This is a sample GitLab CI/CD configuration file that should run without any modifications. +# It demonstrates a basic 3 stage CI/CD pipeline. Instead of real tests or scripts, +# it uses echo commands to simulate the pipeline execution. +# +# A pipeline is composed of independent jobs that run scripts, grouped into stages. +# Stages run in sequential order, but jobs within stages run in parallel. +# +# For more information, see: https://docs.gitlab.com/ee/ci/yaml/index.html#stages +# +# You can copy and paste this template into a new `.gitlab-ci.yml` file. +# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword. +# +# To contribute improvements to CI/CD templates, please follow the Development guide at: +# https://docs.gitlab.com/ee/development/cicd/templates.html +# This specific template is located at: +# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml + +stages: # List of stages for jobs, and their order of execution + - build + - deploy + +maven-build: + image: maven:3.6.3-openjdk-17-slim + stage: build + script: "mvn -am clean package" + artifacts: + paths: + - target/*.jar + +docker-build: + stage: docker + script: + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN http://192.168.1.100:9093 + - docker build -t 192.168.1.100:9093/kayashov/my-bar . + - docker push 192.168.1.100:9093/kayashov/my-bar \ No newline at end of file From 042e4be7e9b05a720f69b84b80962dc1dbe63142 Mon Sep 17 00:00:00 2001 From: Administrator Date: Thu, 24 Apr 2025 12:16:36 +0000 Subject: [PATCH 04/31] Update .gitlab-ci.yml file --- .gitlab-ci.yml | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 252f542..65bb350 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,24 +1,6 @@ -# This file is a template, and might need editing before it works on your project. -# This is a sample GitLab CI/CD configuration file that should run without any modifications. -# It demonstrates a basic 3 stage CI/CD pipeline. Instead of real tests or scripts, -# it uses echo commands to simulate the pipeline execution. -# -# A pipeline is composed of independent jobs that run scripts, grouped into stages. -# Stages run in sequential order, but jobs within stages run in parallel. -# -# For more information, see: https://docs.gitlab.com/ee/ci/yaml/index.html#stages -# -# You can copy and paste this template into a new `.gitlab-ci.yml` file. -# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword. -# -# To contribute improvements to CI/CD templates, please follow the Development guide at: -# https://docs.gitlab.com/ee/development/cicd/templates.html -# This specific template is located at: -# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Getting-Started.gitlab-ci.yml - -stages: # List of stages for jobs, and their order of execution +stages: - build - - deploy + - docker maven-build: image: maven:3.6.3-openjdk-17-slim From 02ccfb8850442a2c51bbbfd8032a890c67383850 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Thu, 24 Apr 2025 17:24:30 +0400 Subject: [PATCH 05/31] =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D1=81i-cd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 65bb350..9a465ff 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,10 +9,14 @@ maven-build: artifacts: paths: - target/*.jar + only: + - back_release docker-build: stage: docker script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN http://192.168.1.100:9093 - docker build -t 192.168.1.100:9093/kayashov/my-bar . - - docker push 192.168.1.100:9093/kayashov/my-bar \ No newline at end of file + - docker push 192.168.1.100:9093/kayashov/my-bar + only: + - back_release \ No newline at end of file From cd1a385eabc1a106f2dc8b968fd6c7c3f36572e8 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Thu, 24 Apr 2025 17:40:51 +0400 Subject: [PATCH 06/31] =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D1=81i-cd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9a465ff..03f37de 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,22 +1,22 @@ +image: maven:3.6.3-openjdk-17-slim + stages: - build - - docker + - package -maven-build: - image: maven:3.6.3-openjdk-17-slim +build-job: stage: build - script: "mvn -am clean package" - artifacts: - paths: - - target/*.jar + script: + - echo "Compiling the code..." + - "mvn compile" + - echo "Compile complete only: - back_release -docker-build: - stage: docker +package-job: + stage: package script: - - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN http://192.168.1.100:9093 - - docker build -t 192.168.1.100:9093/kayashov/my-bar . - - docker push 192.168.1.100:9093/kayashov/my-bar + - echo "Package the code" + - "mwn package" only: - back_release \ No newline at end of file From 3a516697fb6e4ad1623363aec1c25f4a565d3a87 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Thu, 24 Apr 2025 17:55:39 +0400 Subject: [PATCH 07/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 15 +++++---------- Dockerfile | 16 ++++++++++++---- Dockerfile-handmade | 12 ------------ Dockerfile-isNotWork | 4 ++++ 4 files changed, 21 insertions(+), 26 deletions(-) delete mode 100644 Dockerfile-handmade create mode 100644 Dockerfile-isNotWork diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 03f37de..87bd0fa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,21 +2,16 @@ image: maven:3.6.3-openjdk-17-slim stages: - build - - package build-job: stage: build script: - echo "Compiling the code..." - - "mvn compile" + - "sudo docker container stop my-bar" + - "sudo docker container rm my-bar" + - "sudo docker image rm my-bar:4.3.0" + - "sudo docker build -t my-bar ." + - "sudo docker run --name my-bar --restart=always -p 8091:8080 -d my-bar" - echo "Compile complete - only: - - back_release - -package-job: - stage: package - script: - - echo "Package the code" - - "mwn package" only: - back_release \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index f01a0c4..77c23eb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,12 @@ -FROM openjdk:17-jdk-slim -VOLUME /tmp -ADD /target/*.jar my-bar.jar -ENTRYPOINT "java", "-jar", "/my-bar.jar" \ No newline at end of file +# Создание рабочей среды для сборки +FROM maven:3.6.3-openjdk-17-slim as build +RUN mkdir -p /build/source +COPY . /build/source +WORKDIR /build/source +RUN mvn -pl myBar -am clean package +# Создание образа my-bar +FROM openjdk:17-jdk-slim as my-bar +COPY --from=build /build/source/myBar/target/*jar /data/app/my-bar.jar +WORKDIR /data/app +EXPOSE 8080 +ENTRYPOINT "java" $JAVA_OPTS "-jar" "/data/app/my-bar.jar" \ No newline at end of file diff --git a/Dockerfile-handmade b/Dockerfile-handmade deleted file mode 100644 index 77c23eb..0000000 --- a/Dockerfile-handmade +++ /dev/null @@ -1,12 +0,0 @@ -# Создание рабочей среды для сборки -FROM maven:3.6.3-openjdk-17-slim as build -RUN mkdir -p /build/source -COPY . /build/source -WORKDIR /build/source -RUN mvn -pl myBar -am clean package -# Создание образа my-bar -FROM openjdk:17-jdk-slim as my-bar -COPY --from=build /build/source/myBar/target/*jar /data/app/my-bar.jar -WORKDIR /data/app -EXPOSE 8080 -ENTRYPOINT "java" $JAVA_OPTS "-jar" "/data/app/my-bar.jar" \ No newline at end of file diff --git a/Dockerfile-isNotWork b/Dockerfile-isNotWork new file mode 100644 index 0000000..f01a0c4 --- /dev/null +++ b/Dockerfile-isNotWork @@ -0,0 +1,4 @@ +FROM openjdk:17-jdk-slim +VOLUME /tmp +ADD /target/*.jar my-bar.jar +ENTRYPOINT "java", "-jar", "/my-bar.jar" \ No newline at end of file From e6e609b4eb1c576bbd797965de3f2533521e114c Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Thu, 24 Apr 2025 22:35:13 +0400 Subject: [PATCH 08/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 87bd0fa..8dc8fa8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,11 +7,11 @@ build-job: stage: build script: - echo "Compiling the code..." - - "sudo docker container stop my-bar" - - "sudo docker container rm my-bar" - - "sudo docker image rm my-bar:4.3.0" - - "sudo docker build -t my-bar ." - - "sudo docker run --name my-bar --restart=always -p 8091:8080 -d my-bar" + - "docker container stop my-bar" + - "docker container rm my-bar" + - "docker image rm my-bar:4.3.0" + - "docker build -t my-bar ." + - "docker run --name my-bar --restart=always -p 8091:8080 -d my-bar" - echo "Compile complete only: - back_release \ No newline at end of file From dd0d966e51ccc92f50565916c502e574a8fe7a59 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 00:50:26 +0400 Subject: [PATCH 09/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 20 +++++++++++++++++++- Dockerfile | 16 ++++------------ Dockerfile-isNotWork | 4 ---- Dockerfile-old | 12 ++++++++++++ 4 files changed, 35 insertions(+), 17 deletions(-) delete mode 100644 Dockerfile-isNotWork create mode 100644 Dockerfile-old diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8dc8fa8..ef23685 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,6 +2,24 @@ image: maven:3.6.3-openjdk-17-slim stages: - build + - docker + +maven-build: + image: maven:3.6.3-openjdk-17-slim + stage: build + script: "mvn -am clean package" + only: + - back_release + artifacts: + paths: + - target/*.jar + +docker-build: + stage: docker + script: + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN http://192.168.1.100:9093 + - docker build -t gitlab.kayashov.keenetic.pro/kayashov/my-bar . + - docker push gitlab.kayashov.keenetic.pro/kayashov/my-bar build-job: stage: build @@ -14,4 +32,4 @@ build-job: - "docker run --name my-bar --restart=always -p 8091:8080 -d my-bar" - echo "Compile complete only: - - back_release \ No newline at end of file + - master \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 77c23eb..f01a0c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,4 @@ -# Создание рабочей среды для сборки -FROM maven:3.6.3-openjdk-17-slim as build -RUN mkdir -p /build/source -COPY . /build/source -WORKDIR /build/source -RUN mvn -pl myBar -am clean package -# Создание образа my-bar -FROM openjdk:17-jdk-slim as my-bar -COPY --from=build /build/source/myBar/target/*jar /data/app/my-bar.jar -WORKDIR /data/app -EXPOSE 8080 -ENTRYPOINT "java" $JAVA_OPTS "-jar" "/data/app/my-bar.jar" \ No newline at end of file +FROM openjdk:17-jdk-slim +VOLUME /tmp +ADD /target/*.jar my-bar.jar +ENTRYPOINT "java", "-jar", "/my-bar.jar" \ No newline at end of file diff --git a/Dockerfile-isNotWork b/Dockerfile-isNotWork deleted file mode 100644 index f01a0c4..0000000 --- a/Dockerfile-isNotWork +++ /dev/null @@ -1,4 +0,0 @@ -FROM openjdk:17-jdk-slim -VOLUME /tmp -ADD /target/*.jar my-bar.jar -ENTRYPOINT "java", "-jar", "/my-bar.jar" \ No newline at end of file diff --git a/Dockerfile-old b/Dockerfile-old new file mode 100644 index 0000000..77c23eb --- /dev/null +++ b/Dockerfile-old @@ -0,0 +1,12 @@ +# Создание рабочей среды для сборки +FROM maven:3.6.3-openjdk-17-slim as build +RUN mkdir -p /build/source +COPY . /build/source +WORKDIR /build/source +RUN mvn -pl myBar -am clean package +# Создание образа my-bar +FROM openjdk:17-jdk-slim as my-bar +COPY --from=build /build/source/myBar/target/*jar /data/app/my-bar.jar +WORKDIR /data/app +EXPOSE 8080 +ENTRYPOINT "java" $JAVA_OPTS "-jar" "/data/app/my-bar.jar" \ No newline at end of file From d99507b9526573ed7384b09ff8f0ded1571f36ce Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 01:00:17 +0400 Subject: [PATCH 10/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ef23685..3b0b685 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,13 +9,15 @@ maven-build: stage: build script: "mvn -am clean package" only: - - back_release + - master artifacts: paths: - target/*.jar docker-build: stage: docker + only: + - master script: - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN http://192.168.1.100:9093 - docker build -t gitlab.kayashov.keenetic.pro/kayashov/my-bar . @@ -25,11 +27,8 @@ build-job: stage: build script: - echo "Compiling the code..." - - "docker container stop my-bar" - - "docker container rm my-bar" - - "docker image rm my-bar:4.3.0" - - "docker build -t my-bar ." - - "docker run --name my-bar --restart=always -p 8091:8080 -d my-bar" + - docker container stop my-bar + - docker container rm my-bar - echo "Compile complete only: - - master \ No newline at end of file + - back_release \ No newline at end of file From 06d81f9e468dbc95b9283bdf0f5cd45790dc72fe Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 01:07:55 +0400 Subject: [PATCH 11/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3b0b685..0990952 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,7 @@ -image: maven:3.6.3-openjdk-17-slim +image: gitlab/dind + +services: + - docker:dind stages: - build From 128591de636f9a7ea8ec32f1cb123605208be27e Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 01:12:11 +0400 Subject: [PATCH 12/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=206?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0990952..3eb28a4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -30,7 +30,7 @@ build-job: stage: build script: - echo "Compiling the code..." - - docker container stop my-bar + - docker stop my-bar - docker container rm my-bar - echo "Compile complete only: From 8250647c793b50f6ea95f20e64e2b86f987f63be Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 01:16:43 +0400 Subject: [PATCH 13/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=207?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3eb28a4..f23295a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -31,7 +31,9 @@ build-job: script: - echo "Compiling the code..." - docker stop my-bar - - docker container rm my-bar + - docker rm my-bar + - docker build -t gitlab.kayashov.keenetic.pro/kayashov/my-bar . + - docker run --name my-bar --restart=always -p 8091:8080 -d my-bar - echo "Compile complete only: - back_release \ No newline at end of file From 720f9484a8e04d5f59c3f18bf8522f1fc424cce6 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 01:21:02 +0400 Subject: [PATCH 14/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f23295a..36b947c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,15 +4,26 @@ services: - docker:dind stages: + - stop-old - build - docker + +stop-job: + stage: stop-old + only: + - back_release + script: + - echo "Stop old container..." + - docker stop my-bar + - docker rm my-bar + maven-build: image: maven:3.6.3-openjdk-17-slim stage: build script: "mvn -am clean package" only: - - master + - back_release artifacts: paths: - target/*.jar From 6af770bb7f5d6d428d582b4c49993aaa420b6706 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 01:22:58 +0400 Subject: [PATCH 15/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=209?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 36b947c..59d5df7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,7 +12,7 @@ stages: stop-job: stage: stop-old only: - - back_release + - master script: - echo "Stop old container..." - docker stop my-bar @@ -38,7 +38,7 @@ docker-build: - docker push gitlab.kayashov.keenetic.pro/kayashov/my-bar build-job: - stage: build + stage: docker script: - echo "Compiling the code..." - docker stop my-bar From 1b468593480a72e676801118370e1b0737cd79bc Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 01:28:45 +0400 Subject: [PATCH 16/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=2010?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 59d5df7..7277d58 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,10 +41,7 @@ build-job: stage: docker script: - echo "Compiling the code..." - - docker stop my-bar - - docker rm my-bar - - docker build -t gitlab.kayashov.keenetic.pro/kayashov/my-bar . - - docker run --name my-bar --restart=always -p 8091:8080 -d my-bar + - docker run --name my-bar --restart=always -p 8091:8080 -d gitlab.kayashov.keenetic.pro/kayashov/my-bar - echo "Compile complete only: - back_release \ No newline at end of file From 2cdcf678942ff4f67b22294e2e9f3e139560b164 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 01:36:36 +0400 Subject: [PATCH 17/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=2011?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7277d58..49ae2d6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,6 +41,7 @@ build-job: stage: docker script: - echo "Compiling the code..." + - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN https://gitlab.kayashov.keenetic.pro - docker run --name my-bar --restart=always -p 8091:8080 -d gitlab.kayashov.keenetic.pro/kayashov/my-bar - echo "Compile complete only: From ef07ac010510f03496ff9a0f80fbbe09c89fa865 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 11:29:18 +0400 Subject: [PATCH 18/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=2012?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 49ae2d6..9d17050 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,7 +6,7 @@ services: stages: - stop-old - build - - docker + - deploy stop-job: @@ -29,20 +29,16 @@ maven-build: - target/*.jar docker-build: - stage: docker + stage: build only: - - master + - back_release script: - - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN http://192.168.1.100:9093 - - docker build -t gitlab.kayashov.keenetic.pro/kayashov/my-bar . - - docker push gitlab.kayashov.keenetic.pro/kayashov/my-bar + - docker build -t my-bar . -build-job: - stage: docker +deploy-job: + stage: deploy script: - - echo "Compiling the code..." - - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN https://gitlab.kayashov.keenetic.pro - - docker run --name my-bar --restart=always -p 8091:8080 -d gitlab.kayashov.keenetic.pro/kayashov/my-bar - - echo "Compile complete + - docker run --name my-bar --restart=always -p 8091:8080 -d my-bar + - echo "Deploy complete" only: - back_release \ No newline at end of file From ae36992a515f5d528cd81e0d4e1061f45dcae889 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 11:30:31 +0400 Subject: [PATCH 19/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=2013?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9d17050..e84489d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,7 +5,8 @@ services: stages: - stop-old - - build + - build app + - build docker - deploy @@ -20,7 +21,7 @@ stop-job: maven-build: image: maven:3.6.3-openjdk-17-slim - stage: build + stage: build app script: "mvn -am clean package" only: - back_release @@ -29,7 +30,7 @@ maven-build: - target/*.jar docker-build: - stage: build + stage: build docker only: - back_release script: From c7252cdb0298d1d7be0765bd21e1710f391f3972 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 11:42:05 +0400 Subject: [PATCH 20/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=2014?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 4 ++-- Dockerfile | 16 ++++++++++++---- Dockerfile-old | 12 ------------ Dockerfile-omn | 4 ++++ 4 files changed, 18 insertions(+), 18 deletions(-) delete mode 100644 Dockerfile-old create mode 100644 Dockerfile-omn diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e84489d..4e1dc2d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,7 +13,7 @@ stages: stop-job: stage: stop-old only: - - master + - back_release script: - echo "Stop old container..." - docker stop my-bar @@ -24,7 +24,7 @@ maven-build: stage: build app script: "mvn -am clean package" only: - - back_release + - master artifacts: paths: - target/*.jar diff --git a/Dockerfile b/Dockerfile index f01a0c4..77c23eb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,12 @@ -FROM openjdk:17-jdk-slim -VOLUME /tmp -ADD /target/*.jar my-bar.jar -ENTRYPOINT "java", "-jar", "/my-bar.jar" \ No newline at end of file +# Создание рабочей среды для сборки +FROM maven:3.6.3-openjdk-17-slim as build +RUN mkdir -p /build/source +COPY . /build/source +WORKDIR /build/source +RUN mvn -pl myBar -am clean package +# Создание образа my-bar +FROM openjdk:17-jdk-slim as my-bar +COPY --from=build /build/source/myBar/target/*jar /data/app/my-bar.jar +WORKDIR /data/app +EXPOSE 8080 +ENTRYPOINT "java" $JAVA_OPTS "-jar" "/data/app/my-bar.jar" \ No newline at end of file diff --git a/Dockerfile-old b/Dockerfile-old deleted file mode 100644 index 77c23eb..0000000 --- a/Dockerfile-old +++ /dev/null @@ -1,12 +0,0 @@ -# Создание рабочей среды для сборки -FROM maven:3.6.3-openjdk-17-slim as build -RUN mkdir -p /build/source -COPY . /build/source -WORKDIR /build/source -RUN mvn -pl myBar -am clean package -# Создание образа my-bar -FROM openjdk:17-jdk-slim as my-bar -COPY --from=build /build/source/myBar/target/*jar /data/app/my-bar.jar -WORKDIR /data/app -EXPOSE 8080 -ENTRYPOINT "java" $JAVA_OPTS "-jar" "/data/app/my-bar.jar" \ No newline at end of file diff --git a/Dockerfile-omn b/Dockerfile-omn new file mode 100644 index 0000000..f01a0c4 --- /dev/null +++ b/Dockerfile-omn @@ -0,0 +1,4 @@ +FROM openjdk:17-jdk-slim +VOLUME /tmp +ADD /target/*.jar my-bar.jar +ENTRYPOINT "java", "-jar", "/my-bar.jar" \ No newline at end of file From 4b31c408f0c78e28672cc3bba65df67971f88672 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 11:45:41 +0400 Subject: [PATCH 21/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=2015?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 2 +- Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4e1dc2d..cf05e47 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,7 +13,7 @@ stages: stop-job: stage: stop-old only: - - back_release + - master script: - echo "Stop old container..." - docker stop my-bar diff --git a/Dockerfile b/Dockerfile index 77c23eb..59f09e1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,7 @@ FROM maven:3.6.3-openjdk-17-slim as build RUN mkdir -p /build/source COPY . /build/source WORKDIR /build/source -RUN mvn -pl myBar -am clean package +RUN mvn -am clean package # Создание образа my-bar FROM openjdk:17-jdk-slim as my-bar COPY --from=build /build/source/myBar/target/*jar /data/app/my-bar.jar From 5dea9c1b0bb1203346187956a2dc0e6a4881399c Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 11:58:55 +0400 Subject: [PATCH 22/31] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81i-cd=2016?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 59f09e1..4d9bedd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ WORKDIR /build/source RUN mvn -am clean package # Создание образа my-bar FROM openjdk:17-jdk-slim as my-bar -COPY --from=build /build/source/myBar/target/*jar /data/app/my-bar.jar +COPY --from=build /build/source/target/*.jar /data/app/my-bar.jar WORKDIR /data/app EXPOSE 8080 ENTRYPOINT "java" $JAVA_OPTS "-jar" "/data/app/my-bar.jar" \ No newline at end of file From 5902cc2da4b5774f288d413d60d3a589ac7afde5 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 12:25:20 +0400 Subject: [PATCH 23/31] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8=20=D0=BA=D0=B0=D1=84=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 37 +++++++------------------------------ pom.xml | 10 +++++----- 2 files changed, 12 insertions(+), 35 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cf05e47..89c2d1d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,42 +4,19 @@ services: - docker:dind stages: - - stop-old - - build app - - build docker - - deploy - + - deploy front + - deploy back stop-job: - stage: stop-old + stage: deploy back only: - master script: - - echo "Stop old container..." + - echo "Остановка старого контейнера" - docker stop my-bar - docker rm my-bar - -maven-build: - image: maven:3.6.3-openjdk-17-slim - stage: build app - script: "mvn -am clean package" - only: - - master - artifacts: - paths: - - target/*.jar - -docker-build: - stage: build docker - only: - - back_release - script: + - echo "Сборка образа докер" - docker build -t my-bar . - -deploy-job: - stage: deploy - script: + - echo "Запуск докер контейнера" - docker run --name my-bar --restart=always -p 8091:8080 -d my-bar - - echo "Deploy complete" - only: - - back_release \ No newline at end of file + - echo "Деплой завершен" \ No newline at end of file diff --git a/pom.xml b/pom.xml index 63917e3..e009fba 100644 --- a/pom.xml +++ b/pom.xml @@ -89,11 +89,11 @@ lombok provided - - org.springframework.kafka - spring-kafka - 3.2.4 - + + + + + From 10d0dc98506e666d97226196fe2c65d264d69e2c Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 12:26:28 +0400 Subject: [PATCH 24/31] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8=20=D0=BA=D0=B0=D1=84=D0=BA?= =?UTF-8?q?=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 89c2d1d..809e5ee 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,7 +10,7 @@ stages: stop-job: stage: deploy back only: - - master + - back_release script: - echo "Остановка старого контейнера" - docker stop my-bar From 8843b6d6c8716f706a141bb4707b08ade0d59640 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Fri, 25 Apr 2025 12:33:04 +0400 Subject: [PATCH 25/31] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D1=82=D0=BE=D0=BF=D0=B8=D0=BA=D0=B0=20=D0=BA=D0=B0=D1=84=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ru/kayashov/bar/controller/OrderController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/kayashov/bar/controller/OrderController.java b/src/main/java/ru/kayashov/bar/controller/OrderController.java index 6cf3b11..06b9a9d 100644 --- a/src/main/java/ru/kayashov/bar/controller/OrderController.java +++ b/src/main/java/ru/kayashov/bar/controller/OrderController.java @@ -33,7 +33,7 @@ import java.util.concurrent.ExecutorService; @RequiredArgsConstructor public class OrderController { - @Value("${kafka-topic") + @Value("${kafka-topic}") private String topic; private final ExecutorService executor; From 2c9beac0ca0bb0412895891ecdb3f0dc71f0f2c5 Mon Sep 17 00:00:00 2001 From: Administrator Date: Sun, 27 Apr 2025 10:04:48 +0000 Subject: [PATCH 26/31] =?UTF-8?q?#3=20-=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20NPE=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D1=84?= =?UTF-8?q?=D0=BE=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 18 ++++- front/package.json | 2 +- front/src/app/App.js | 12 ++- .../pages/cocktails/CocktailMenuBarPage.js | 15 ++-- .../pages/cocktails/CocktailsPageContent.js | 76 ++++--------------- .../app/pages/ingredients/IngredientsPage.js | 13 +--- .../Ingredients/IngredientInfoModal.js | 48 +++++++++++- front/src/components/cocktails/Cocktail.js | 35 +-------- .../cocktails/CocktailDescription.js | 36 +++++++++ .../components/cocktails/CocktailInfoModal.js | 33 +++----- front/src/components/orders/OrderModal.js | 16 +++- front/src/context/SelectContext.js | 61 +++++++++++++++ front/src/hooks/useSelect.js | 14 ++++ front/src/navItems.js | 2 +- front/src/requests.js | 4 +- .../bar/controller/AuthController.java | 3 + .../bar/controller/BarController.java | 12 +-- .../bar/controller/CocktailController.java | 11 +++ .../CocktailForIngredientModalDto.java | 19 +++++ .../kayashov/bar/mapper/CocktailMapper.java | 10 +++ .../kayashov/bar/service/CocktailService.java | 19 ++++- src/main/resources/application.properties | 3 +- 22 files changed, 304 insertions(+), 158 deletions(-) create mode 100644 front/src/components/cocktails/CocktailDescription.js create mode 100644 front/src/context/SelectContext.js create mode 100644 front/src/hooks/useSelect.js create mode 100644 src/main/java/ru/kayashov/bar/controller/dto/cocktail/CocktailForIngredientModalDto.java diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 809e5ee..238304e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,7 +7,7 @@ stages: - deploy front - deploy back -stop-job: +deploy-back-job: stage: deploy back only: - back_release @@ -18,5 +18,17 @@ stop-job: - echo "Сборка образа докер" - docker build -t my-bar . - echo "Запуск докер контейнера" - - docker run --name my-bar --restart=always -p 8091:8080 -d my-bar - - echo "Деплой завершен" \ No newline at end of file + - docker run --name my-bar --restart=always -p 8091:8080 -d -e COCKTAIL_PHOTO_PATH=/front/assets/cocktails -v /mnt/sdb1/my-bar-front/build:/front my-bar + - echo "Деплой завершен" + +deploy-front-job: + stage: deploy front + only: + - release_front + image: node:22.12 + script: + - cd front + - npm install + - npm run build + - cp -r build /app + - echo "Деплой завершен" diff --git a/front/package.json b/front/package.json index 1034a42..27949b9 100644 --- a/front/package.json +++ b/front/package.json @@ -41,7 +41,7 @@ }, "scripts": { "start": "react-scripts start", - "build": "react-scripts build", + "build": "CI=false && react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, diff --git a/front/src/app/App.js b/front/src/app/App.js index 3f99800..d741347 100644 --- a/front/src/app/App.js +++ b/front/src/app/App.js @@ -7,6 +7,7 @@ import {BrowserRouter as Router} from "react-router-dom"; import {NavigationRoutes} from "./NavigationRoutes"; import {SnackbarProvider} from 'notistack'; import {UserProvider} from "../context/UserContext"; +import {SelectProvider} from "../context/SelectContext"; function App() { const theme = createTTheme(); @@ -36,10 +37,13 @@ function App() { }, }} /> - {/*Маршрутизация*/} - - - + {/*Провайдер выбора*/} + + {/*Маршрутизация*/} + + + + diff --git a/front/src/app/pages/cocktails/CocktailMenuBarPage.js b/front/src/app/pages/cocktails/CocktailMenuBarPage.js index bef556f..531bfe8 100644 --- a/front/src/app/pages/cocktails/CocktailMenuBarPage.js +++ b/front/src/app/pages/cocktails/CocktailMenuBarPage.js @@ -16,6 +16,7 @@ import {requests} from "../../../requests"; import {api} from "../../../lib/clients/api"; import {useAlert} from "../../../hooks/useAlert"; import {CocktailInfoModal} from "../../../components/cocktails/CocktailInfoModal"; +import {useSelect} from "../../../hooks/useSelect"; export function CocktailMenuBarPage() { const {createError} = useAlert(); @@ -23,8 +24,7 @@ export function CocktailMenuBarPage() { const [findString, setFindString] = useState(""); const [loading, setLoading] = useState(true); const [cocktails, setCocktails] = useState([]); - const [openModal, setOpenModal] = useState(false); - const [selected, setSelected] = useState(null); + const {setCocktail, state} = useSelect(); useEffect(() => { api().get(`${requests.cocktails.menu}?all=true`) @@ -38,12 +38,11 @@ export function CocktailMenuBarPage() { const handleOpenModal = (row) => { - setSelected(row) - setOpenModal(true); + setCocktail(row); } const changeHandler = (row, value) => { const newState = cocktails.map((r) => { - if(r.id !== row.id) { + if (r.id !== row.id) { return r; } return { @@ -117,11 +116,7 @@ export function CocktailMenuBarPage() { {/*Загрузчик*/} {/*Модальное окно информации об ингредиенте*/} - { - setSelected(null); - setOpenModal(false); - }}/> + ) } \ No newline at end of file diff --git a/front/src/app/pages/cocktails/CocktailsPageContent.js b/front/src/app/pages/cocktails/CocktailsPageContent.js index 428aa5e..176c480 100644 --- a/front/src/app/pages/cocktails/CocktailsPageContent.js +++ b/front/src/app/pages/cocktails/CocktailsPageContent.js @@ -14,57 +14,8 @@ import {useUser} from "../../../hooks/useUser"; import {blue} from "@mui/material/colors"; import UpIcon from "@mui/icons-material/KeyboardArrowUp"; import {sortList} from "../../../components/cocktails/sortingList"; -import {getComparator} from "../../../components/core/getComparator"; import Button from "@mui/material/Button"; -import Paper from "@mui/material/Paper"; -import CheckMarks from "../../../components/cocktails/CheckMarks"; - -const filterList = (rows, filter, allowIngredients) => { - let regExp = new RegExp("(.*?)" + filter.search + "(.*?)", "i"); - const sortingObj = sortList.find((s) => s.name === filter.sorting); - const sortingValues = sortingObj.id.split("|"); - return rows - .filter((row) => { - const nameReg = row.name.split(" ").map((n) => n.match(regExp) !== null).includes(true); - const ingredientReg = row.components - .split(", ") - .map((r) => r.match(regExp) !== null) - .includes(true); - return nameReg || ingredientReg; - }) - .filter((row) => filter.onlyFavourite ? row.rating.favourite : true) - .filter((row) => filter.glass.length === 0 || filter.glass.includes(row.glass)) - .filter((row) => filter.category.length === 0 || filter.category.includes(row.category)) - .filter((row) => filter.alcohol.length === 0 || filter.alcohol.includes(row.alcoholic)) - .filter((row) => { - if (filter.tags.length === 0) { - return true; - } - - if (row.tags.length === 0) { - return false; - } - return row.tags.split(",").find((tag) => filter.tags.includes(tag)) - }) - .filter((row) => { - if (filter.iCount.length === 0) { - return true; - } - const arr = row.components.split(", "); - const count = arr.filter((n) => !allowIngredients.includes(n)).length; - const filt = filter.ingredient.length === 0 || arr.filter((n) => filter.ingredient.includes(n)).length > 0; - - return filter.iCount === count && filt; - }) - .filter((row) => { - if (filter.inMenu === "") { - return row; - } - const filterValue = filter.inMenu === "Есть в меню"; - return filterValue === row.inMenu; - }) - .sort(getComparator(sortingValues[1], sortingValues[0], "name")) -} +import {useSelect} from "../../../hooks/useSelect"; const emptyFilter = { search: "", @@ -86,14 +37,14 @@ const CocktailsPageContent = ({all}) => { const [allowIngredients, setAllowIngredients] = useState([]) const [rows, setRows] = useState([]); const [filter, setFilter] = useState(emptyFilter) - const [open, setOpen] = useState(false); - const [selectedCocktail, setSelectedCocktail] = useState(null) - const [chips, setChips] = useState([]) + // const [chips, setChips] = useState([]) const [page, setPage] = useState(-1); const [load, setLoad] = useState(false); const [isEnd, setIsEnd] = useState(false); const [isNew, setIsNew] = useState(true); + const {selectCocktail, getCocktail, getOpenCocktail} = useSelect(); + const loading = useCallback(() => { const size = Math.floor((window.innerWidth) / 350) * 5; if (load || (!isNew && isEnd)) { @@ -111,7 +62,7 @@ const CocktailsPageContent = ({all}) => { api().post(requests.cocktails.menu, request) .then((r) => { if (r.data.length === 0) { - if(isNew) { + if (isNew) { setRows([]); } setIsEnd(true); @@ -139,6 +90,7 @@ const CocktailsPageContent = ({all}) => { } window.addEventListener('scroll', handleScroll); return () => window.removeEventListener('scroll', handleScroll); + // eslint-disable-next-line }, [loading]); useEffect(() => { api().get(requests.bar.ingredientSimple) @@ -152,6 +104,7 @@ const CocktailsPageContent = ({all}) => { }, []) useEffect(() => { loading(); + // eslint-disable-next-line }, [filter]) useEffect(() => { if (!all) { @@ -164,7 +117,8 @@ const CocktailsPageContent = ({all}) => { .filter((nhc) => nhc.length === 1) .map((fc) => fc[0]) .forEach((i) => ingredients.add(i)) - setChips(Array.from(ingredients).sort(getComparator())); + // setChips(Array.from(ingredients).sort(getComparator())); + // eslint-disable-next-line }, [rows, allowIngredients]) const renderSkeleton = () => { @@ -230,12 +184,9 @@ const CocktailsPageContent = ({all}) => { setFilter(emptyFilter); } const handleSelectCocktail = (row) => { - setSelectedCocktail(row.id) - setOpen(true) - } - const handleCloseCocktailModal = () => { - setOpen(false); - setSelectedCocktail(null); + selectCocktail(row.id) + // setSelectedCocktail(row.id) + // setOpen(true) } const handleEditMenu = (row, value) => { const newState = rows.map((r) => { @@ -271,8 +222,7 @@ const CocktailsPageContent = ({all}) => { {/**/} {/*Модальное окно информации о коктейле*/} - + {/*Блок фильтров*/} { @@ -76,12 +76,7 @@ export function IngredientsPage() { }); } const handleOpenModal = (i) => { - setOpenModal(true); - setSelectedInfo(i); - } - const handleCloseModal = () => { - setSelectedInfo(null); - setOpenModal(false); + selectIngredient(i) } return ( @@ -147,7 +142,7 @@ export function IngredientsPage() { {/*Загрузчик*/} {/*Модальное окно информации об ингредиенте*/} - + ) } \ No newline at end of file diff --git a/front/src/components/Ingredients/IngredientInfoModal.js b/front/src/components/Ingredients/IngredientInfoModal.js index 75ce54f..103ab14 100644 --- a/front/src/components/Ingredients/IngredientInfoModal.js +++ b/front/src/components/Ingredients/IngredientInfoModal.js @@ -6,13 +6,34 @@ import Button from "@mui/material/Button"; import * as React from "react"; import Stack from "@mui/material/Stack"; import Typography from "@mui/material/Typography"; +import List from "@mui/material/List"; +import {useEffect, useState} from "react"; +import {api} from "../../lib/clients/api"; +import {requests} from "../../requests"; +import {useAlert} from "../../hooks/useAlert"; +import ListItem from "@mui/material/ListItem"; +import {useSelect} from "../../hooks/useSelect"; + +export function IngredientInfoModal({ingredient}) { + const [cocktails, setCocktails] = useState([]); + const {closeIngredient, getOpenIngredient, selectCocktail} = useSelect(); + const {createError} = useAlert(); + + useEffect(() => { + if(!ingredient) { + return + } + api().get(requests.cocktails.byIngredient + ingredient.id) + .then((r) => setCocktails(r.data)) + .catch(() => createError()) + // eslint-disable-next-line + }, [ingredient]); -export function IngredientInfoModal({ingredient, open, closeHandler}) { if (!ingredient) { return null; } return ( -

{`Крепость ${ingredient.abv}`})} {ingredient.description} + {cocktails.length > 0 && ( + <> + Коктейли: + + {cocktails.map((c) => { + return ( + { + selectCocktail(c.id) + closeIngredient(); + }}> + + {c.name} + {c.name} + {c.rating.rating > 0 && {`${c.rating.rating}/5`}} + + + ) + })} + + + )} - + ); diff --git a/front/src/components/cocktails/Cocktail.js b/front/src/components/cocktails/Cocktail.js index 272da22..ddfb922 100644 --- a/front/src/components/cocktails/Cocktail.js +++ b/front/src/components/cocktails/Cocktail.js @@ -1,9 +1,6 @@ import {CardActions, CardContent, CardMedia, Rating} from "@mui/material"; import {useAlert} from "../../hooks/useAlert"; import Typography from "@mui/material/Typography"; -import List from "@mui/material/List"; -import ListItem from "@mui/material/ListItem"; -import ListItemText from "@mui/material/ListItemText"; import Button from "@mui/material/Button"; import Grid from "@mui/material/Grid"; import {requests} from "../../requests"; @@ -14,6 +11,7 @@ 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"; function renderFavouriteBadge(handleFavourite, row) { const childIcon = row.rating.favourite ? : ; @@ -65,40 +63,13 @@ export function Cocktail({row, handleFavourite, handleChangeRating, handleSelect alt={row.name} height="300" - image={`${row.image}/preview`} + image={row.image.includes("thecocktaildb") ? (row.image + "/preview") : row.image} /> {renderFavouriteBadge(handleFavourite, row)} {renderRating(handleChangeRating, row)} {row.name} - - {row.hasError && ( - - Имеет ошибку в рецепте или ингредиентах - - )} - - {"Категория: " + row.category} - - - {"Алкоголь: " + row.alcoholic} - - {row.volume !== null && ( - - {"Крепость: ≈" + row.volume} - - )} - - {"Подача: " + row.glass} - - - {"Состав: " + row.components} - - {(row.tags && row.tags.length > 0) && ( - - {"Теги: " + row.tags.replaceAll(',', ', ')} - )} - + {(row.isAllowed && session.isActive && user.invited) && diff --git a/front/src/components/cocktails/CocktailDescription.js b/front/src/components/cocktails/CocktailDescription.js new file mode 100644 index 0000000..db6b9e2 --- /dev/null +++ b/front/src/components/cocktails/CocktailDescription.js @@ -0,0 +1,36 @@ +import ListItem from "@mui/material/ListItem"; +import ListItemText from "@mui/material/ListItemText"; +import List from "@mui/material/List"; + +export function CocktailDescription({row}) { + return ( + + {row.hasError && ( + + Имеет ошибку в рецепте или ингредиентах + + )} + + {"Категория: " + row.category} + + + {"Алкоголь: " + row.alcoholic} + + {row.volume !== null && ( + + {"Крепость: ≈" + row.volume} + + )} + + {"Подача: " + row.glass} + + + {"Состав: " + row.components} + + {(row.tags && row.tags.length > 0) && ( + + {"Теги: " + row.tags.replaceAll(',', ', ')} + )} + + ) +} \ No newline at end of file diff --git a/front/src/components/cocktails/CocktailInfoModal.js b/front/src/components/cocktails/CocktailInfoModal.js index 98a018c..afb6053 100644 --- a/front/src/components/cocktails/CocktailInfoModal.js +++ b/front/src/components/cocktails/CocktailInfoModal.js @@ -21,24 +21,20 @@ import {useAlert} from "../../hooks/useAlert"; import {paths} from "../../path"; import {Loading} from "../core/Loading"; import {useUser} from "../../hooks/useUser"; +import {useSelect} from "../../hooks/useSelect"; -export function CocktailInfoModal({open, row, closeHandler}) { +export function CocktailInfoModal({row}) { const {user} = useUser(); const {getError, createError, createSuccess} = useAlert(); const [cocktail, setCocktail] = useState(null) const [loading, setLoading] = useState(false); - const [selectedIngredient, setSelectedIngredient] = useState(null); - const [openIngredientModal, setOpenIngredientModal] = useState(false) - const closeIngredientHandler = () => { - setOpenIngredientModal(false); - setSelectedIngredient(null); - } + const {closeCocktail, selectIngredient, getIngredient, getOpenCocktail} = useSelect(); const openIngredientModalHandler = (id) => { api().get(`${requests.bar.ingredient}?id=${id}`) .then((r) => { - setSelectedIngredient(r.data) - setOpenIngredientModal(true); - }).catch(() => createError("Ошибка получения информации об ингредиенте")) + selectIngredient(r.data) + }) + .catch(() => createError("Ошибка получения информации об ингредиенте")) } const selectIngredientHandler = (ingredient) => { const url = `${requests.bar.ingredient}?id=${ingredient.id}`; @@ -79,18 +75,17 @@ export function CocktailInfoModal({open, row, closeHandler}) { .catch(() => { getError(); setLoading(false) - closeHandler(); + closeCocktail(); }) + // eslint-disable-next-line }, [row]); if (!row || !cocktail) { return null; } - let alko = 0; - let volume = 0; return ( - + @@ -118,7 +112,7 @@ export function CocktailInfoModal({open, row, closeHandler}) { { const hasError = r.count === null || r.unit === null; const measure = hasError ? r.measure : (r.count + " " + r.unit.name) - if(alko !== null && volume !== null) { - console.log(r) - } return ( @@ -173,7 +164,7 @@ export function CocktailInfoModal({open, row, closeHandler}) { {user.role.includes("ADMIN") && ( )} - + ) diff --git a/front/src/components/orders/OrderModal.js b/front/src/components/orders/OrderModal.js index 53d4928..907842d 100644 --- a/front/src/components/orders/OrderModal.js +++ b/front/src/components/orders/OrderModal.js @@ -37,6 +37,7 @@ function renderButtons(row, my, handleChange) { export default function OrderModal({row, handleClose, open, handleChange, my}) { const [receipt, setReceipt] = useState([]); + const [instructions, setInstructions] = useState(); const {createError} = useAlert(); useEffect(() => { @@ -46,6 +47,10 @@ export default function OrderModal({row, handleClose, open, handleChange, my}) { api().get(requests.bar.receipts + row.cocktail.id) .then((r) => setReceipt(r.data)) .catch(() => createError("Ошибка получения рецепта")) + + api().get(requests.cocktails.instructions + row.cocktail.id) + .then((r) => setInstructions(r.data)) + .catch(() => createError("Ошибка получения инструкции")) // eslint-disable-next-line }, [row]); @@ -62,7 +67,6 @@ export default function OrderModal({row, handleClose, open, handleChange, my}) { {"Заказ №" + row.id} {row.cocktail.name} - {row.cocktail.alcoholic + " " + row.cocktail.category} {"для: " + row.visitor.name + " " + row.visitor.lastName} @@ -74,8 +78,14 @@ export default function OrderModal({row, handleClose, open, handleChange, my}) { return ({`${r.ingredient.name} - ${r.measure}`}) })} - Инструкция: - {row.cocktail.instructions} + {instructions && + ( + <> + Инструкция: + {instructions} + + ) + } {row.cocktail.video && (