Skip to content

Commit

Permalink
Merge pull request #84 from Modagbul/fix/auth
Browse files Browse the repository at this point in the history
Slack 알림 EventPublisher로 수정
  • Loading branch information
minsu20 authored Nov 21, 2023
2 parents be08efa + 27495f2 commit 9dbefcd
Show file tree
Hide file tree
Showing 10 changed files with 114 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
import com.moing.backend.domain.teamMember.domain.service.TeamMemberSaveService;
import com.moing.backend.domain.teamScore.application.mapper.TeamScoreMapper;
import com.moing.backend.domain.teamScore.domain.service.TeamScoreSaveService;
import com.moing.backend.global.util.SlackService;
import com.moing.backend.global.config.slack.team.dto.TeamCreateEvent;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
Expand All @@ -27,7 +28,7 @@ public class CreateTeamUserCase {
private final TeamMapper teamMapper;
private final TeamScoreSaveService teamScoreSaveService;
private final TeamScoreMapper teamScoreMapper;
private final SlackService slackService;
private final ApplicationEventPublisher eventPublisher;

public CreateTeamResponse createTeam(CreateTeamRequest createTeamRequest, String socialId){
Member member = memberGetService.getMemberBySocialId(socialId);
Expand All @@ -38,7 +39,7 @@ public CreateTeamResponse createTeam(CreateTeamRequest createTeamRequest, String
team.approveTeam();
//====지워야 함 (테스트 용)=====
teamScoreSaveService.save(teamScoreMapper.mapToTeamScore(team)); // 팀스코어 엔티티 생성
slackService.sendSlackTeamCreatedMessage(team.getName(), team.getLeaderId());
eventPublisher.publishEvent(new TeamCreateEvent(team.getName(), team.getLeaderId()));
return new CreateTeamResponse(team.getTeamId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.moing.backend.global.config.slack;

import com.slack.api.Slack;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SlackConfig {

@Bean
public Slack slackClient() {
return Slack.getInstance();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.moing.backend.global.config.slack.exception;

import com.moing.backend.global.config.slack.exception.dto.ExceptionEvent;
import com.moing.backend.global.config.slack.util.WebhookUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@RequiredArgsConstructor
@Component
public class ExceptionEventHandler {

private final WebhookUtil webhookUtil;

@Async("asyncTaskExecutor")
@EventListener
public void onExceptionEvent(ExceptionEvent event) {
webhookUtil.sendSlackAlertErrorLog(event.getRequest(), event.getException());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.moing.backend.global.config.slack.exception.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;

import javax.servlet.http.HttpServletRequest;

@Getter
@AllArgsConstructor
public class ExceptionEvent {

private final HttpServletRequest request;
private final Exception exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.moing.backend.global.config.slack.team;

import com.moing.backend.global.config.slack.team.dto.TeamCreateEvent;
import com.moing.backend.global.config.slack.util.WebhookUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

@RequiredArgsConstructor
@Component
public class TeamCreateHandler {

private final WebhookUtil webhookUtil;

@Async("asyncTaskExecutor")
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void onTeamCreateEvent(TeamCreateEvent event) {
webhookUtil.sendSlackTeamCreatedMessage(event.getTeamName(), event.getLeaderId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.moing.backend.global.config.slack.team.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class TeamCreateEvent {

private final String teamName;
private final Long leaderId;

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package com.moing.backend.global.util;
package com.moing.backend.global.config.slack.util;

import com.slack.api.Slack;
import com.slack.api.model.Attachment;
import com.slack.api.model.Field;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
Expand All @@ -17,9 +16,10 @@

import static com.slack.api.webhook.WebhookPayloads.payload;

@Component
@RequiredArgsConstructor
@Slf4j
public class SlackService {
@Component
public class SlackAdapter implements WebhookUtil {

@Value("${webhook.slack.error_url}")
private String errorWebhookUrl;
Expand All @@ -29,8 +29,6 @@ public class SlackService {

private final Slack slackClient = Slack.getInstance();

// 공통 슬랙 메시지 전송 메서드
@Async
public void sendSlackMessage(String webhookUrl, String message, List<Attachment> attachments) {
try {
slackClient.send(webhookUrl, payload(p -> p
Expand All @@ -42,16 +40,16 @@ public void sendSlackMessage(String webhookUrl, String message, List<Attachment>
}
}

// 슬랙 에러 알림 메서드
public void sendSlackAlertErrorLog(Exception e, HttpServletRequest request) {
@Override
public void sendSlackAlertErrorLog(HttpServletRequest request, Exception e) {
String message = "[500 에러가 발생했습니다.]";
List<Attachment> attachments = List.of(generateSlackErrorAttachment(e, request));
sendSlackMessage(errorWebhookUrl, message, attachments);
}

// 슬랙 소모임 생성 알림 메서드
@Override
public void sendSlackTeamCreatedMessage(String teamName, Long leaderId) {
String message = String.format("새로운 소모임 '%s'이(가) 생성되었습니다!", teamName);
String message = String.format("[새로운 소모임 '%s'이(가) 생성되었습니다.]", teamName);
List<Attachment> attachments = List.of(generateSlackTeamAttachment(teamName, leaderId));
sendSlackMessage(teamAlarmWebhookUrl, message, attachments);
}
Expand All @@ -76,7 +74,7 @@ private Attachment generateSlackErrorAttachment(Exception e, HttpServletRequest
.title(requestTime + " 발생 에러 로그")
.fields(List.of(
generateSlackField("Request IP", xffHeader == null ? request.getRemoteAddr() : xffHeader),
generateSlackField("Request URL", request.getRequestURL() + " " + request.getMethod()),
generateSlackField("Request URL", request.getMethod() + " " + request.getRequestURL()),
generateSlackField("Error Message", e.getMessage())
)
)
Expand All @@ -90,5 +88,4 @@ private Field generateSlackField(String title, String value) {
.valueShortEnough(false)
.build();
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.moing.backend.global.config.slack.util;

import javax.servlet.http.HttpServletRequest;

public interface WebhookUtil {

void sendSlackAlertErrorLog(HttpServletRequest request, Exception e);

void sendSlackTeamCreatedMessage(String teamName, Long leaderId);
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
package com.moing.backend.global.exception;

import com.moing.backend.global.config.slack.exception.dto.ExceptionEvent;
import com.moing.backend.global.response.ErrorCode;
import com.moing.backend.global.response.ErrorResponse;
import com.moing.backend.global.util.SlackService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.context.support.DefaultMessageSourceResolvable;

import javax.servlet.http.HttpServletRequest;
import java.util.function.Consumer;
Expand All @@ -25,7 +26,7 @@
public class GlobalExceptionHandler {

private static final String LOG_FORMAT = "Class : {}, Code : {}, Message : {}";
private final SlackService slackService;
private final ApplicationEventPublisher eventPublisher;

@ExceptionHandler(ApplicationException.class)
public ResponseEntity<ErrorResponse> handleApplicationException(ApplicationException ex) {
Expand Down Expand Up @@ -57,7 +58,7 @@ public ResponseEntity<ErrorResponse> httpRequestNotSupportedExceptionHandler(Htt

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> internalServerErrorHandler(Exception ex, HttpServletRequest request) {
slackService.sendSlackAlertErrorLog(ex, request);
eventPublisher.publishEvent(new ExceptionEvent(request, ex));
return handleException(ex, ErrorCode.INTERNAL_SERVER_ERROR, ErrorCode.INTERNAL_SERVER_ERROR.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR, log::error);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import com.moing.backend.global.config.security.filter.JwtAuthenticationEntryPoint;
import com.moing.backend.global.config.security.jwt.TokenUtil;
import com.moing.backend.global.config.security.util.AuthenticationUtil;
import com.moing.backend.global.util.SlackService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -58,9 +57,6 @@ public class CommonControllerTest {
@MockBean
public MemberGetService memberQueryService;

@MockBean
private SlackService slackService;

@BeforeEach
public void setUp(final WebApplicationContext context, final RestDocumentationContextProvider provider) throws Exception {

Expand Down

0 comments on commit 9dbefcd

Please sign in to comment.