Skip to content

Commit ca85227

Browse files
committed
Merge branch 'develop' of https://github.com/TaskFlow-CLAP/TaskFlow-Server into develop
2 parents 1ea4568 + 75a3412 commit ca85227

22 files changed

+220
-42
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +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/**";
16+
public static final String PASSWORD_EMAIL_ENDPOINT = "/api/new-password";
1717
public static final String TEMPORARY_TOKEN_ALLOWED_ENDPOINT = "/api/members/initial-password";
1818
}

src/main/java/clap/server/adapter/inbound/web/member/EmailVerificationController.java renamed to src/main/java/clap/server/adapter/inbound/web/auth/EmailVerificationController.java

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

3-
import clap.server.adapter.inbound.web.dto.member.response.SendVerificationCodeRequest;
4-
import clap.server.adapter.inbound.web.dto.member.response.VerifyCodeRequest;
3+
import clap.server.adapter.inbound.web.dto.member.request.SendVerificationCodeRequest;
4+
import clap.server.adapter.inbound.web.dto.member.request.VerifyCodeRequest;
55
import clap.server.application.port.inbound.member.SendVerificationEmailUsecase;
66
import clap.server.application.port.inbound.member.VerifyEmailCodeUsecase;
77
import clap.server.common.annotation.architecture.WebAdapter;
@@ -20,12 +20,14 @@ public class EmailVerificationController {
2020
private final SendVerificationEmailUsecase sendVerificationEmailUsecase;
2121
private final VerifyEmailCodeUsecase verifyEmailCodeUsecase;
2222

23+
@Deprecated
2324
@Operation(summary = "인증번호 전송 API")
2425
@PostMapping("/verifications/email")
2526
public void sendVerificationEmail(@RequestBody SendVerificationCodeRequest request) {
2627
sendVerificationEmailUsecase.sendVerificationCode(request);
2728
}
2829

30+
@Deprecated
2931
@Operation(summary = "인증번호 검증 API")
3032
@PostMapping("/verifications")
3133
public void sendVerificationEmail(@RequestBody VerifyCodeRequest request) {

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@
99
public record UpdateMemberRequest(
1010
@NotBlank @Schema(description = "회원 이름", example = "서주원")
1111
String name,
12-
@NotBlank
13-
@Pattern(regexp = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$",
14-
message = "올바른 이메일 형식이 아닙니다.")
1512
@NotNull @Schema(description = "승인 권한 여부")
1613
Boolean isReviewer,
1714
@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.request;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
5+
public record SendInitialPasswordRequest(
6+
@NotBlank
7+
String name,
8+
@NotBlank
9+
String email
10+
){
11+
}

src/main/java/clap/server/adapter/inbound/web/dto/member/response/SendVerificationCodeRequest.java renamed to src/main/java/clap/server/adapter/inbound/web/dto/member/request/SendVerificationCodeRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package clap.server.adapter.inbound.web.dto.member.response;
1+
package clap.server.adapter.inbound.web.dto.member.request;
22

33
import jakarta.validation.constraints.NotBlank;
44

src/main/java/clap/server/adapter/inbound/web/dto/member/response/VerifyCodeRequest.java renamed to src/main/java/clap/server/adapter/inbound/web/dto/member/request/VerifyCodeRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
package clap.server.adapter.inbound.web.dto.member.response;
2+
package clap.server.adapter.inbound.web.dto.member.request;
33

44
import jakarta.validation.constraints.NotBlank;
55

src/main/java/clap/server/adapter/inbound/web/member/ResetPasswordController.java

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

33
import clap.server.adapter.inbound.security.service.SecurityUserDetails;
4+
import clap.server.adapter.inbound.web.dto.member.request.SendInitialPasswordRequest;
45
import clap.server.adapter.inbound.web.dto.member.request.UpdateInitialPasswordRequest;
56
import clap.server.adapter.inbound.web.dto.member.request.UpdatePasswordRequest;
67
import clap.server.adapter.inbound.web.dto.member.request.VerifyPasswordRequest;
78
import clap.server.application.port.inbound.member.ResetInitialPasswordUsecase;
89
import clap.server.application.port.inbound.member.ResetPasswordUsecase;
10+
import clap.server.application.port.inbound.member.SendNewPasswordUsecase;
911
import clap.server.application.port.inbound.member.VerifyPasswordUseCase;
1012
import clap.server.common.annotation.architecture.WebAdapter;
1113
import io.swagger.v3.oas.annotations.Operation;
@@ -23,6 +25,7 @@ public class ResetPasswordController {
2325
private final ResetPasswordUsecase resetPasswordUsecase;
2426
private final ResetInitialPasswordUsecase resetInitialPasswordUsecase;
2527
private final VerifyPasswordUseCase verifyPasswordUseCase;
28+
private final SendNewPasswordUsecase sendNewPasswordUsecase;
2629

2730
@Operation(summary = "초기 로그인 후 비밀번호 재설정 API")
2831
@PatchMapping("/members/initial-password")
@@ -45,4 +48,10 @@ public void verifyPassword(@AuthenticationPrincipal SecurityUserDetails userInfo
4548
@RequestBody @Valid VerifyPasswordRequest request) {
4649
verifyPasswordUseCase.verifyPassword(userInfo.getUserId(), request.password());
4750
}
51+
52+
@Operation(summary = "비밀번호 재설정 이메일 전송 API")
53+
@PostMapping("/new-password")
54+
public void sendNewPasswordEmail(@RequestBody @Valid SendInitialPasswordRequest request) {
55+
sendNewPasswordUsecase.sendInitialPassword(request);
56+
}
4857
}

src/main/java/clap/server/adapter/outbound/api/EmailClient.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,22 @@ public void sendVerificationEmail(String memberEmail, String receiverName, Strin
7070
}
7171
}
7272

73+
@Override
74+
public void sendNewPasswordEmail(String memberEmail, String receiverName, String newPassword) {
75+
try {
76+
MimeMessage mimeMessage = mailSender.createMimeMessage();
77+
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
78+
79+
EmailTemplate template = emailTemplateBuilder.createNewPasswordTemplate(memberEmail, receiverName, newPassword);
80+
helper.setTo(template.email());
81+
helper.setSubject(template.subject());
82+
helper.setText(template.body(), true);
83+
84+
mailSender.send(mimeMessage);
85+
} catch (Exception e) {
86+
throw new AdapterException(NotificationErrorCode.EMAIL_SEND_FAILED);
87+
}
88+
}
89+
7390

7491
}

src/main/java/clap/server/adapter/outbound/api/EmailTemplateBuilder.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,15 @@ public EmailTemplate createVerificationCodeTemplate(String receiver, String rece
8282
String body = templateEngine.process(templateName, context);
8383
return new EmailTemplate(receiver, subject, body);
8484
}
85+
86+
public EmailTemplate createNewPasswordTemplate(String receiver, String receiverName, String newPassword) {
87+
Context context = new Context();
88+
String templateName = "new-password";
89+
String subject = "[TaskFlow] 비밀번호 재설정";
90+
context.setVariable("loginLink", "http://localhost:5173/login");
91+
context.setVariable("newPassword", newPassword);
92+
context.setVariable("receiverName", receiverName);
93+
String body = templateEngine.process(templateName, context);
94+
return new EmailTemplate(receiver, subject, body);
95+
}
8596
}

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,6 @@ public List<Member> findActiveManagers() {
8686
.collect(Collectors.toList());
8787
}
8888

89-
@Override
90-
public int getRemainingTasks(Long memberId) {
91-
List<TaskStatus> targetStatuses = List.of(TaskStatus.IN_PROGRESS, TaskStatus.IN_REVIEWING);
92-
return findTasksByMemberIdAndStatus(memberId, targetStatuses).size();
93-
}
94-
9589
@Override
9690
public List<Task> findTasksByMemberIdAndStatus(Long memberId, List<TaskStatus> taskStatuses) {
9791
List<TaskEntity> taskEntities = taskRepository.findByProcessor_MemberIdAndTaskStatusIn(memberId, taskStatuses);
@@ -111,8 +105,13 @@ public Page<Member> findMembersWithFilter(Pageable pageable, FindMemberRequest f
111105
}
112106

113107
@Override
114-
public Optional<Member> findByNicknameOrEmail(String nickname, String email) {
108+
public Optional<Member> findByNicknameAndEmail(String nickname, String email) {
115109
return memberRepository.findByNicknameAndEmail(nickname, email).map(memberPersistenceMapper::toDomain);
116110
}
111+
112+
@Override
113+
public Optional<Member> findByNameAndEmail(String name, String email) {
114+
return memberRepository.findByNameAndEmail(name, email).map(memberPersistenceMapper::toDomain);
115+
}
117116
}
118117

0 commit comments

Comments
 (0)