From 0a8bf5c4faebe2cea99da21d8eb056de8a9a09ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Mon, 17 Jun 2024 14:28:46 +0200 Subject: [PATCH] messageService.create REQUIRES_NEW --- .../kleinanzeigen/offer/Offer.java | 3 +- .../kleinanzeigen/telegram/TelegramBot.java | 1 - .../telegram/TelegramService.java | 42 ++++++++++--------- .../telegram/chat/message/Message.java | 4 +- .../chat/message/MessageRepository.java | 2 +- .../telegram/chat/message/MessageService.java | 8 ++-- 6 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/Offer.java b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/Offer.java index 917df45..4809037 100644 --- a/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/Offer.java +++ b/src/main/java/de/ph87/kleinanzeigen/kleinanzeigen/offer/Offer.java @@ -15,7 +15,7 @@ import java.util.Objects; @Entity @Getter -@ToString(onlyExplicitlyIncluded = true) +@ToString @NoArgsConstructor public class Offer { @@ -70,6 +70,7 @@ public class Offer { @Nullable private String imageURL = null; + @ToString.Exclude @OneToMany(mappedBy = "offer") private List messages = new ArrayList<>(); diff --git a/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramBot.java b/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramBot.java index 0287760..7167ca1 100644 --- a/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramBot.java +++ b/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramBot.java @@ -20,7 +20,6 @@ public class TelegramBot extends TelegramLongPollingBot { public TelegramBot(final String token, final Consumer onUpdate) throws IOException, TelegramApiException { super(token); this.onUpdate = onUpdate; - log.info("Starting telegram bot..."); final TelegramBotsApi api = new TelegramBotsApi(DefaultBotSession.class); session = (DefaultBotSession) api.registerBot(this); diff --git a/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java b/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java index 9bb7339..d3830f1 100644 --- a/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java +++ b/src/main/java/de/ph87/kleinanzeigen/telegram/TelegramService.java @@ -31,6 +31,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Slf4j @Service @@ -67,12 +68,17 @@ public class TelegramService { @TransactionalEventListener(OfferDto.class) public void onOffer(final OfferDto offer) { - final List existing = messageService.findAllDtoByOfferDto(offer); - for (ChatDto chat : chatService.findAllEnabled()) { - existing.stream() - .filter(m -> m.getChat().getId() == chat.getId()) - .findFirst() - .ifPresentOrElse(this::update, () -> send(offer, chat)); + final List existingMessages = messageService.findAllDtoByOfferDto(offer); + final List chats = chatService.findAllEnabled(); + for (final ChatDto chat : chats) { + final Optional existing = existingMessages.stream().filter(m -> m.getChat().getId() == chat.getId()).findFirst(); + if (existing.isPresent()) { + log.info("Found existing message: {}", existing); + update(existing.get()); + } else { + log.info("Creating new message for chat={}", chat.getId()); + send(offer, chat); + } } } @@ -139,21 +145,19 @@ public class TelegramService { } private void send(final OfferDto offerDto, final ChatDto chatDto) { - chatService.findAllEnabled().forEach(chat -> { - try { - final InputFile inputFile = offerDto.getImageURL() == null ? new InputFile(new ByteArrayInputStream(NO_IMAGE), "[Kein Bild]") : new InputFile(offerDto.getImageURL()); - final SendPhoto send = new SendPhoto(chat.getId() + "", inputFile); - send.setCaption(createText(offerDto)); - send.setReplyMarkup(createKeyboard(false)); + try { + final InputFile inputFile = offerDto.getImageURL() == null ? new InputFile(new ByteArrayInputStream(NO_IMAGE), "[Kein Bild]") : new InputFile(offerDto.getImageURL()); + final SendPhoto send = new SendPhoto(chatDto.getId() + "", inputFile); + send.setCaption(createText(offerDto)); + send.setReplyMarkup(createKeyboard(false)); - log.info("Sending Offer: {}", offerDto); - final Message message = bot.execute(send); + log.info("Sending: chat={}, offer={}", chatDto, offerDto); + final Message tlgMessage = bot.execute(send); - messageService.create(offerDto, chatDto, message); - } catch (TelegramApiException | JsonProcessingException e) { - log.error("Failed to send Message to #{}.", chat.getId(), e); - } - }); + messageService.create(offerDto, chatDto, tlgMessage); + } catch (TelegramApiException | JsonProcessingException e) { + log.error("Failed to send: chat={}, offer={}: {}", chatDto, offerDto, e.toString()); + } } private void update(final MessageDto messageDto) { diff --git a/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/Message.java b/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/Message.java index 81d1447..25db44e 100644 --- a/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/Message.java +++ b/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/Message.java @@ -42,10 +42,10 @@ public class Message { @Column private boolean remember = false; - public Message(@NonNull final Offer offer, @NonNull final Chat chat, final org.telegram.telegrambots.meta.api.objects.Message message) { + public Message(@NonNull final Offer offer, @NonNull final Chat chat, @NonNull final org.telegram.telegrambots.meta.api.objects.Message tlgMessage) { this.chat = chat; this.offer = offer; - this.telegramMessageId = message.getMessageId(); + this.telegramMessageId = tlgMessage.getMessageId(); } public void setRemember(final boolean newRemember) { diff --git a/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageRepository.java b/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageRepository.java index 8c4e9c2..22982fe 100644 --- a/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageRepository.java +++ b/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageRepository.java @@ -10,7 +10,7 @@ public interface MessageRepository extends ListCrudRepository { Optional findByChat_IdAndTelegramMessageId(long chatId, int messageId); - List findAllByOffer_id(long id); + List findAllByOffer_Id(long id); List findAllByExpiryBefore(ZonedDateTime deadline); diff --git a/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageService.java b/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageService.java index 3d63a07..ec54e34 100644 --- a/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageService.java +++ b/src/main/java/de/ph87/kleinanzeigen/telegram/chat/message/MessageService.java @@ -13,6 +13,7 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.telegram.telegrambots.meta.api.objects.MaybeInaccessibleMessage; @@ -52,10 +53,11 @@ public class MessageService { } } - public void create(final OfferDto offerDto, final ChatDto chatDto, final org.telegram.telegrambots.meta.api.objects.Message message) { + @Transactional(propagation = Propagation.REQUIRES_NEW) + public void create(final OfferDto offerDto, final ChatDto chatDto, final org.telegram.telegrambots.meta.api.objects.Message tlgMessage) { final Offer offer = offerService.getByDto(offerDto); final Chat chat = chatService.getByDto(chatDto); - messageRepository.save(new Message(offer, chat, message)); + messageRepository.save(new Message(offer, chat, tlgMessage)); } @SuppressWarnings("UnusedReturnValue") @@ -88,7 +90,7 @@ public class MessageService { } public List findAllDtoByOfferDto(final OfferDto offer) { - return messageRepository.findAllByOffer_id(offer.getId()).stream().map(this::toDto).toList(); + return messageRepository.findAllByOffer_Id(offer.getId()).stream().map(this::toDto).toList(); } private MessageDto toDto(final Message message) {