Skip to content

Commit 0abedf2

Browse files
authored
Merge pull request #101 from Cod2-Crafters/feat-conversation-interceptor
질문 인가 인터셉터 추가
2 parents f8a1594 + a55d09b commit 0abedf2

File tree

4 files changed

+95
-14
lines changed

4 files changed

+95
-14
lines changed

src/main/java/com/codecrafter/commenting/config/WebServiceConfig.java

+23-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.codecrafter.commenting.config;
22

33
import com.codecrafter.commenting.config.filter.ContentCachingFilter;
4-
import com.codecrafter.commenting.controller.interceptor.MemberSettingInterceptor;
4+
import com.codecrafter.commenting.controller.interceptor.ConversationQuestionInterceptor;
5+
import com.codecrafter.commenting.controller.interceptor.LoginCheckInterceptor;
56
import com.codecrafter.commenting.controller.interceptor.RecommendInterceptor;
67
import lombok.RequiredArgsConstructor;
78
import org.springframework.boot.web.servlet.FilterRegistrationBean;
@@ -15,23 +16,40 @@
1516
@RequiredArgsConstructor
1617
public class WebServiceConfig implements WebMvcConfigurer {
1718

18-
private final MemberSettingInterceptor memberSettingInterceptor;
19+
private final LoginCheckInterceptor loginCheckInterceptor;
1920
private final RecommendInterceptor recommendInterceptor;
21+
private final ConversationQuestionInterceptor conversationQuestionInterceptor;
2022

2123
@Override
2224
public void addInterceptors(InterceptorRegistry registry) {
23-
registry.addInterceptor(memberSettingInterceptor)
24-
.addPathPatterns("/api/member/setting/**");
25+
registry.addInterceptor(loginCheckInterceptor)
26+
.addPathPatterns(
27+
"/api/member/setting/**", // 설정 수정
28+
"/api/recommends/**",
29+
"/api/conversations/question/update", // 질문수정
30+
"/api/conversations/question/*", // 질문 삭제
31+
"/api/conversations/answer", // 답변 작성
32+
"/api/conversations/answer/update", // 답변 수정
33+
"/api/conversations/answer/*", // 답변 삭제
34+
"/api/conversations/members/*/send", // 보낸질문 조회
35+
"/api/statistics" // 통계 조회
36+
)
37+
38+
;
2539

2640
registry.addInterceptor(recommendInterceptor)
2741
.addPathPatterns("/api/recommends/**");
42+
43+
registry.addInterceptor(conversationQuestionInterceptor)
44+
.addPathPatterns("/api/conversations/question");
2845
}
2946

3047
@Bean
3148
public FilterRegistrationBean<ContentCachingFilter> contentCachingFilter() {
3249
FilterRegistrationBean<ContentCachingFilter> registrationBean = new FilterRegistrationBean<>();
3350
registrationBean.setFilter(new ContentCachingFilter());
34-
registrationBean.addUrlPatterns("/api/recommends/thanked", "/api/recommends/likes");
51+
registrationBean.addUrlPatterns("/api/recommends/thanked", "/api/recommends/likes",
52+
"/api/conversations/question");
3553
registrationBean.setOrder(Ordered.LOWEST_PRECEDENCE);
3654
return registrationBean;
3755
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.codecrafter.commenting.controller.interceptor;
2+
3+
import static com.codecrafter.commenting.util.ResponseUtil.createResponseBody;
4+
5+
import com.codecrafter.commenting.config.SecurityUtil;
6+
import com.codecrafter.commenting.domain.dto.ApiResponse;
7+
import com.codecrafter.commenting.domain.entity.MemberSetting;
8+
import com.codecrafter.commenting.domain.enumeration.ApiStatus;
9+
import com.codecrafter.commenting.domain.request.conversation.CreateConversationRequest;
10+
import com.codecrafter.commenting.repository.MemberSettingRepository;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
12+
import jakarta.servlet.http.HttpServletRequest;
13+
import jakarta.servlet.http.HttpServletResponse;
14+
import java.nio.charset.StandardCharsets;
15+
import lombok.RequiredArgsConstructor;
16+
import org.springframework.http.HttpStatus;
17+
import org.springframework.stereotype.Component;
18+
import org.springframework.util.StreamUtils;
19+
import org.springframework.web.servlet.HandlerInterceptor;
20+
21+
22+
@RequiredArgsConstructor
23+
@Component
24+
public class ConversationQuestionInterceptor implements HandlerInterceptor {
25+
26+
private final ObjectMapper objectMapper;
27+
private final MemberSettingRepository memberSettingRepository;
28+
29+
30+
@Override
31+
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
32+
String json = StreamUtils.copyToString(request.getInputStream(), StandardCharsets.UTF_8); // 바디 캐싱
33+
CreateConversationRequest createConversationRequest = objectMapper.readValue(json, CreateConversationRequest.class);
34+
Long ownerId = createConversationRequest.ownerId();
35+
36+
if (ownerId == null) {
37+
createResponseBody(
38+
response,
39+
new ApiResponse(ApiStatus.ERROR, "질문 작성 대상을 지정하지 않았습니다.", null, null),
40+
HttpStatus.FORBIDDEN
41+
);
42+
return false;
43+
}
44+
45+
MemberSetting memberSetting = memberSettingRepository.findById(ownerId).orElseThrow();
46+
Long currentMemberId = SecurityUtil.getCurrentMember().getId();
47+
48+
// 1. 받는 사람이 익명(비로그인)질문 받니?
49+
if (!memberSetting.getAllowAnonymous() && currentMemberId.equals(0L)) { // 안받고 + 비로그인
50+
createResponseBody(
51+
response,
52+
new ApiResponse(ApiStatus.ERROR, "비로그인 질문을 받지 않는 회원입니다.", null, null),
53+
HttpStatus.FORBIDDEN
54+
);
55+
return false;
56+
}
57+
58+
// 2. 받는 사람이 스페이스 일시정지 상태니?
59+
if (memberSetting.getIsSpacePaused()) {
60+
createResponseBody(
61+
response,
62+
new ApiResponse(ApiStatus.ERROR, "스페이스 일시정지 회원입니다.", null, null),
63+
HttpStatus.FORBIDDEN
64+
);
65+
return false;
66+
}
67+
68+
return true;
69+
}
70+
71+
}

src/main/java/com/codecrafter/commenting/controller/interceptor/MemberSettingInterceptor.java renamed to src/main/java/com/codecrafter/commenting/controller/interceptor/LoginCheckInterceptor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
@RequiredArgsConstructor
1717
@Component
18-
public class MemberSettingInterceptor implements HandlerInterceptor {
18+
public class LoginCheckInterceptor implements HandlerInterceptor {
1919

2020
@Override
2121
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

src/main/java/com/codecrafter/commenting/service/ConversationService.java

-8
Original file line numberDiff line numberDiff line change
@@ -153,14 +153,6 @@ public List<ConversationProfileResponse> createConversation(CreateConversationRe
153153
MemberInfo owner = memberInfoRepository.findById(request.ownerId())
154154
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 회원입니다."));
155155

156-
if (userId == 0L && !owner.getMemberSetting().getAllowAnonymous()) {
157-
throw new IllegalArgumentException("익명 유저의 질문을 거부한 회원입니다.");
158-
}
159-
160-
if (owner.getMemberSetting().getIsSpacePaused()) {
161-
throw new IllegalStateException("스페이스 일시 중지한 회원입니다.");
162-
}
163-
164156
MemberInfo guest = currentMember.getMemberInfo();
165157

166158
// 변경전 대화 마스터 최대값

0 commit comments

Comments
 (0)