From 0f39e223106c16266e71a9633b360524172e4577 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Thu, 24 Apr 2025 15:17:02 +0400 Subject: [PATCH 1/3] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BB=D0=B5=D0=B3=D1=80=D0=B0=D0=BC=20=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=20=D0=BD=D0=B0=20=D0=BA=D0=B0=D1=84=D0=BA=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 2/3] =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=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 02ccfb8850442a2c51bbbfd8032a890c67383850 Mon Sep 17 00:00:00 2001 From: "Kayashov.SM" Date: Thu, 24 Apr 2025 17:24:30 +0400 Subject: [PATCH 3/3] =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=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