Skip to content

Commit d59604d

Browse files
authored
Merge pull request #381 from TaskFlow-CLAP/CLAP-310
�CLAP-310 관리자 회원 정보 수정 api request 변경 및 비밀번호 재설정 인증번호 로직 수정 및 시큐리티 설정
2 parents a86a574 + 6326999 commit d59604d

23 files changed

+93
-68
lines changed

src/main/java/clap/server/adapter/inbound/security/SecurityConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ private AbstractRequestMatcherRegistry<AuthorizeHttpRequestsConfigurer<HttpSecur
8585
.requestMatchers(LOGIN_ENDPOINT).permitAll()
8686
.requestMatchers(HEALTH_CHECK_ENDPOINT).permitAll()
8787
.requestMatchers(REISSUANCE_ENDPOINT).permitAll()
88+
.requestMatchers(PASSWORD_EMAIL_ENDPOINT).permitAll()
8889
.requestMatchers(SWAGGER_ENDPOINTS).permitAll();
8990
}
9091

src/main/java/clap/server/adapter/inbound/security/WebSecurityUrl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ private WebSecurityUrl() {
1313
"/swagger-ui/**", "/swagger"
1414
};
1515
public static final String REISSUANCE_ENDPOINT = "/api/auths/reissuance";
16+
public static final String PASSWORD_EMAIL_ENDPOINT = "/api/verifications/**";
1617
public static final String TEMPORARY_TOKEN_ALLOWED_ENDPOINT = "/api/members/initial-password";
1718
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
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.forbidden.ForbiddenTokenPort;
65
import clap.server.application.port.outbound.auth.JwtProvider;
6+
import clap.server.application.port.outbound.auth.forbidden.ForbiddenTokenPort;
77
import clap.server.exception.JwtException;
88
import clap.server.exception.code.AuthErrorCode;
99
import io.jsonwebtoken.Claims;
@@ -49,7 +49,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
4949
SWAGGER_ENDPOINTS
5050
).flatMap(Arrays::stream).toArray(String[]::new);
5151

52-
public static final String[] ANONYMOUS_ENDPOINTS = {LOGIN_ENDPOINT, REISSUANCE_ENDPOINT};
52+
public static final String[] ANONYMOUS_ENDPOINTS = {LOGIN_ENDPOINT, REISSUANCE_ENDPOINT, PASSWORD_EMAIL_ENDPOINT};
5353

5454
@Override
5555
protected void doFilterInternal(

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package clap.server.adapter.inbound.web.admin;
22

33
import clap.server.adapter.inbound.web.dto.admin.response.FindAllDepartmentsResponse;
4-
import clap.server.application.mapper.DepartmentResponseMapper;
54
import clap.server.application.port.inbound.admin.FindAllDepartmentsUsecase;
65
import clap.server.common.annotation.architecture.WebAdapter;
76
import io.swagger.v3.oas.annotations.Operation;
87
import io.swagger.v3.oas.annotations.tags.Tag;
98
import lombok.RequiredArgsConstructor;
9+
import org.springframework.http.ResponseEntity;
1010
import org.springframework.security.access.annotation.Secured;
1111
import org.springframework.web.bind.annotation.GetMapping;
1212
import org.springframework.web.bind.annotation.RequestMapping;
@@ -23,10 +23,7 @@ public class FindDepartmentController {
2323
@Operation(summary = "부서 조회 API")
2424
@Secured("ROLE_ADMIN")
2525
@GetMapping("/departments")
26-
public List<FindAllDepartmentsResponse> findAllDepartments() {
27-
return findAllDepartmentsUsecase.findAllDepartments()
28-
.stream()
29-
.map(DepartmentResponseMapper::toFindAllDepartmentsResponse)
30-
.toList();
26+
public ResponseEntity<List<FindAllDepartmentsResponse>> findAllDepartments() {
27+
return ResponseEntity.ok(findAllDepartmentsUsecase.findAllDepartments());
3128
}
3229
}

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import clap.server.exception.code.FileErrorcode;
1010
import io.swagger.v3.oas.annotations.Operation;
1111
import io.swagger.v3.oas.annotations.tags.Tag;
12+
import lombok.RequiredArgsConstructor;
1213
import org.springframework.http.ResponseEntity;
1314
import org.springframework.security.access.annotation.Secured;
1415
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -21,23 +22,19 @@
2122

2223
@Tag(name = "05. Admin [회원 관리]")
2324
@WebAdapter
25+
@RequiredArgsConstructor
2426
@RequestMapping("/api/managements")
2527
public class RegisterMemberCsvController {
2628
private final RegisterMemberCSVUsecase registerMemberCSVUsecase;
2729

28-
public RegisterMemberCsvController(RegisterMemberCSVUsecase registerMemberCSVUsecase) {
29-
this.registerMemberCSVUsecase = registerMemberCSVUsecase;
30-
}
31-
3230
@Operation(summary = "CSV 파일로 회원 등록 API")
3331
@PostMapping("/members/upload")
3432
@Secured("ROLE_ADMIN")
3533
public ResponseEntity<String> registerMembersFromCsv(
3634
@AuthenticationPrincipal SecurityUserDetails userInfo,
3735
@RequestParam("file") MultipartFile file) throws IOException {
3836
if (!FileTypeValidator.validCSVFile(file.getInputStream())) {
39-
throw new AdapterException(FileErrorcode.UNSUPPORTED_FILE_TYPE);
40-
}
37+
throw new AdapterException(FileErrorcode.UNSUPPORTED_FILE_TYPE);}
4138
int addedCount = registerMemberCSVUsecase.registerMembersFromCsv(userInfo.getUserId(), file);
4239
return ResponseEntity.ok(addedCount + "명의 회원이 등록되었습니다.");
4340
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ public record UpdateMemberRequest(
1212
@NotBlank
1313
@Pattern(regexp = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$",
1414
message = "올바른 이메일 형식이 아닙니다.")
15-
@Schema(description = "회원 이메일", example = "siena@gmail.com")
16-
String email,
1715
@NotNull @Schema(description = "승인 권한 여부")
1816
Boolean isReviewer,
1917
@NotNull @Schema(description = "부서 ID")
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.member.response;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
5+
public record SendVerificationCodeRequest(
6+
@NotBlank
7+
String nickname,
8+
@NotBlank
9+
String email
10+
) {
11+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
package clap.server.adapter.inbound.web.dto.member.response;
3+
4+
import jakarta.validation.constraints.NotBlank;
5+
6+
public record VerifyCodeRequest(
7+
@NotBlank
8+
String email,
9+
@NotBlank
10+
String code
11+
) {
12+
}
Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,34 @@
11
package clap.server.adapter.inbound.web.member;
22

3-
import clap.server.adapter.inbound.security.service.SecurityUserDetails;
3+
import clap.server.adapter.inbound.web.dto.member.response.SendVerificationCodeRequest;
4+
import clap.server.adapter.inbound.web.dto.member.response.VerifyCodeRequest;
45
import clap.server.application.port.inbound.member.SendVerificationEmailUsecase;
56
import clap.server.application.port.inbound.member.VerifyEmailCodeUsecase;
67
import clap.server.common.annotation.architecture.WebAdapter;
78
import io.swagger.v3.oas.annotations.Operation;
89
import io.swagger.v3.oas.annotations.tags.Tag;
910
import lombok.RequiredArgsConstructor;
10-
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1111
import org.springframework.web.bind.annotation.PostMapping;
12+
import org.springframework.web.bind.annotation.RequestBody;
1213
import org.springframework.web.bind.annotation.RequestMapping;
13-
import org.springframework.web.bind.annotation.RequestParam;
1414

1515
@Tag(name = "00. Auth [인증번호]")
1616
@WebAdapter
1717
@RequiredArgsConstructor
18-
@RequestMapping("/api/members")
18+
@RequestMapping("/api")
1919
public class EmailVerificationController {
2020
private final SendVerificationEmailUsecase sendVerificationEmailUsecase;
2121
private final VerifyEmailCodeUsecase verifyEmailCodeUsecase;
2222

2323
@Operation(summary = "인증번호 전송 API")
24-
@PostMapping("/verification/email")
25-
public void sendVerificationEmail(@AuthenticationPrincipal SecurityUserDetails userInfo){
26-
sendVerificationEmailUsecase.sendVerificationCode(userInfo.getUserId());
24+
@PostMapping("/verifications/email")
25+
public void sendVerificationEmail(@RequestBody SendVerificationCodeRequest request) {
26+
sendVerificationEmailUsecase.sendVerificationCode(request);
2727
}
2828

2929
@Operation(summary = "인증번호 검증 API")
30-
@PostMapping("/verification")
31-
public void sendVerificationEmail(@AuthenticationPrincipal SecurityUserDetails userInfo,
32-
@RequestParam String code){
33-
verifyEmailCodeUsecase.verifyEmailCode(userInfo.getUserId(), code);
30+
@PostMapping("/verifications")
31+
public void sendVerificationEmail(@RequestBody VerifyCodeRequest request) {
32+
verifyEmailCodeUsecase.verifyEmailCode(request);
3433
}
3534
}

src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ public class MemberPersistenceAdapter implements LoadMemberPort, CommandMemberPo
3232
private final MemberPersistenceMapper memberPersistenceMapper;
3333
private final TaskRepository taskRepository;
3434
private final TaskPersistenceMapper taskPersistenceMapper;
35-
private final JPAQueryFactory jpaQueryFactory;
3635

3736
@Override
3837
public Optional<Member> findById(final Long id) {
@@ -110,5 +109,10 @@ public Page<Member> findAllMembers(Pageable pageable) {
110109
public Page<Member> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) {
111110
return memberRepository.findMembersWithFilter(pageable, filterRequest,sortDirection).map(memberPersistenceMapper::toDomain);
112111
}
112+
113+
@Override
114+
public Optional<Member> findByNicknameOrEmail(String nickname, String email) {
115+
return memberRepository.findByNicknameAndEmail(nickname, email).map(memberPersistenceMapper::toDomain);
116+
}
113117
}
114118

0 commit comments

Comments
 (0)