Skip to content

Commit 1e08bf6

Browse files
authored
fix: api 토큰 설정 안하면 예외 터질 수 있도록 수정 (#746)
* feat: 슬랙 이모지 봇 1차 구현 진행 - 슬랙 봇 이모지를 걸었을 경우 자동으로 봇이 멘션 걸 수 있는 구조로 구동할 수 있도록 진행 - todo : 실제 dev 환경과 연계하여서 멘션 갈 수 있도록 구현 진행 * feat: Slack Socket Mode 및 WebSocket 의존성 추가 - bolt-socket-mode 라이브러리 추가 - WebSocket API 의존성 추가 (javax.websocket, tyrus-standalone-client) - Slack 설정에 app-token, api-auth-token 환경변수 추가 - SlackConfig에 MethodsClient 빈 추가 - dev 프로파일 전용 설정 적용 * feat: SlackMessageTemplate 엔티티 및 레포지토리 추가 - 슬랙 메시지 템플릿을 DB에서 관리하기 위한 엔티티 추가 - templateCd를 PK로 사용 - templateContent 필드로 템플릿 내용 저장 - findByTemplateCd 메서드 제공 * refactor: MakersUserSlack 엔티티 개선 - @builder 애노테이션 추가 - slackTemplateCd 필드 추가 - create 정적 팩토리 메서드 추가 - updateEmoji 메서드 추가 - findByCallEmoji, deleteByCallEmoji, existsByCallEmoji 메서드 추가 - 메서드명 수정 (findByUserName → findByCallEmoji) * feat: 슬랙 이모지 이벤트 CRUD 엔드포인트 추가 - SlackController 생성 (POST, PATCH, DELETE) - SlackEmojiEventDto 및 RequestDto 추가 - API 인증 토큰 검증 로직 추가 - Swagger 애노테이션 추가 - dev 프로파일 전용 설정 * feat: 슬랙 메시지 빌드 Strategy 패턴 구현 - MessageContext 클래스 추가 (호출자/피호출자 정보) - SlackMessageBuilder 인터페이스 정의 - CallMessageBuilder 구현체 추가 - SlackMessageBuilderSelector 추가 (전략 선택) - 템플릿 기반 메시지 생성 로직 분리 * refactor: Enum 기반에서 템플릿 기반 메시지 시스템으로 마이그레이션 - SlackMessage enum 삭제 - SlackMesasgeService에 템플릿 조회 로직 추가 - Strategy 패턴 기반 메시지 빌더 적용 - insertEvent, updateEvent, deleteEvent 메서드 구현 - sendMention 메서드에 템플릿 기반 메시지 생성 로직 적용 * feat: SlackSocketModeStarter 추가 및 이벤트 리스너 로그 개선 - SlackSocketModeStarter 컴포넌트 추가 - Socket Mode 앱 자동 시작/종료 라이프사이클 관리 - @PostConstruct, @PreDestroy로 앱 생명주기 관리 - SlackEventListener에 시작 로그 추가 - dev 프로파일 전용 설정 * refactor: SecurityConfig에 슬랙 엔드포인트 허용 추가 및 코드 정리 - /slack/** 경로를 인증 화이트리스트에 추가 - 필드 선언 순서 정리 (상수 → 의존성 → 설정값) - MainApplicationTests 포맷팅 개선 * refactor: SlackMesasgeService 클래스명 오타 수정 - SlackMesasgeService → SlackMessageService로 변경 - 관련 참조 업데이트 (SlackController, SlackEventListener) * refactor: 코드 개선 및 안정성 향상 - SlackSocketModeStarter: destroy 메서드에 null 체크 추가, 로그 메시지 개선 - SlackEmojiEventDto: @NoArgsConstructor 추가 (Jackson 역직렬화 지원) - MakersUserSlackRepository: deleteByCallEmoji에 @Modifying 애노테이션 추가 * fix: SlackMessageTemplate 엔티티 이름 명시적 지정 - @entity에 name 속성 추가 (slack_message_template) - JPQL 쿼리에서 명확한 엔티티 참조를 위한 개선 * refactor: update dto 필요없는 필드 일부 삭제 진행 * refactor: SlackEventListener 예외 처리 및 로깅 개선 - 이벤트 처리 중 발생하는 예외를 try-catch로 처리 - 이모지 리액션 이벤트 정보 로깅 추가 (emoji, user, channel) - 예외 발생 시에도 Slack ACK 응답 보장 * refactor: SlackController 토큰 검증 로직 개선 - 중복된 토큰 검증 로직을 validateToken 메서드로 통합 - InvalidSlackTokenException 커스텀 예외 추가 - 예외 타입별 상태 코드 구분 (토큰 오류: 400, 기타: 500) - 각 핸들러 메서드의 가독성 및 유지보수성 향상
1 parent 456c8c0 commit 1e08bf6

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

main/src/main/java/org/sopt/makers/crew/main/slack/SlackController.java

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,59 +32,64 @@ public class SlackController {
3232
@PostMapping("/emoji")
3333
public ResponseEntity<String> addEmoji(@RequestBody SlackEmojiEventRequestDto requestDto) {
3434
try {
35-
handleTokenValidation(requestDto.getIdentifiedPwd());
36-
35+
validateToken(requestDto.getIdentifiedPwd());
3736
slackMessageService.insertEvent(requestDto.toDto());
38-
3937
return ResponseEntity.ok("Successfully added emoji");
38+
} catch (InvalidSlackTokenException e) {
39+
return ResponseEntity.badRequest().body(e.getMessage());
4040
} catch (Exception e) {
4141
return handleError(e);
4242
}
43-
4443
}
4544

4645
@Operation(summary = "이모지 이벤트 업데이트")
4746
@PatchMapping("/emoji")
4847
public ResponseEntity<String> updateEmoji(@RequestBody SlackUpdateEmojiEventRequestDto requestDto) {
4948
try {
50-
handleTokenValidation(requestDto.getIdentifiedPwd());
49+
validateToken(requestDto.getIdentifiedPwd());
5150
slackMessageService.updateEvent(requestDto.toDto());
5251
return ResponseEntity.ok("Successfully update emoji");
52+
} catch (InvalidSlackTokenException e) {
53+
return ResponseEntity.badRequest().body(e.getMessage());
5354
} catch (Exception e) {
5455
return handleError(e);
5556
}
56-
5757
}
5858

5959
@Operation(summary = "이모지 이벤트 삭제")
6060
@DeleteMapping("/emoji")
6161
public ResponseEntity<String> deleteEmoji(
6262
@RequestBody SlackEmojiEventDeleteRequestDto requestDto) {
6363
try {
64-
handleTokenValidation(requestDto.getIdentifiedPwd());
64+
validateToken(requestDto.getIdentifiedPwd());
6565
slackMessageService.deleteEvent(requestDto.toDto());
6666
return ResponseEntity.ok("Successfully deleted emoji");
67+
} catch (InvalidSlackTokenException e) {
68+
return ResponseEntity.badRequest().body(e.getMessage());
6769
} catch (Exception e) {
6870
return handleError(e);
6971
}
72+
}
7073

74+
private void validateToken(String token) {
75+
if (!isValidToken(token)) {
76+
throw new InvalidSlackTokenException("Slack API Token is invalid");
77+
}
7178
}
7279

7380
private boolean isValidToken(String providedToken) {
7481
return providedToken != null && providedToken.equals(slackAuthToken);
7582
}
7683

77-
private ResponseEntity<String> handleTokenValidation(String token) {
78-
if (!isValidToken(token)) {
79-
return ResponseEntity.badRequest()
80-
.body("Slack API TOKEN does not match. Please find token in Makers Notion");
81-
}
82-
return null; // valid
83-
}
84-
8584
private ResponseEntity<String> handleError(Exception e) {
8685
log.error("Failed to emoji event", e);
8786
return ResponseEntity.internalServerError()
8887
.body(e.getMessage());
8988
}
89+
90+
private static class InvalidSlackTokenException extends RuntimeException {
91+
public InvalidSlackTokenException(String message) {
92+
super(message);
93+
}
94+
}
9095
}

0 commit comments

Comments
 (0)