package com.myoa.engineering.crawl.ppomppu.processor.dto; import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; import com.myoa.engineering.crawl.ppomppu.processor.domain.PpomppuArticle; import com.myoa.engineering.crawl.ppomppu.support.dto.BlockMessageDTO; import com.myoa.engineering.crawl.ppomppu.support.dto.SimpleMessageDTO; import com.myoa.engineering.crawl.ppomppu.support.dto.code.PpomppuBoardName; /** * PpomppuArticleTransformer * @author Shin Woo-jin (woo-jin.shin@linecorp.com) * @since 2021-11-21 * */ public final class PpomppuArticleTransformer { private PpomppuArticleTransformer() {} private static final String MESSAGE_FORMAT_V1 = "%s)) <%s|LINK> `%s` "; private static final String MESSAGE_FORMAT_V2 = "%s *<%s|LINK>*\n%s"; private static final String TITLE_FORMAT_V1 = "_*:hearts: %s | %s*_"; private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") .withZone(ZoneId.of("Asia/Seoul")); public static final Function TRANSFORM_TO_MESSAGE_DTO = article -> SimpleMessageDTO.builder() .requestedAt(Instant.now()) .publishedAt(article.getRegisteredAt()) .title(String.format(MESSAGE_FORMAT_V1, article.getBoardName().getMenuName(), article.getArticleUrl(), article.getTitle())) .body(article.getArticleUrl()) .build(); // https://stackoverflow.com/questions/24882927/using-streams-to-convert-a-list-of-objects-into-a-string-obtained-from-the-tostr public static SimpleMessageDTO transformToSimpleMessage(List articles) { Instant requestedAt = Instant.now(); String body = articles.stream() .map(PpomppuArticleTransformer::convertToInlineMessage) .collect(Collectors.joining("\n\n")); return SimpleMessageDTO.builder() .requestedAt(requestedAt) .title(DATE_TIME_FORMATTER.format(requestedAt)) .body(body) .build(); } public static BlockMessageDTO transformToBlockMessage(PpomppuBoardName boardName, List articles) { Instant requestedAt = Instant.now(); List body = articles.stream() .map(e -> BlockMessageDTO.createBlock(convertToInlineMessage(e), e.getThumbnailUrl())) .collect(Collectors.toList()); return BlockMessageDTO.builder() .requestedAt(requestedAt) .title(String.format(TITLE_FORMAT_V1, boardName.getMenuName(), DATE_TIME_FORMATTER.format(requestedAt))) .blocks(body) .build(); } public static String convertToInlineMessage(PpomppuArticle article) { return String.format(MESSAGE_FORMAT_V2, article.getBoardName().getMenuName(), article.getArticleUrl(), article.getTitle()); } }