package com.myoa.engineering.crawl.ppomppu.sender.infrastructure.client; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClientRequestException; import com.myoa.engineering.crawl.ppomppu.sender.dto.SlackMessageDTO; import com.myoa.engineering.crawl.ppomppu.support.webclient.factory.WebClientFilterFactory; import com.myoa.engineering.crawl.ppomppu.support.webclient.factory.WebFluxExchangeStragiesFactory; import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; /** * SlackMessageSender * * @author Shin Woo-jin (woozu.shin@kakaoent.com) * @since 2021-09-08 */ @Slf4j public class SlackMessageSender implements MessageSender { private static final String SLACK_API_URL = "https://slack.com/api"; private final WebClient webClient; public SlackMessageSender(String apiSecret) { this.webClient = WebClient.builder() .baseUrl(SLACK_API_URL) .defaultHeader(HttpHeaders.AUTHORIZATION, "Bearer " + apiSecret) .exchangeStrategies(WebFluxExchangeStragiesFactory.ofDefault()) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE) .defaultHeader(HttpHeaders.ACCEPT_CHARSET, "UTF-8") .filter(WebClientFilterFactory.logRequest()) .filter(WebClientFilterFactory.logResponse()) .build(); } @Override public Mono sendMessage(SlackMessageDTO message) { return webClient.post() .uri("/chat.postMessage") .bodyValue(message) .exchangeToMono(e -> e.bodyToMono(String.class)) .publishOn(Schedulers.boundedElastic()) .onErrorResume(WebClientRequestException.class, t -> { log.info("Exception occured, ignoring. : {}", t.getClass().getSimpleName()); return Mono.empty(); }) .doOnNext(e -> log.info("[sendMessage] {}", e)); } }