From f79e528feccc820b5074be7501325b5be7349056 Mon Sep 17 00:00:00 2001 From: Rinjae Date: Wed, 24 Jun 2026 19:45:37 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EC=9E=AC=EB=B0=9C=EC=86=A1=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EA=B4=80=EB=A0=A8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=95=EB=A6=AC=20-=20`emailResendPopup`=20?= =?UTF-8?q?=EB=B0=8F=20=ED=8C=9D=EC=97=85=20=ED=98=B8=EC=B6=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=82=AD=EC=A0=9C=20-=20`InquiryAdminNotifier`=20?= =?UTF-8?q?=E2=86=92=20`CommunityAdminNotifier`=EB=A1=9C=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=AA=85=EC=B9=AD=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?-=20=EC=A0=9C=ED=9C=B4=20=EC=8B=A0=EC=B2=AD=20=EC=8B=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=95=8C=EB=A6=BC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../PartnershipApplicationFacadeImpl.java | 16 +++++ .../qna/service/InquiryFacadeImpl.java | 4 +- .../controller/AccountRecoveryController.java | 19 ------ .../controller/UserRegisterController.java | 18 ------ .../user/service/PortalUserAuthService.java | 31 --------- ...ifier.java => CommunityAdminNotifier.java} | 2 +- .../service/InquiryCommentFacadeImpl.java | 2 +- src/main/resources/application.yml | 6 ++ .../static/js/popup/custom-popups.js | 5 -- .../templates/views/apps/login/login.html | 13 ++-- .../views/fragment/djbank/footer.html | 2 +- .../views/fragment/popup/customPopups.html | 1 - .../fragment/popup/emailResendPopup.html | 63 ------------------- 14 files changed, 32 insertions(+), 151 deletions(-) rename src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/{InquiryAdminNotifier.java => CommunityAdminNotifier.java} (98%) delete mode 100644 src/main/resources/templates/views/fragment/popup/emailResendPopup.html diff --git a/build.gradle b/build.gradle index af6a14f..96b650e 100644 --- a/build.gradle +++ b/build.gradle @@ -170,6 +170,7 @@ test { bootWar { archiveFileName = "eapim-portal-boot.war" + mainClass = 'com.eactive.apim.portal.PortalApplication' } war { diff --git a/src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationFacadeImpl.java b/src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationFacadeImpl.java index 7795dbe..7dfcd75 100644 --- a/src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationFacadeImpl.java +++ b/src/main/java/com/eactive/apim/portal/apps/community/partnership/service/PartnershipApplicationFacadeImpl.java @@ -5,14 +5,18 @@ import com.eactive.apim.portal.apps.community.partnership.mapper.PartnershipAppl import com.eactive.apim.portal.common.user.PortalAuthenticatedUser; import com.eactive.apim.portal.common.util.SecurityUtil; import com.eactive.apim.portal.common.util.UserTypeUtil; +import com.eactive.apim.portal.djb.community.qna.comment.service.CommunityAdminNotifier; import com.eactive.apim.portal.file.entity.FileInfo; import com.eactive.apim.portal.file.service.FileService; import com.eactive.apim.portal.file.service.FileTypeContext; import com.eactive.apim.portal.partnershipapplication.entity.PartnershipApplication; +import com.eactive.apim.portal.template.entity.MessageCode; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; @Service @RequiredArgsConstructor @@ -21,6 +25,8 @@ public class PartnershipApplicationFacadeImpl implements PartnershipApplicationF private final PartnershipApplicationService partnershipApplicationService; private final PartnershipApplicationMapper partnershipApplicationMapper; private final FileService fileService; + // portal-admin 알림 발행기(범용). Q&A 등록 알림과 동일 컴포넌트를 재사용한다. + private final CommunityAdminNotifier portalAdminNotifier; @Override @@ -43,5 +49,15 @@ public class PartnershipApplicationFacadeImpl implements PartnershipApplicationF partnershipApplication.setFileId(file.getFileId()); } partnershipApplicationService.createPartnershipApplication(partnershipApplication); + + // 개선요청/제휴 게시물 등록 시 portal-admin 에게 알림 (INQUIRY_CREATED 와 동일 패턴) + PortalAuthenticatedUser writer = SecurityUtil.getPortalAuthenticatedUser(); + Map params = new HashMap<>(); + params.put("partnershipId", partnershipApplication.getId()); + params.put("bizSubject", partnershipApplication.getBizSubject()); + if (writer != null) { + params.put("writerName", writer.getUserName()); + } + portalAdminNotifier.notifyPortalAdmins(MessageCode.PARTNERSHIP_CREATED, params); } } diff --git a/src/main/java/com/eactive/apim/portal/apps/community/qna/service/InquiryFacadeImpl.java b/src/main/java/com/eactive/apim/portal/apps/community/qna/service/InquiryFacadeImpl.java index be0f4fb..25808f8 100644 --- a/src/main/java/com/eactive/apim/portal/apps/community/qna/service/InquiryFacadeImpl.java +++ b/src/main/java/com/eactive/apim/portal/apps/community/qna/service/InquiryFacadeImpl.java @@ -6,7 +6,7 @@ import com.eactive.apim.portal.apps.community.qna.mapper.InquiryMapper; import com.eactive.apim.portal.common.user.PortalAuthenticatedUser; import com.eactive.apim.portal.common.util.SecurityUtil; import com.eactive.apim.portal.common.util.StringMaskingUtil; -import com.eactive.apim.portal.djb.community.qna.comment.service.InquiryAdminNotifier; +import com.eactive.apim.portal.djb.community.qna.comment.service.CommunityAdminNotifier; import com.eactive.apim.portal.portaluser.entity.PortalUserEnums; import com.eactive.apim.portal.qna.entity.Inquiry; import com.eactive.apim.portal.template.entity.MessageCode; @@ -26,7 +26,7 @@ public class InquiryFacadeImpl implements InquiryFacade { private final InquiryService inquiryService; private final InquiryMapper inquiryMapper; - private final InquiryAdminNotifier inquiryAdminNotifier; + private final CommunityAdminNotifier inquiryAdminNotifier; @Override public Page getInquiries(InquirySearch search, Pageable pageable, PortalAuthenticatedUser user) { diff --git a/src/main/java/com/eactive/apim/portal/apps/login/controller/AccountRecoveryController.java b/src/main/java/com/eactive/apim/portal/apps/login/controller/AccountRecoveryController.java index c254ed9..6bb2216 100644 --- a/src/main/java/com/eactive/apim/portal/apps/login/controller/AccountRecoveryController.java +++ b/src/main/java/com/eactive/apim/portal/apps/login/controller/AccountRecoveryController.java @@ -152,25 +152,6 @@ public class AccountRecoveryController { } } - @PostMapping("/resend_verification_email") - public ResponseEntity> resendVerificationEmail(@RequestParam String loginId) { - Map response = new HashMap<>(); - - try { - portalUserAuthService.resendVerificationEmail(loginId); - response.put("success", "인증 이메일이 재발송되었습니다."); - return ResponseEntity.ok(response); - - } catch (IllegalArgumentException e) { - response.put("error", e.getMessage()); - return ResponseEntity.badRequest().body(response); - - } catch (Exception e) { - response.put("error", "이메일 발송 중 오류가 발생했습니다."); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response); - } - } - @GetMapping("/dormant_account") public String showDormantAccountPage(HttpSession session,Model model) { diff --git a/src/main/java/com/eactive/apim/portal/apps/user/controller/UserRegisterController.java b/src/main/java/com/eactive/apim/portal/apps/user/controller/UserRegisterController.java index 9795c79..c1da5b3 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/controller/UserRegisterController.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/controller/UserRegisterController.java @@ -357,24 +357,6 @@ public class UserRegisterController { return "redirect:/"; } - @GetMapping("/validate_email") - public String validateUserEmail(@RequestParam(name = "token", required = false) String token) { - String decodedToken = new String(Base64.decode(token)); - try { - String decToken = encryptionUtil.decrypt(decodedToken); - String[] tokens = decToken.split(":"); - boolean approvalRequired = portalUserService.activateUser(tokens[1]); - if (approvalRequired) { - return "apps/register/emailValidationResultCorpManager"; - } else { - return "apps/register/emailValidationResultUser"; - } - } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | - BadPaddingException e) { - throw new IllegalArgumentException("인증 정보 오류. 관리자 문의하세요."); - } - - } // 에러 발생 시 모델 세팅을 위한 private 메서드 private void setModelForError(HttpSession session, Model model, UserAgreementDTO agreement, diff --git a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java index d62fd1c..de3b532 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java @@ -122,37 +122,6 @@ public class PortalUserAuthService implements UserDetailsService { messageHandlerService.publishEvent(UserPasswordResetEvent.KEY, recipient, params); } - public void resendVerificationEmail(String loginId) { - - PortalUser user = portalUserRepository.findByLoginId(loginId) - .orElseThrow(() -> new IllegalArgumentException("입력하신 사용자 정보가 올바르지 않습니다. 다시 확인해 주세요.")); - - if (user.getUserStatus().equals(PortalUserEnums.UserStatus.ACTIVE)) { - throw new IllegalArgumentException("이미 인증이 완료된 계정입니다."); - } - - // Enum을 직접 전달 - List messageRequests = messageRequestRepository.findByEmailAndMessageCode( - user.getLoginId(), MessageCode.USER_VERIFICATION_EMAIL - ); - - if (!messageRequests.isEmpty()) { - messageRequestRepository.deleteAll(messageRequests); - } - - HashMap params = new HashMap<>(); - String tokenValue = user.getCreatedDate().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")) + ":" + user.getId(); - - try { - String encToken = encryptionUtil.encrypt(tokenValue); - params.put("token", Base64.encode(encToken.getBytes(StandardCharsets.UTF_8))); - MessageRecipient recipient = createMessageRecipient(user); - messageHandlerService.publishEvent(MessageCode.USER_VERIFICATION_EMAIL, recipient, params); - } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { - throw new SystemException("암호화 모듈 오류"); - } - } - private MessageRecipient createMessageRecipient(PortalUser user) { MessageRecipient recipient = new MessageRecipient(); recipient.setUsername(user.getUserName()); diff --git a/src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/InquiryAdminNotifier.java b/src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/CommunityAdminNotifier.java similarity index 98% rename from src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/InquiryAdminNotifier.java rename to src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/CommunityAdminNotifier.java index 0a2c488..d09e88f 100644 --- a/src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/InquiryAdminNotifier.java +++ b/src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/CommunityAdminNotifier.java @@ -20,7 +20,7 @@ import java.util.Map; @Slf4j @Service @RequiredArgsConstructor -public class InquiryAdminNotifier { +public class CommunityAdminNotifier { private final UserInfoRepository userInfoRepository; private final MessageHandlerService messageHandlerService; diff --git a/src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/InquiryCommentFacadeImpl.java b/src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/InquiryCommentFacadeImpl.java index aaf9e41..6a0ba8f 100644 --- a/src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/InquiryCommentFacadeImpl.java +++ b/src/main/java/com/eactive/apim/portal/djb/community/qna/comment/service/InquiryCommentFacadeImpl.java @@ -42,7 +42,7 @@ public class InquiryCommentFacadeImpl implements InquiryCommentFacade { private final InquiryCommentService commentService; private final InquiryCommentRepository commentRepository; private final InquiryCommentPermissionChecker permissionChecker; - private final InquiryAdminNotifier adminNotifier; + private final CommunityAdminNotifier adminNotifier; private final PortalUserRepository portalUserRepository; private final UserInfoRepository userInfoRepository; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a5bf1ab..4d04d38 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -247,6 +247,9 @@ page: corp: name: "법인회원가입" path: "/signup/portalOrg" + verification_email: + name: "이메일 인증" + path: "/signup/verification-email" agreements: name: 약관 path: "#" @@ -322,6 +325,9 @@ page: mypage: name: "내 정보 관리" path: "/mypage" + verification_email: + name: "이메일 인증" + path: "/mypage/verification-email" user_list: name: "이용자 관리" path: "/users" diff --git a/src/main/resources/static/js/popup/custom-popups.js b/src/main/resources/static/js/popup/custom-popups.js index f95fc53..535c914 100644 --- a/src/main/resources/static/js/popup/custom-popups.js +++ b/src/main/resources/static/js/popup/custom-popups.js @@ -355,11 +355,6 @@ const customPopups = { $('#emailValidationPopup').hide(); }); }, - showEmailResendPopup: function (message, loginId) { - $('#emailResendMessage').html(customPopups._sanitizeHtml(message)); - $('#userLoginId').val(loginId); - $('#emailResend').show(); - }, /** * 사용자 초대 팝업 표시 diff --git a/src/main/resources/templates/views/apps/login/login.html b/src/main/resources/templates/views/apps/login/login.html index e5f8214..ae619d8 100644 --- a/src/main/resources/templates/views/apps/login/login.html +++ b/src/main/resources/templates/views/apps/login/login.html @@ -151,14 +151,7 @@ getId(form); } if (document.loginForm.message && document.loginForm.message.value) { - if (document.loginForm.message.value.includes("이메일 인증이 완료되지 않았습니다")) { - console.log("이메일 재발송 팝업 트리거"); - let loginId = $('#loginId').val(); - console.log("Retrieved loginId:", loginId); - customPopups.showEmailResendPopup(document.loginForm.message.value, loginId); - } else { - customPopups.showAlert(document.loginForm.message.value); - } + customPopups.showAlert(document.loginForm.message.value); } } @@ -174,11 +167,13 @@ // 비밀번호 만료 체크 관련 코드 추가 var successMsg = [[${session.success}]]; var passwordExpired = [[${session.passwordExpired}]]; + var emailVerificationRequired = [[${session.emailVerificationRequired}]]; var redirectUrl = [[${session.redirectUrl}]]; if (successMsg) { customPopups.showAlert(successMsg, function() { - if (passwordExpired && redirectUrl) { + // 비밀번호 만료·미인증(이메일 인증 필요) 시 전용 화면으로 이동 + if ((passwordExpired || emailVerificationRequired) && redirectUrl) { window.location.href = redirectUrl; } }); diff --git a/src/main/resources/templates/views/fragment/djbank/footer.html b/src/main/resources/templates/views/fragment/djbank/footer.html index c38b620..3d2b7bc 100644 --- a/src/main/resources/templates/views/fragment/djbank/footer.html +++ b/src/main/resources/templates/views/fragment/djbank/footer.html @@ -13,7 +13,7 @@ 개인정보처리방침 - + diff --git a/src/main/resources/templates/views/fragment/popup/customPopups.html b/src/main/resources/templates/views/fragment/popup/customPopups.html index dfc1e9d..8497226 100644 --- a/src/main/resources/templates/views/fragment/popup/customPopups.html +++ b/src/main/resources/templates/views/fragment/popup/customPopups.html @@ -3,6 +3,5 @@
-
diff --git a/src/main/resources/templates/views/fragment/popup/emailResendPopup.html b/src/main/resources/templates/views/fragment/popup/emailResendPopup.html deleted file mode 100644 index 7e74331..0000000 --- a/src/main/resources/templates/views/fragment/popup/emailResendPopup.html +++ /dev/null @@ -1,63 +0,0 @@ -
- - - -
\ No newline at end of file