Skip to content

Commit 724b8ce

Browse files
khyojunclaude
andauthored
feat: 슬랙 이모지 호출 기능 다중 사용자 지원으로 개선 (#748)
* feat: 슬랙 이모지 호출 기능 다중 사용자 지원으로 개선 동일한 이모지로 여러 사용자를 호출할 수 있도록 기능을 확장했습니다. 주요 변경사항: - MakersUserSlackRepository: 사용자별 이모지 조회/삭제 메서드 추가 - MessageContext: 단일 사용자에서 다중 사용자 리스트로 변경 - SlackMessageService: 다중 사용자 멘션 처리 로직 구현 - SlackUtils: 다중 사용자 멘션 포매팅 유틸리티 메서드 추가 - DTO: userSlackId 파라미터 추가로 사용자별 관리 지원 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> * refactor: 오타수정 * chore: 필요없는 테스트 제거 --------- Co-authored-by: Claude <[email protected]>
1 parent 1e08bf6 commit 724b8ce

File tree

6 files changed

+60
-17
lines changed

6 files changed

+60
-17
lines changed
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.sopt.makers.crew.main.entity.slack;
22

3+
import java.util.List;
34
import java.util.Optional;
45

56
import org.springframework.data.jpa.repository.JpaRepository;
@@ -9,11 +10,16 @@
910

1011
public interface MakersUserSlackRepository extends JpaRepository<MakersUserSlack, Long> {
1112

13+
Optional<MakersUserSlack> findByCallEmojiAndUserSlackId(String callEmoji, String userSlackId);
14+
1215
@Query("select m from makers_user_slack m where m.callEmoji = :emoji")
13-
Optional<MakersUserSlack> findByCallEmoji(@Param("emoji") String emoji);
16+
List<MakersUserSlack> findByCallEmoji(@Param("emoji") String emoji);
1417

1518
@Modifying
1619
void deleteByCallEmoji(String callEmoji);
1720

18-
boolean existsByCallEmoji(String callEmoji);
21+
boolean existsByCallEmojiAndUserSlackId(String callEmoji, String userSlackId);
22+
23+
@Modifying
24+
void deleteByCallEmojiAndUserSlackId(String callEmoji, String userSlackId);
1925
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.sopt.makers.crew.main.slack;
22

3+
import java.util.List;
4+
35
import lombok.AllArgsConstructor;
46
import lombok.Builder;
57
import lombok.Getter;
@@ -9,9 +11,9 @@
911
@Builder
1012
public class MessageContext {
1113
private String callUser;
12-
private String calledUser;
14+
private List<String> calledUser;
1315

14-
public static MessageContext create(String user, String userSlackId) {
16+
public static MessageContext create(String user, List<String> userSlackId) {
1517
return MessageContext
1618
.builder()
1719
.callUser(user)

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

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.sopt.makers.crew.main.slack;
22

3+
import java.util.List;
4+
35
import org.sopt.makers.crew.main.entity.slack.MakersUserSlack;
46
import org.sopt.makers.crew.main.entity.slack.MakersUserSlackRepository;
57
import org.sopt.makers.crew.main.entity.slack.SlackMessageTemplate;
@@ -31,31 +33,34 @@ public class SlackMessageService {
3133

3234
@Transactional
3335
public void insertEvent(SlackEmojiEventDto dto) {
34-
if (makersUserSlackRepository.existsByCallEmoji((dto.getCallEmoji())))
36+
if (makersUserSlackRepository.existsByCallEmojiAndUserSlackId(dto.getCallEmoji(), dto.getUserSlackId()))
3537
throw new IllegalArgumentException("Call Emoji already exists");
3638

3739
makersUserSlackRepository.save(dto.toEntity());
3840
}
3941

4042
@Transactional
4143
public void updateEvent(SlackUpdateEmojiEventDto dto) {
42-
MakersUserSlack makersUserSlack = makersUserSlackRepository.findByCallEmoji(dto.getCallEmoji())
43-
.orElseThrow(() -> new IllegalArgumentException("Invalid call emoji: " + dto.getCallEmoji()));
44+
MakersUserSlack makersUserSlack = makersUserSlackRepository.findByCallEmojiAndUserSlackId(dto.getCallEmoji(),
45+
dto.getUserSlackId())
46+
.orElseThrow(() -> new IllegalArgumentException(
47+
"Invalid call emoji or user slack Id : " + dto.getCallEmoji() + " " + dto.getUserSlackId()));
4448

4549
makersUserSlack.updateEmoji(dto.getUpdateCallEmoji());
4650
}
4751

4852
@Transactional
4953
public void deleteEvent(SlackDeleteEmojiEventDto dto) {
50-
if (!makersUserSlackRepository.existsByCallEmoji((dto.getCallEmoji())))
54+
if (!makersUserSlackRepository.existsByCallEmojiAndUserSlackId(dto.getCallEmoji(), dto.getUserSlackId()))
5155
throw new IllegalArgumentException("Call Emoji not exists");
52-
makersUserSlackRepository.deleteByCallEmoji(dto.getCallEmoji());
56+
57+
makersUserSlackRepository.deleteByCallEmojiAndUserSlackId(dto.getCallEmoji(), dto.getUserSlackId());
5358
}
5459

5560
public void sendMention(MethodsClient client, ReactionAddedEvent event) {
5661
String channel = event.getItem().getChannel();
5762
String user = event.getUser();
58-
MakersUserSlack slackUser = resolveSlackUser(event);
63+
List<MakersUserSlack> slackUser = resolveSlackUser(event);
5964

6065
String sendMessage = messageBuild(slackUser, user);
6166

@@ -76,22 +81,40 @@ public void sendMention(MethodsClient client, ReactionAddedEvent event) {
7681
}
7782
}
7883

79-
private MakersUserSlack resolveSlackUser(ReactionAddedEvent event) {
84+
private List<MakersUserSlack> resolveSlackUser(ReactionAddedEvent event) {
8085
String reaction = event.getReaction();
8186

82-
MakersUserSlack slackUser = makersUserSlackRepository.findByCallEmoji(reaction)
83-
.orElseThrow(() -> new IllegalArgumentException("slack 전송 오류"));
87+
List<MakersUserSlack> slackUser = makersUserSlackRepository.findByCallEmoji(reaction);
88+
89+
if (slackUser.isEmpty())
90+
throw new IllegalArgumentException("Invalid reaction emoji : " + reaction);
91+
8492
return slackUser;
8593
}
8694

87-
private String messageBuild(MakersUserSlack slackUser, String user) {
88-
String slackTemplateCd = slackUser.getSlackTemplateCd();
95+
private String messageBuild(List<MakersUserSlack> slackUsers, String user) {
96+
97+
String slackTemplateCd = extractTemplateCd(slackUsers);
8998
SlackMessageTemplate slackMessageTemplate = slackMessageTemplateRepository.findByTemplateCd(slackTemplateCd)
9099
.orElseThrow(() -> new IllegalArgumentException("해당 슬랙 메시지 템플릿이 존재하지 않습니다."));
91100
SlackMessageBuilder slackMessageBuilder = selector.selectSlackMessageBuilder(slackTemplateCd);
92101
String sendMessage = slackMessageBuilder.buildSlackMessage(slackMessageTemplate.getTemplateContent(),
93-
MessageContext.create(user, slackUser.getUserSlackId()));
102+
MessageContext.create(user, userIdList(slackUsers)));
94103
return sendMessage;
95104
}
96105

106+
private List<String> userIdList(List<MakersUserSlack> slackUsers) {
107+
return slackUsers.stream().map(MakersUserSlack::getUserSlackId).toList();
108+
}
109+
110+
private String extractTemplateCd(List<MakersUserSlack> slackUser) {
111+
if (slackUser.size() > 1) {
112+
return slackUser.stream()
113+
.map(MakersUserSlack::getSlackTemplateCd)
114+
.findFirst().orElseThrow(() -> new IllegalArgumentException("templateCd not found"));
115+
}
116+
117+
return slackUser.get(0).getSlackTemplateCd();
118+
}
119+
97120
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
11
package org.sopt.makers.crew.main.slack;
22

3+
import java.util.List;
4+
import java.util.stream.Collectors;
5+
36
public class SlackUtils {
47

58
public static String mentionFormattingUser(String slackUserId) {
69
return String.format("<@%s>", slackUserId);
710
}
11+
12+
public static String mentionFormattingUsers(List<String> slackUserIds, String delimiter) {
13+
return slackUserIds.stream()
14+
.map(SlackUtils::mentionFormattingUser)
15+
.collect(Collectors.joining(delimiter));
16+
}
817
}

main/src/main/java/org/sopt/makers/crew/main/slack/dto/SlackEmojiEventDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,15 @@ public MakersUserSlack toEntity() {
2929
@AllArgsConstructor
3030
public static class SlackUpdateEmojiEventDto {
3131
private String callEmoji;
32+
private String userSlackId;
3233
private String updateCallEmoji;
3334
}
3435

3536
@Getter
3637
@Builder
3738
@AllArgsConstructor
3839
public static class SlackDeleteEmojiEventDto {
40+
private String userSlackId;
3941
private String callEmoji;
4042
}
4143

main/src/main/java/org/sopt/makers/crew/main/slack/strategy/CallMessageBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
@RequiredArgsConstructor
1111
public class CallMessageBuilder implements SlackMessageBuilder {
1212

13+
private static final String DELIMITER = " ";
1314
private static final String TEMPLATE_CODE = "call_message";
1415

1516
@Override
1617
public String buildSlackMessage(String text, MessageContext messageContext) {
1718
return text
1819
.replace("{callUser}", SlackUtils.mentionFormattingUser(messageContext.getCallUser()))
19-
.replace("{user}", SlackUtils.mentionFormattingUser(messageContext.getCalledUser()));
20+
.replace("{user}", SlackUtils.mentionFormattingUsers(messageContext.getCalledUser(), DELIMITER));
2021
}
2122

2223
@Override

0 commit comments

Comments
 (0)