Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE]: Slack 알림 인터페이스 분리 #473

Open
wants to merge 6 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.woowacourse.moamoa.alarm;
package com.woowacourse.moamoa.alarm.config;

import java.util.concurrent.Executor;
import org.springframework.context.annotation.Configuration;
Expand All @@ -8,7 +8,7 @@

@Configuration
@EnableAsync
public class AsyncConfig extends AsyncConfigurerSupport {
public class AlarmAsyncConfig extends AsyncConfigurerSupport {

@Override
public Executor getAsyncExecutor() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.woowacourse.moamoa.study.service;
package com.woowacourse.moamoa.alarm.service;

import com.woowacourse.moamoa.alarm.SlackAlarmSender;
import com.woowacourse.moamoa.alarm.SlackUsersClient;
import com.woowacourse.moamoa.alarm.service.alarmuserclient.AlarmUserClient;
import com.woowacourse.moamoa.alarm.service.alarmsender.AlarmSender;
import com.woowacourse.moamoa.member.domain.Member;
import com.woowacourse.moamoa.member.domain.repository.MemberRepository;
import com.woowacourse.moamoa.member.service.exception.MemberNotFoundException;
Expand All @@ -13,19 +13,19 @@
import org.springframework.transaction.annotation.Transactional;

@Service
public class AsyncService {
public class AlarmService {

private final StudyRepository studyRepository;
private final MemberRepository memberRepository;
private final SlackUsersClient slackUsersClient;
private final SlackAlarmSender slackAlarmSender;
private final AlarmUserClient alarmUserClient;
private final AlarmSender alarmSender;

public AsyncService(final StudyRepository studyRepository, final MemberRepository memberRepository,
final SlackUsersClient slackUsersClient, final SlackAlarmSender slackAlarmSender) {
public AlarmService(final StudyRepository studyRepository, final MemberRepository memberRepository,
final AlarmUserClient alarmUserClient, final AlarmSender alarmSender) {
this.studyRepository = studyRepository;
this.memberRepository = memberRepository;
this.slackUsersClient = slackUsersClient;
this.slackAlarmSender = slackAlarmSender;
this.alarmUserClient = alarmUserClient;
this.alarmSender = alarmSender;
}

@Transactional(readOnly = true)
Expand All @@ -38,9 +38,9 @@ public String getOwnerEmail(final Long studyId) {
}

@Async
public void send(final Long studyId) {
public void send(final Long studyId) {
final String email = getOwnerEmail(studyId);
final String channel = slackUsersClient.getUserChannelByEmail(email);
slackAlarmSender.requestSlackMessage(channel);
final String channel = alarmUserClient.getUserChannel(email);
alarmSender.sendMessage(channel);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.woowacourse.moamoa.alarm.service.alarmsender;

public interface AlarmSender {

void sendMessage(final String channel);
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package com.woowacourse.moamoa.alarm;
package com.woowacourse.moamoa.alarm.service.alarmsender;

import static org.springframework.http.HttpHeaders.AUTHORIZATION;
import static org.springframework.http.HttpHeaders.CONTENT_TYPE;
import static org.springframework.http.HttpMethod.POST;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;

import com.slack.api.model.Attachment;
import com.woowacourse.moamoa.alarm.request.SlackMessageRequest;
import com.woowacourse.moamoa.alarm.service.request.SlackMessageRequest;
import com.woowacourse.moamoa.alarm.service.alarmsender.AlarmSender;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class SlackAlarmSender {
public class SlackAlarmSender implements AlarmSender {

private final String authorization;
private final String sendMessageUri;
Expand All @@ -31,7 +31,8 @@ public SlackAlarmSender(@Value("${slack.authorization}") final String authorizat
this.restTemplate = restTemplate;
}

public void requestSlackMessage(final String channel) {
@Override
public void sendMessage(final String channel) {
final SlackMessageRequest slackMessageRequest = setSlackMessage(channel);

HttpEntity<SlackMessageRequest> request = new HttpEntity<>(slackMessageRequest, headers());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.woowacourse.moamoa.alarm.service.alarmuserclient;

public interface AlarmUserClient {

String getUserChannel(final String identifier);
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.woowacourse.moamoa.alarm;
package com.woowacourse.moamoa.alarm.service.alarmuserclient;

import static org.springframework.http.HttpHeaders.AUTHORIZATION;
import static org.springframework.http.HttpHeaders.CONTENT_TYPE;
import static org.springframework.http.HttpMethod.GET;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;

import com.woowacourse.moamoa.alarm.response.SlackUserResponse;
import com.woowacourse.moamoa.alarm.response.SlackUsersResponse;
import com.woowacourse.moamoa.alarm.service.response.SlackUserResponse;
import com.woowacourse.moamoa.alarm.service.response.SlackUsersResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
Expand All @@ -15,7 +15,7 @@
import org.springframework.web.client.RestTemplate;

@Component
public class SlackUsersClient {
public class SlackUsersClient implements AlarmUserClient {

private final String authorization;
private final String usersUri;
Expand All @@ -29,7 +29,21 @@ public SlackUsersClient(@Value("${slack.authorization}") final String authorizat
this.restTemplate = restTemplate;
}

public SlackUsersResponse requestSlackUsers() {
@Override
public String getUserChannel(final String email) {
SlackUserResponse slackUser = getSlackUser(email, requestSlackUsers());
return slackUser.getChannel();
}

private SlackUserResponse getSlackUser(final String email, final SlackUsersResponse response) {
return response.getResponses()
.stream()
.filter(slackUser -> email.equals(slackUser.getSlackUserProfile().getEmail()))
.findAny()
.orElseThrow(() -> new RuntimeException("슬랙에서 사용자를 찾지 못 했습니다."));
}

private SlackUsersResponse requestSlackUsers() {
HttpEntity<SlackUsersResponse> request = new HttpEntity<>(headers());
final ResponseEntity<SlackUsersResponse> response = restTemplate
.exchange(usersUri, GET, request, SlackUsersResponse.class);
Expand All @@ -46,17 +60,4 @@ private HttpHeaders headers() {
headers.add(CONTENT_TYPE, APPLICATION_JSON_VALUE);
return headers;
}

public String getUserChannelByEmail(final String email) {
SlackUserResponse slackUser = getSlackUser(email, requestSlackUsers());
return slackUser.getChannel();
}

private SlackUserResponse getSlackUser(final String email, final SlackUsersResponse response) {
return response.getResponses()
.stream()
.filter(slackUser -> email.equals(slackUser.getSlackUserProfile().getEmail()))
.findAny()
.orElseThrow(() -> new RuntimeException("슬랙에서 사용자를 찾지 못 했습니다."));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.woowacourse.moamoa.alarm.request;
package com.woowacourse.moamoa.alarm.service.request;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.slack.api.model.Attachment;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.woowacourse.moamoa.alarm;
package com.woowacourse.moamoa.alarm.service.response;

import lombok.AccessLevel;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.woowacourse.moamoa.alarm.response;
package com.woowacourse.moamoa.alarm.service.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.woowacourse.moamoa.alarm.SlackUserProfile;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.woowacourse.moamoa.alarm.response;
package com.woowacourse.moamoa.alarm.service.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.woowacourse.moamoa.auth.infrastructure;
package com.woowacourse.moamoa.auth.service.oauthclient;

import com.woowacourse.moamoa.auth.service.oauthclient.OAuthClient;
import com.woowacourse.moamoa.common.exception.UnauthorizedException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.woowacourse.moamoa.study.controller;

import com.woowacourse.moamoa.auth.config.AuthenticatedMemberId;
import com.woowacourse.moamoa.study.service.AsyncService;
import com.woowacourse.moamoa.alarm.service.AlarmService;
import com.woowacourse.moamoa.study.service.StudyParticipantService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
Expand All @@ -15,20 +15,20 @@
public class StudyParticipantController {

private final StudyParticipantService studyParticipantService;
private final AsyncService asyncService;
private final AlarmService alarmService;

public StudyParticipantController(final StudyParticipantService studyParticipantService,
final AsyncService asyncService) {
final AlarmService alarmService) {
this.studyParticipantService = studyParticipantService;
this.asyncService = asyncService;
this.alarmService = alarmService;
}

@PostMapping
public ResponseEntity<Void> participateStudy(
@AuthenticatedMemberId final Long memberId, @PathVariable("study-id") final Long studyId
) {
studyParticipantService.participateStudy(memberId, studyId);
asyncService.send(studyId);
alarmService.send(studyId);
return ResponseEntity.noContent().build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@
import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.slack.api.model.Attachment;
import com.woowacourse.moamoa.alarm.SlackUserProfile;
import com.woowacourse.moamoa.alarm.request.SlackMessageRequest;
import com.woowacourse.moamoa.alarm.response.SlackUserResponse;
import com.woowacourse.moamoa.alarm.response.SlackUsersResponse;
import com.woowacourse.moamoa.alarm.service.response.SlackUserProfile;
import com.woowacourse.moamoa.alarm.service.request.SlackMessageRequest;
import com.woowacourse.moamoa.alarm.service.response.SlackUserResponse;
import com.woowacourse.moamoa.alarm.service.response.SlackUsersResponse;
import com.woowacourse.moamoa.auth.config.AuthConfig;

import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -23,7 +22,6 @@
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.test.web.client.MockRestServiceServer;
import org.springframework.web.client.RestTemplate;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import com.slack.api.model.Attachment;
import com.woowacourse.acceptance.document.StudyDocument;
import com.woowacourse.moamoa.alarm.request.SlackMessageRequest;
import com.woowacourse.moamoa.alarm.service.request.SlackMessageRequest;
import com.woowacourse.moamoa.comment.service.request.CommentRequest;
import com.woowacourse.moamoa.study.service.response.StudyDetailResponse;
import com.woowacourse.moamoa.studyroom.domain.article.ArticleType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@
import static org.springframework.restdocs.request.RequestDocumentation.requestParameters;
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;

import com.slack.api.model.Attachment;
import com.woowacourse.acceptance.AcceptanceTest;
import com.woowacourse.moamoa.alarm.request.SlackMessageRequest;
import com.woowacourse.moamoa.member.query.data.MemberData;
import com.woowacourse.moamoa.member.service.response.MemberResponse;
import com.woowacourse.moamoa.study.domain.StudyStatus;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

import com.slack.api.model.Attachment;
import com.woowacourse.acceptance.AcceptanceTest;
import com.woowacourse.moamoa.alarm.request.SlackMessageRequest;
import com.woowacourse.moamoa.alarm.service.request.SlackMessageRequest;
import com.woowacourse.moamoa.member.service.response.MemberResponse;
import com.woowacourse.moamoa.studyroom.service.request.LinkArticleRequest;
import com.woowacourse.moamoa.studyroom.service.response.AuthorResponse;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
import static org.mockito.Mockito.when;

import com.woowacourse.acceptance.AcceptanceTest;
import com.woowacourse.moamoa.alarm.SlackAlarmSender;
import com.woowacourse.moamoa.alarm.SlackUserProfile;
import com.woowacourse.moamoa.alarm.SlackUsersClient;
import com.woowacourse.moamoa.alarm.response.SlackUserResponse;
import com.woowacourse.moamoa.alarm.service.alarmsender.SlackAlarmSender;
import com.woowacourse.moamoa.alarm.service.response.SlackUserProfile;
import com.woowacourse.moamoa.alarm.service.alarmuserclient.SlackUsersClient;
import com.woowacourse.moamoa.alarm.service.response.SlackUserResponse;
import com.woowacourse.moamoa.auth.service.oauthclient.OAuthClient;
import com.woowacourse.moamoa.auth.service.oauthclient.response.GithubProfileResponse;
import io.restassured.RestAssured;
Expand Down Expand Up @@ -47,8 +47,8 @@ void concurrentlyParticipateStudy() {
.collect(Collectors.toList());

for (SlackUserResponse profile : users) {
when(slackUsersClient.getUserChannelByEmail(profile.getSlackUserProfile().getEmail())).thenReturn(profile.getChannel());
doNothing().when(slackAlarmSender).requestSlackMessage(profile.getChannel());
when(slackUsersClient.getUserChannel(profile.getSlackUserProfile().getEmail())).thenReturn(profile.getChannel());
doNothing().when(slackAlarmSender).sendMessage(profile.getChannel());
}

// act
Expand Down Expand Up @@ -77,8 +77,8 @@ void concurrentlyLeaveStudy() {
.collect(Collectors.toList());

for (SlackUserResponse profile : users) {
when(slackUsersClient.getUserChannelByEmail(profile.getSlackUserProfile().getEmail())).thenReturn(profile.getChannel());
doNothing().when(slackAlarmSender).requestSlackMessage(profile.getChannel());
when(slackUsersClient.getUserChannel(profile.getSlackUserProfile().getEmail())).thenReturn(profile.getChannel());
doNothing().when(slackAlarmSender).sendMessage(profile.getChannel());
}

for (GithubProfileResponse 프로필 : 탈퇴를_원하는_사용자) {
Expand Down Expand Up @@ -112,8 +112,8 @@ void concurrentlyParticipateOrLeaveStudy() {
.collect(Collectors.toList());

for (SlackUserResponse profile : users) {
when(slackUsersClient.getUserChannelByEmail(profile.getSlackUserProfile().getEmail())).thenReturn(profile.getChannel());
doNothing().when(slackAlarmSender).requestSlackMessage(profile.getChannel());
when(slackUsersClient.getUserChannel(profile.getSlackUserProfile().getEmail())).thenReturn(profile.getChannel());
doNothing().when(slackAlarmSender).sendMessage(profile.getChannel());
}

for (GithubProfileResponse 프로필 : 탈퇴를_원하는_사용자) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.woowacourse.moamoa.common;

import com.woowacourse.moamoa.alarm.SlackAlarmSender;
import com.woowacourse.moamoa.alarm.SlackUsersClient;
import com.woowacourse.moamoa.alarm.service.alarmsender.SlackAlarmSender;
import com.woowacourse.moamoa.alarm.service.alarmuserclient.SlackUsersClient;
import com.woowacourse.moamoa.common.config.JpaAuditingConfig;
import com.woowacourse.moamoa.study.service.AsyncService;
import com.woowacourse.moamoa.alarm.service.AlarmService;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
Expand All @@ -18,6 +18,6 @@
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@DataJpaTest(includeFilters = @Filter(type = FilterType.ANNOTATION, classes = Repository.class))
@Import({JpaAuditingConfig.class, CategoryAndTagsSaver.class, AsyncService.class, RestTemplate.class, SlackAlarmSender.class, SlackUsersClient.class})
@Import({JpaAuditingConfig.class, CategoryAndTagsSaver.class, AlarmService.class, RestTemplate.class, SlackAlarmSender.class, SlackUsersClient.class})
public @interface RepositoryTest {
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
import static org.mockito.Mockito.when;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.woowacourse.moamoa.alarm.SlackAlarmSender;
import com.woowacourse.moamoa.alarm.SlackUsersClient;
import com.woowacourse.moamoa.alarm.service.alarmsender.SlackAlarmSender;
import com.woowacourse.moamoa.alarm.service.alarmuserclient.SlackUsersClient;
import com.woowacourse.moamoa.auth.controller.interceptor.PathMatcherContainer;
import com.woowacourse.moamoa.auth.controller.interceptor.PathMatcherInterceptor;
import com.woowacourse.moamoa.auth.infrastructure.GithubOAuthClient;
import com.woowacourse.moamoa.auth.service.oauthclient.GithubOAuthClient;
import com.woowacourse.moamoa.auth.infrastructure.JwtTokenProvider;
import com.woowacourse.moamoa.auth.infrastructure.TokenProvider;
import com.woowacourse.moamoa.member.domain.Member;
Expand Down
Loading