diff --git a/src/main/java/clap/server/adapter/outbound/jwt/access/AccessTokenProvider.java b/src/main/java/clap/server/adapter/outbound/jwt/access/AccessTokenProvider.java index 918555b3..371e8631 100644 --- a/src/main/java/clap/server/adapter/outbound/jwt/access/AccessTokenProvider.java +++ b/src/main/java/clap/server/adapter/outbound/jwt/access/AccessTokenProvider.java @@ -71,7 +71,7 @@ public boolean isTokenExpired(String token) { return claims.getExpiration().before(new Date()); } catch (Exception e) { log.error("Token is expired: {}", e.getMessage()); - throw new JwtException(AuthErrorCode.EMPTY_ACCESS_KEY); + throw new JwtException(AuthErrorCode.EXPIRED_TOKEN); } } diff --git a/src/main/java/clap/server/adapter/outbound/jwt/access/temporary/TemporaryTokenProvider.java b/src/main/java/clap/server/adapter/outbound/jwt/access/temporary/TemporaryTokenProvider.java index 6dd921ae..fe0e18db 100644 --- a/src/main/java/clap/server/adapter/outbound/jwt/access/temporary/TemporaryTokenProvider.java +++ b/src/main/java/clap/server/adapter/outbound/jwt/access/temporary/TemporaryTokenProvider.java @@ -71,7 +71,7 @@ public boolean isTokenExpired(String token) { return claims.getExpiration().before(new Date()); } catch (Exception e) { log.error("Token is expired: {}", e.getMessage()); - throw new JwtException(AuthErrorCode.EMPTY_ACCESS_KEY); + throw new JwtException(AuthErrorCode.EXPIRED_TOKEN); } } diff --git a/src/main/java/clap/server/adapter/outbound/jwt/refresh/RefreshTokenProvider.java b/src/main/java/clap/server/adapter/outbound/jwt/refresh/RefreshTokenProvider.java index f434181b..1326f037 100644 --- a/src/main/java/clap/server/adapter/outbound/jwt/refresh/RefreshTokenProvider.java +++ b/src/main/java/clap/server/adapter/outbound/jwt/refresh/RefreshTokenProvider.java @@ -68,7 +68,7 @@ public boolean isTokenExpired(String token) { return claims.getExpiration().before(new Date()); } catch (Exception e) { log.error("Token is expired: {}", e.getMessage()); - throw new JwtException(AuthErrorCode.EMPTY_ACCESS_KEY); + throw new JwtException(AuthErrorCode.EXPIRED_TOKEN); } } diff --git a/src/main/java/clap/server/application/service/admin/SendInvitationEmailService.java b/src/main/java/clap/server/application/service/admin/SendInvitationEmailService.java new file mode 100644 index 00000000..f7795289 --- /dev/null +++ b/src/main/java/clap/server/application/service/admin/SendInvitationEmailService.java @@ -0,0 +1,29 @@ +package clap.server.application.service.admin; + +import clap.server.application.port.outbound.email.SendEmailPort; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.concurrent.CompletableFuture; +@Slf4j +@Service +@RequiredArgsConstructor +public class SendInvitationEmailService { + private final SendEmailPort sendEmailPort; + + @Async("emailExecutor") + public void sendInvitationEmail(String memberEmail, String receiverName, String initialPassword, String userNickname) { + CompletableFuture.runAsync(() -> { + try { + sendEmailPort.sendInvitationEmail(memberEmail, receiverName, initialPassword, userNickname); + } catch (Exception e) { + log.error("Failed to send new password email to: {}", memberEmail, e); + } + }).exceptionally(ex -> { + log.error("Unexpected error occurred while sending new password email", ex); + return null; + }); + } +} \ No newline at end of file diff --git a/src/main/java/clap/server/application/service/admin/SendInvitationService.java b/src/main/java/clap/server/application/service/admin/SendInvitationService.java index 7981a6e1..f350726c 100644 --- a/src/main/java/clap/server/application/service/admin/SendInvitationService.java +++ b/src/main/java/clap/server/application/service/admin/SendInvitationService.java @@ -4,7 +4,6 @@ import clap.server.application.port.inbound.admin.SendInvitationUsecase; import clap.server.application.port.outbound.member.CommandMemberPort; import clap.server.application.port.outbound.member.LoadMemberPort; -import clap.server.application.port.outbound.email.SendEmailPort; import clap.server.common.annotation.architecture.ApplicationService; import clap.server.common.utils.InitialPasswordGenerator; import clap.server.domain.model.member.Member; @@ -19,7 +18,7 @@ public class SendInvitationService implements SendInvitationUsecase { private final LoadMemberPort loadMemberPort; private final CommandMemberPort commandMemberPort; - private final SendEmailPort sendEmailPort; + private final SendInvitationEmailService sendInvitationEmailService; private final InitialPasswordGenerator passwordGenerator; private final PasswordEncoder passwordEncoder; @@ -37,7 +36,7 @@ public void sendInvitation(SendInvitationRequest request) { member.changeToApproveRequested(); - sendEmailPort.sendInvitationEmail( + sendInvitationEmailService.sendInvitationEmail( member.getMemberInfo().getEmail(), member.getMemberInfo().getName(), initialPassword, diff --git a/src/main/java/clap/server/application/service/member/ResetPasswordService.java b/src/main/java/clap/server/application/service/member/ResetPasswordService.java index 59ce3e39..488def12 100644 --- a/src/main/java/clap/server/application/service/member/ResetPasswordService.java +++ b/src/main/java/clap/server/application/service/member/ResetPasswordService.java @@ -5,7 +5,6 @@ import clap.server.application.port.inbound.member.ResetInitialPasswordUsecase; import clap.server.application.port.inbound.member.ResetPasswordUsecase; import clap.server.application.port.inbound.member.SendNewPasswordUsecase; -import clap.server.application.port.outbound.email.SendEmailPort; import clap.server.application.port.outbound.member.CommandMemberPort; import clap.server.application.port.outbound.member.LoadMemberPort; import clap.server.common.annotation.architecture.ApplicationService; @@ -28,7 +27,7 @@ class ResetPasswordService implements ResetPasswordUsecase, ResetInitialPassword private final CommandMemberPort commandMemberPort; private final LoadMemberPort loadMemberPort; private final InitialPasswordGenerator initialPasswordGenerator; - private final SendEmailPort sendEmailPort; + private final SendPasswordEmailService sendPasswordEmailService; @Override public void resetPassword(Long memberId, String inputPassword) { @@ -52,7 +51,7 @@ public void sendInitialPassword(SendInitialPasswordRequest request) { () -> new ApplicationException(MemberErrorCode.MEMBER_NOT_FOUND)); String newPassword = initialPasswordGenerator.generateRandomPassword(); - sendEmailPort.sendNewPasswordEmail(request.email(), request.name(), newPassword); + sendPasswordEmailService.sendNewPasswordEmail(request.email(), request.name(), newPassword); String encodedPassword = passwordEncoder.encode(newPassword); member.resetPassword(encodedPassword); commandMemberPort.save(member); diff --git a/src/main/java/clap/server/application/service/member/SendPasswordEmailService.java b/src/main/java/clap/server/application/service/member/SendPasswordEmailService.java new file mode 100644 index 00000000..6e122826 --- /dev/null +++ b/src/main/java/clap/server/application/service/member/SendPasswordEmailService.java @@ -0,0 +1,30 @@ +package clap.server.application.service.member; + +import clap.server.application.port.outbound.email.SendEmailPort; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.concurrent.CompletableFuture; + +@Slf4j +@Service +@RequiredArgsConstructor +public class SendPasswordEmailService { + private final SendEmailPort sendEmailPort; + + @Async("emailExecutor") + public void sendNewPasswordEmail(String email, String name, String newPassword) { + CompletableFuture.runAsync(() -> { + try { + sendEmailPort.sendNewPasswordEmail(email, name, newPassword); + } catch (Exception e) { + log.error("Failed to send new password email to: {}", email, e); + } + }).exceptionally(ex -> { + log.error("Unexpected error occurred while sending new password email", ex); + return null; + }); + } +} diff --git a/src/main/java/clap/server/domain/model/task/Task.java b/src/main/java/clap/server/domain/model/task/Task.java index bab637dc..4af89644 100644 --- a/src/main/java/clap/server/domain/model/task/Task.java +++ b/src/main/java/clap/server/domain/model/task/Task.java @@ -98,7 +98,7 @@ public void approveTask(Member reviewer, Member processor, LocalDateTime dueDate } private static String toTaskCode(Category category) { - return category.getMainCategory().getCode() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmm")); + return category.getMainCategory().getCode() + category.getCode() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmm")); } public void updateProcessorOrder(long newProcessorOrder) {