package com.takensoft.common.certify.web; import com.fasterxml.jackson.databind.ObjectMapper; import com.takensoft.cms.loginPolicy.service.LoginModeService; import com.takensoft.cms.loginPolicy.service.LoginPolicyService; import com.takensoft.cms.mber.service.LgnHstryService; import com.takensoft.cms.mber.service.MberService; import com.takensoft.cms.mber.vo.MberVO; import com.takensoft.cms.token.service.RefreshTokenService; import com.takensoft.common.message.MessageCode; import com.takensoft.common.util.*; import com.takensoft.common.certify.service.EmailService; import com.takensoft.common.certify.vo.EmailVO; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * @author 하석형 * @since 2025.05.20 * @modification * since | author | description * 2025.05.20 | 하석형 | 최초 등록 * * 이메일 관련 Controller */ @RestController @RequiredArgsConstructor @Slf4j @RequestMapping(value="/sys/email") public class EmailController { private final EmailService emailService; private final ResponseUtil resUtil; private final MberService mberService; private final HttpRequestUtil httpRequestUtil; private final LgnHstryService lgnHstryService; private final LoginModeService loginModeService; private final RefreshTokenService refreshTokenService; private final LoginPolicyService loginPolicyService; private final JWTUtil jwtUtil; private final SessionUtil sessionUtil; private final RedisTemplate redisTemplate; private final LoginUtil loginUtil; @Value("${jwt.accessTime}") private long JWT_ACCESSTIME; @Value("${jwt.refreshTime}") private long JWT_REFRESHTIME; @Value("${cookie.time}") private int COOKIE_TIME; // 쿠키 유지 시간 /** * @param emailVO - 이메일 정보 * @return ResponseEntity - 이메일 인증코드 발송 응답 결과 * * 이메일 인증코드 발송 */ @PostMapping("/sendEmailCertifyCode.json") public ResponseEntity sendEmailCertifyCode(@RequestBody EmailVO emailVO) { boolean result = emailService.sendEmailCertifyCode(emailVO); return resUtil.successRes(result, MessageCode.CERTIFY_CODE_SEND_SUCCESS); } /** * @param emailVO - 이메일 정보 * @return ResponseEntity - 이메일 인증코드 확인 응답 결과 * * 이메일 인증코드 확인 */ @PostMapping("/checkEmailCertifyCode.json") public ResponseEntity checkEmailCertifyCode(@RequestBody EmailVO emailVO) { boolean result = emailService.checkEmailCertifyCode(emailVO); return resUtil.successRes(result, MessageCode.CERTIFY_SUCCESS); } /** * @param emailVO - 이메일 정보 * @return ResponseEntity - 이메일 인증코드 확인 응답 결과 * * 2차 인증 이메일 인증코드 확인 */ @PostMapping("/check2ndAuthEmailCertifyCode.json") public void check2ndAuthEmailCertifyCode(@RequestBody EmailVO emailVO, HttpServletRequest req, HttpServletResponse res) throws IOException { boolean authResult = emailService.checkEmailCertifyCode(emailVO); // 이메일 인증코드 확인 if(authResult) { HashMap findMber = new HashMap<>(); findMber.put("mbrId", emailVO.getMbrId()); MberVO mber = mberService.findByMbr(findMber); loginUtil.successLogin(mber, req, res); } else { // 인증 실패 시 예외 처리 Map result = new HashMap<>(); res.setContentType("application/json;charset=UTF-8"); res.setStatus(HttpStatus.UNAUTHORIZED.value()); result.put("message", "인증에 실패했습니다. 올바른 인증코드를 입력해주세요."); new ObjectMapper().writeValue(res.getOutputStream(), result); return; } // return resUtil.successRes(authResult, MessageCode.COMMON_SUCCESS); } }