diff --git a/pom.xml b/pom.xml index e4a2089..f975ef6 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ io.github.enkarin chef-bot - 2.8.3 + 2.8.4 Chef Bot @@ -301,7 +301,7 @@ LINE MISSEDCOUNT - 52 + 53 diff --git a/src/main/java/io/github/enkarin/chefbot/adapters/TelegramAdapter.java b/src/main/java/io/github/enkarin/chefbot/adapters/TelegramAdapter.java index 14b6825..10769b2 100644 --- a/src/main/java/io/github/enkarin/chefbot/adapters/TelegramAdapter.java +++ b/src/main/java/io/github/enkarin/chefbot/adapters/TelegramAdapter.java @@ -82,6 +82,7 @@ private void processingResponse(final long chatId, final OperationResult operati if (action instanceof ModerationResultDto moderationResultDto) { sendDeclineResultToOwner(moderationResultDto); } else if (action instanceof ModerationDishDto moderationDishDto) { + moderationDishDto.getOldModerationRequests().forEach(this::deleteOddRequestMessage); telegramController.addRequestMessages(moderationDishDto.getRequestId(), sendModerationRequests(telegramController.findAvailableModeratorsId(moderationDishDto.getOwnerChatId()), moderationDishDto)); } else if (action instanceof List dishDtoList) { diff --git a/src/main/java/io/github/enkarin/chefbot/dto/ModerationDishDto.java b/src/main/java/io/github/enkarin/chefbot/dto/ModerationDishDto.java index f124aaa..35a9cae 100644 --- a/src/main/java/io/github/enkarin/chefbot/dto/ModerationDishDto.java +++ b/src/main/java/io/github/enkarin/chefbot/dto/ModerationDishDto.java @@ -20,6 +20,7 @@ public class ModerationDishDto { private WorldCuisine worldCuisine; private Set products; private String recipe; + private Set oldModerationRequests; @Override public String toString() { diff --git a/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/AddExcludeProductInputHandler.java b/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/AddExcludeProductInputHandler.java index 072dd92..bff8fb2 100644 --- a/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/AddExcludeProductInputHandler.java +++ b/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/AddExcludeProductInputHandler.java @@ -16,7 +16,7 @@ public class AddExcludeProductInputHandler implements NonCommandInputHandler { @Override public ExecutionResult execute(final long userId, final String text) { service.addExcludeProducts(userId, text.split("[\n,]")); - return new ExecutionResult(ChatStatus.MAIN_MENU); + return new ExecutionResult(ChatStatus.EXCLUDE_PRODUCTS); } @Override diff --git a/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/DeleteExcludeProductsByNameInputHandler.java b/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/DeleteExcludeProductsByNameInputHandler.java index b606be4..5e04c7a 100644 --- a/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/DeleteExcludeProductsByNameInputHandler.java +++ b/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/DeleteExcludeProductsByNameInputHandler.java @@ -16,7 +16,7 @@ public class DeleteExcludeProductsByNameInputHandler implements NonCommandInputH @Override public ExecutionResult execute(final long userId, final String text) { service.deleteExcludeProductsByEqualsNames(userId, text.split("[\n,]")); - return new ExecutionResult(ChatStatus.MAIN_MENU); + return new ExecutionResult(ChatStatus.EXCLUDE_PRODUCTS); } @Override diff --git a/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/DeleteExcludeProductsContainsNameInputHandler.java b/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/DeleteExcludeProductsContainsNameInputHandler.java index 3a2f42a..82a2d90 100644 --- a/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/DeleteExcludeProductsContainsNameInputHandler.java +++ b/src/main/java/io/github/enkarin/chefbot/pipelinehandlers/exclude/DeleteExcludeProductsContainsNameInputHandler.java @@ -16,7 +16,7 @@ public class DeleteExcludeProductsContainsNameInputHandler implements NonCommand @Override public ExecutionResult execute(final long userId, final String text) { service.deleteExcludeProductsByLikeName(userId, text.split("[\n,]")); - return new ExecutionResult(ChatStatus.MAIN_MENU); + return new ExecutionResult(ChatStatus.EXCLUDE_PRODUCTS); } @Override diff --git a/src/main/java/io/github/enkarin/chefbot/service/ModerationService.java b/src/main/java/io/github/enkarin/chefbot/service/ModerationService.java index d3c0d15..3a4e14e 100644 --- a/src/main/java/io/github/enkarin/chefbot/service/ModerationService.java +++ b/src/main/java/io/github/enkarin/chefbot/service/ModerationService.java @@ -18,6 +18,8 @@ import java.util.Set; import java.util.stream.Collectors; +import static java.util.Objects.isNull; + @Service @Transactional @RequiredArgsConstructor @@ -30,11 +32,22 @@ public class ModerationService { private final UserRepository userRepository; public ModerationDishDto createModerationRequest(final long userId) { - final ModerationRequest moderationRequest = moderationRequestRepository.save(ModerationRequest.builder() - .moderationDish(userService.findUser(userId).getEditabledDish()) - .build()); + final Dish editableDish = userService.findUser(userId).getEditabledDish(); + final ModerationRequest moderationRequest; + final Set moderationRequestMessages; + if (isNull(editableDish.getModerationRequest())) { + moderationRequest = moderationRequestRepository.save(ModerationRequest.builder().moderationDish(editableDish).build()); + moderationRequestMessages = Set.of(); + } else { + moderationRequest = editableDish.getModerationRequest(); + moderationRequestMessages = moderationRequest.getModerationRequestMessages().stream() + .map(moderationRequestMessageEntityDtoMapper::entityToDto) + .collect(Collectors.toSet()); + moderationRequestMessageRepository.deleteAll(moderationRequest.getModerationRequestMessages()); + } final ModerationDishDto result = dishEntityModerationDtoMapper.entityToDto(moderationRequest.getModerationDish()); result.setRequestId(moderationRequest.getId()); + result.setOldModerationRequests(moderationRequestMessages); return result; } diff --git a/src/test/java/io/github/enkarin/chefbot/service/ModerationServiceTest.java b/src/test/java/io/github/enkarin/chefbot/service/ModerationServiceTest.java index bc25ac0..3843c15 100644 --- a/src/test/java/io/github/enkarin/chefbot/service/ModerationServiceTest.java +++ b/src/test/java/io/github/enkarin/chefbot/service/ModerationServiceTest.java @@ -38,11 +38,12 @@ void init() { @Test void createModerationRequest() { + moderationRequestRepository.deleteAll(); dishService.initDishName(USER_ID, "newDish"); moderationService.createModerationRequest(USER_ID); - assertThat(moderationRequestRepository.findAll()).extracting(ModerationRequest::getModerationDish).extracting(Dish::getDishName).contains("newDish"); + assertThat(moderationRequestRepository.findAll()).hasSize(1).extracting(ModerationRequest::getModerationDish).extracting(Dish::getDishName).contains("newDish"); } @Test @@ -101,4 +102,23 @@ void startModerate() { String.class, moderationRequestsId[3])).isEqualTo("fourthDish"); } + + @Test + void createRepeatedModerationRequest() { + moderationRequestRepository.deleteAll(); + dishService.initDishName(USER_ID, "newDish"); + final long moderationRequestId = moderationService.createModerationRequest(USER_ID).getRequestId(); + dishService.putDishRecipe(USER_ID, "Recipe"); + moderationService.addRequestMessages(moderationRequestId, Set.of(new ModerationRequestMessageDto(1, CHAT_ID - 1))); + + assertThat(moderationService.createModerationRequest(USER_ID).getOldModerationRequests()) + .extracting(ModerationRequestMessageDto::chatId) + .containsOnly(CHAT_ID - 1); + assertThat(moderationRequestRepository.findAll()) + .hasSize(1) + .extracting(ModerationRequest::getModerationDish) + .extracting(Dish::getDishName) + .contains("newDish"); + assertThat(moderationRequestMessageRepository.count()).isZero(); + } } diff --git a/src/test/java/io/github/enkarin/chefbot/service/pipelines/ProcessingFacadeTest.java b/src/test/java/io/github/enkarin/chefbot/service/pipelines/ProcessingFacadeTest.java index 8a572d6..ba6e24b 100644 --- a/src/test/java/io/github/enkarin/chefbot/service/pipelines/ProcessingFacadeTest.java +++ b/src/test/java/io/github/enkarin/chefbot/service/pipelines/ProcessingFacadeTest.java @@ -440,7 +440,7 @@ void addExcludeProduct() { assertThat(processingFacade.execute(USER_ID, "добавить продукты в список").botAnswer().messageText()) .isEqualTo("Введите названия продуктов, которые хотите добавить в список, через запятую или с новой строки"); assertThat(processingFacade.execute(USER_ID, "first, second").botAnswer().messageText()) - .isEqualTo("Вы в главном меню. Выберете следующую команду для выполнения."); + .startsWith("Список продуктов, блюда с которыми будут исключены из поиска:"); assertThat(excludeUserProductsService.findExcludeProducts(USER_ID)).containsOnly("firstProduct", "secondProduct"); } @@ -453,7 +453,7 @@ void deleteExcludeProductByName() { assertThat(processingFacade.execute(USER_ID, "удалить продукты из списка по полному названию").botAnswer().messageText()) .isEqualTo("Введите названия продуктов, которые хотите исключить из списка, через запятую или с новой строки"); assertThat(processingFacade.execute(USER_ID, "firstProduct, secondProduct").botAnswer().messageText()) - .isEqualTo("Вы в главном меню. Выберете следующую команду для выполнения."); + .startsWith("Список продуктов, блюда с которыми будут исключены из поиска:"); assertThat(excludeUserProductsService.findExcludeProducts(USER_ID)).containsOnly("thirdProduct"); } @@ -466,7 +466,7 @@ void deleteExcludeProductContainsName() { assertThat(processingFacade.execute(USER_ID, "удалить продукты из списка по частичному названию").botAnswer().messageText()) .isEqualTo("Введите названия продуктов, которые хотите исключить из списка, через запятую или с новой строки"); assertThat(processingFacade.execute(USER_ID, "first, third").botAnswer().messageText()) - .isEqualTo("Вы в главном меню. Выберете следующую команду для выполнения."); + .startsWith("Список продуктов, блюда с которыми будут исключены из поиска:"); assertThat(excludeUserProductsService.findExcludeProducts(USER_ID)).containsOnly("secondProduct"); } }