package com.myoa.engineering.crawl.ppomppu.processor.controller; import java.util.List; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.myoa.engineering.crawl.ppomppu.processor.domain.PpomppuArticle; import com.myoa.engineering.crawl.ppomppu.processor.dto.FeedParsedResult; import com.myoa.engineering.crawl.ppomppu.processor.service.MessageSenderService; import com.myoa.engineering.crawl.ppomppu.processor.service.PpomppuArticleService; import com.myoa.engineering.crawl.ppomppu.processor.service.PpomppuFeedService; import com.myoa.engineering.crawl.ppomppu.support.dto.APIResponse; import com.myoa.engineering.crawl.ppomppu.support.dto.code.PpomppuBoardName; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; /** * CrawlAPIController * * @author Shin Woo-jin (woo-jin.shin@linecorp.com) * @since 2021-09-05 */ @Slf4j @RestController @RequestMapping("/api/v1/crawl") public class CrawlAPIController { private final PpomppuFeedService ppomppuRSSFeedService; private final PpomppuArticleService ppomppuArticleService; private final MessageSenderService messageSenderService; public CrawlAPIController(PpomppuFeedService ppomppuRSSFeedService, PpomppuArticleService ppomppuArticleService, MessageSenderService messageSenderService) { this.ppomppuRSSFeedService = ppomppuRSSFeedService; this.ppomppuArticleService = ppomppuArticleService; this.messageSenderService = messageSenderService; } @PostMapping("/boards/{boardName}") public Mono> crawlBoard(@PathVariable("boardName") PpomppuBoardName boardName) { log.info("got request... {}", boardName); FeedParsedResult result = FeedParsedResult.of(boardName); Mono publishedMessages = ppomppuRSSFeedService.getArticles(boardName) .map(e -> ppomppuArticleService.filterOnlyNewArticles(boardName, e)) .map(e -> ppomppuArticleService.save(boardName, e)) .filter(e -> !e.isEmpty()) .flatMap(e -> messageSenderService.sendBlockMessageToSlack(boardName, e)); return publishedMessages.then(Mono.just(APIResponse.success(result.done()))); } @PostMapping("/exploit/boards/{boardName}") public Mono> crawlBoardDryRun( @PathVariable("boardName") PpomppuBoardName boardName) { log.info("got request... {}", boardName); Mono publishedMessages = ppomppuRSSFeedService.getArticles(boardName) .flatMap(e -> messageSenderService.sendBlockMessageToSlack(boardName, e)); return publishedMessages.map(APIResponse::success); } }