Skip to content

Commit 5fcc496

Browse files
Merge branch 'develop' into CLAP-148
2 parents a0ebd44 + 2326a5c commit 5fcc496

File tree

146 files changed

+2616
-805
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

146 files changed

+2616
-805
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ dependencies {
9090
// Email Sender
9191
implementation 'org.springframework.boot:spring-boot-starter-mail'
9292

93+
// Thymeleaf
94+
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
95+
9396
// Spring aop
9497
implementation 'org.springframework.boot:spring-boot-starter-aop'
9598

src/main/java/clap/server/adapter/inbound/security/filter/JwtAuthenticationFilter.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import clap.server.adapter.outbound.jwt.JwtClaims;
44
import clap.server.adapter.outbound.jwt.access.AccessTokenClaimKeys;
5+
import clap.server.application.port.outbound.auth.ForbiddenTokenPort;
56
import clap.server.application.port.outbound.auth.JwtProvider;
67
import clap.server.exception.JwtException;
78
import clap.server.exception.code.AuthErrorCode;
@@ -27,7 +28,6 @@
2728

2829
import java.io.IOException;
2930

30-
// 요청에서 JWT 토큰을 추출하고 유효성을 검사합니다.
3131
@Slf4j
3232
@Component
3333
@RequiredArgsConstructor
@@ -37,6 +37,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
3737
private final JwtProvider accessTokenProvider;
3838
private final JwtProvider temporaryTokenProvider;
3939
private final AccessDeniedHandler accessDeniedHandler;
40+
private final ForbiddenTokenPort forbiddenTokenPort;
4041

4142
@Override
4243
protected void doFilterInternal(
@@ -70,15 +71,15 @@ private String resolveAccessToken(
7071
HttpServletRequest request
7172
) throws ServletException {
7273
String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
73-
String token = accessTokenProvider.resolveToken(authHeader);
74+
String accessToken = accessTokenProvider.resolveToken(authHeader);
7475

75-
if (!StringUtils.hasText(token)) {
76+
if (!StringUtils.hasText(accessToken)) {
7677
log.error("EMPTY_ACCESS_TOKEN");
7778
handleAuthException(AuthErrorCode.EMPTY_ACCESS_KEY);
7879
}
7980

8081
String requestUrl = request.getRequestURI();
81-
boolean isTemporaryToken = isTemporaryToken(token);
82+
boolean isTemporaryToken = isTemporaryToken(accessToken);
8283
JwtProvider tokenProvider = isTemporaryToken ? temporaryTokenProvider : accessTokenProvider;
8384

8485
log.info("Token is Temporary {}", isTemporaryToken);
@@ -88,14 +89,17 @@ private String resolveAccessToken(
8889
handleAuthException(AuthErrorCode.FORBIDDEN_ACCESS_TOKEN);
8990
}
9091

91-
// TODO: 블랙리스트 토큰 처리 로직 추가 필요
92+
if (forbiddenTokenPort.getIsForbidden(accessToken)) {
93+
log.error("FORBIDDEN_ACCESS_TOKEN");
94+
handleAuthException(AuthErrorCode.FORBIDDEN_ACCESS_TOKEN);
95+
}
9296

93-
if (tokenProvider.isTokenExpired(token)) {
97+
if (tokenProvider.isTokenExpired(accessToken)) {
9498
log.error("EXPIRED_TOKEN");
9599
handleAuthException(AuthErrorCode.EXPIRED_TOKEN);
96100
}
97101

98-
return token;
102+
return accessToken;
99103
}
100104

101105

src/main/java/clap/server/adapter/inbound/web/admin/AddCategoryController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import org.springframework.web.bind.annotation.RequestBody;
1616
import org.springframework.web.bind.annotation.RequestMapping;
1717

18-
@Tag(name = "카테고리 추가")
18+
@Tag(name = "05. Admin")
1919
@WebAdapter
2020
@RequiredArgsConstructor
2121
@RequestMapping("/api/management")

src/main/java/clap/server/adapter/inbound/web/admin/ManageMemberController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
import org.springframework.web.bind.annotation.RequestBody;
1616
import org.springframework.web.bind.annotation.RequestMapping;
1717

18-
@Tag(name = "회원 관리 - 수정/ 삭제")
18+
@Tag(name = "05. Admin")
1919
@WebAdapter
2020
@RequiredArgsConstructor
2121
@RequestMapping("/api/managements/members")
2222
public class ManageMemberController {
2323
private final ManageMemberUsecase manageMemberUsecase;
2424

25-
@Operation(summary = "단일 회원 등록 API")
25+
@Operation(summary = "회원 정보 수정 API")
2626
@PostMapping("/{memberId}")
2727
@Secured("ROLE_ADMIN")
2828
public void registerMember(@AuthenticationPrincipal SecurityUserDetails userInfo,

src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import org.springframework.web.bind.annotation.RequestBody;
1515
import org.springframework.web.bind.annotation.RequestMapping;
1616

17-
@Tag(name = "회원 관리 - 등록")
17+
@Tag(name = "05. Admin")
1818
@WebAdapter
1919
@RequiredArgsConstructor
2020
@RequestMapping("/api/managements")

src/main/java/clap/server/adapter/inbound/web/auth/AuthController.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
package clap.server.adapter.inbound.web.auth;
22

3+
import clap.server.adapter.inbound.security.SecurityUserDetails;
34
import clap.server.adapter.inbound.web.dto.auth.LoginRequest;
45
import clap.server.adapter.inbound.web.dto.auth.LoginResponse;
56
import clap.server.application.port.inbound.auth.AuthUsecase;
67
import clap.server.common.annotation.architecture.WebAdapter;
78
import io.swagger.v3.oas.annotations.Operation;
9+
import io.swagger.v3.oas.annotations.Parameter;
810
import io.swagger.v3.oas.annotations.tags.Tag;
911
import jakarta.servlet.http.HttpServletRequest;
1012
import lombok.RequiredArgsConstructor;
1113
import lombok.extern.slf4j.Slf4j;
1214
import org.springframework.http.ResponseEntity;
13-
import org.springframework.web.bind.annotation.PostMapping;
14-
import org.springframework.web.bind.annotation.RequestBody;
15-
import org.springframework.web.bind.annotation.RequestHeader;
16-
import org.springframework.web.bind.annotation.RequestMapping;
15+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
16+
import org.springframework.web.bind.annotation.*;
1717

1818
import static clap.server.common.utils.ClientIpParseUtil.getClientIp;
1919

2020
@Slf4j
21-
@Tag(name = "로그인 / 로그아웃")
21+
@Tag(name = "00. Auth", description = "로그인, 로그아웃, 토큰 재발급 API")
2222
@WebAdapter
2323
@RequiredArgsConstructor
2424
@RequestMapping("/api/auths")
@@ -35,5 +35,13 @@ public ResponseEntity<LoginResponse> login(@RequestHeader(name = "sessionId") St
3535
return ResponseEntity.ok(response);
3636
}
3737

38+
@Operation(summary = "로그아웃 API")
39+
@DeleteMapping("/logout")
40+
public void logout(@AuthenticationPrincipal SecurityUserDetails userInfo,
41+
@Parameter(hidden = true) @RequestHeader(value = "Authorization") String authHeader,
42+
@RequestHeader(value = "refreshToken") String refreshToken) {
43+
String accessToken = authHeader.split(" ")[1];
44+
authUsecase.logout(userInfo.getUserId(), accessToken, refreshToken);
45+
}
3846

3947
}

src/main/java/clap/server/adapter/inbound/web/auth/ReissueTokenController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import org.springframework.web.bind.annotation.RequestHeader;
1212
import org.springframework.web.bind.annotation.RequestMapping;
1313

14-
@Tag(name = "토큰 재발급")
14+
@Tag(name = "00. Auth")
1515
@WebAdapter
1616
@RequiredArgsConstructor
1717
@RequestMapping("/api/auths")

src/main/java/clap/server/adapter/inbound/web/dto/admin/FindManagersResponse.java

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package clap.server.adapter.inbound.web.dto.common;
2+
3+
4+
import java.util.List;
5+
6+
public record SliceResponse<T> (
7+
List<T> content,
8+
boolean hasNext,
9+
boolean isFirst,
10+
boolean isLast
11+
) {
12+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package clap.server.adapter.inbound.web.dto.notification;
2+
3+
import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType;
4+
5+
public record SseRequest(
6+
String taskTitle,
7+
NotificationType notificationType,
8+
Long receiverId,
9+
String message
10+
) {
11+
}

0 commit comments

Comments
 (0)