lkd9125(이경도)
7 months ago
16 changed files with 476 additions and 9 deletions
@ -1,6 +1,15 @@
|
||||
|
||||
|
||||
dependencies { |
||||
implementation "$boot:spring-boot-starter-web" |
||||
implementation "$boot:spring-boot-starter-data-jpa" |
||||
|
||||
// for paging |
||||
// implementation("org.springframework.data:spring-data-commons") |
||||
|
||||
compileOnly 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' |
||||
implementation project(":data:pty") |
||||
implementation project(":common:core") |
||||
implementation project(":common:util") |
||||
} |
||||
|
||||
|
@ -0,0 +1,35 @@
|
||||
package kr.co.palnet.kac.api.v1.user.account.controller; |
||||
|
||||
import io.swagger.v3.oas.annotations.Operation; |
||||
import io.swagger.v3.oas.annotations.tags.Tag; |
||||
import kr.co.palnet.kac.api.v1.user.account.model.register.FormRegisterRQ; |
||||
import kr.co.palnet.kac.api.v1.user.account.service.UserAccountService; |
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.http.HttpStatus; |
||||
import org.springframework.http.ResponseEntity; |
||||
import org.springframework.web.bind.annotation.PostMapping; |
||||
import org.springframework.web.bind.annotation.RequestBody; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.bind.annotation.RestController; |
||||
|
||||
@RestController |
||||
@Slf4j |
||||
@RequiredArgsConstructor |
||||
@RequestMapping("/v1/user/account") |
||||
@Tag(name = "유저 - 계정", description = "계정 관련 API") |
||||
public class UserAccountController { |
||||
|
||||
private final UserAccountService userAccountService; |
||||
|
||||
@PostMapping("/register") |
||||
@Operation(summary = "회원가입", description = "유저의 계정을 추가합니다.") |
||||
public ResponseEntity<Object> createUser(@RequestBody FormRegisterRQ rq){ |
||||
|
||||
userAccountService.createUser(rq); |
||||
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(null); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,84 @@
|
||||
package kr.co.palnet.kac.api.v1.user.account.model; |
||||
|
||||
import kr.co.palnet.kac.data.pty.model.PtyCstmrBas; |
||||
import lombok.Data; |
||||
|
||||
import java.time.LocalDateTime; |
||||
|
||||
@Data |
||||
public class PtyCstmrDTO { |
||||
|
||||
private Long cstmrSno; |
||||
|
||||
private String authId; |
||||
|
||||
private String cstmrDivCd; |
||||
|
||||
private String cstmrStatusCd; |
||||
|
||||
private LocalDateTime cstmrStatusCngDt; |
||||
|
||||
private String cptAuthCode; |
||||
|
||||
private String userId; |
||||
|
||||
private LocalDateTime joinDt; |
||||
|
||||
private String joinIp; |
||||
|
||||
private String siteCode; |
||||
|
||||
private String memberDivCd; |
||||
|
||||
private String userPswd; |
||||
|
||||
private LocalDateTime pswdUpdtDt; |
||||
|
||||
private String rtrshToken; |
||||
|
||||
private String trmnlId; |
||||
|
||||
public static PtyCstmrBas toEntity(PtyCstmrDTO dto){ |
||||
return PtyCstmrBas.builder() |
||||
.cstmrSno(dto.getCstmrSno()) |
||||
.authId(dto.getAuthId()) |
||||
.cstmrDivCd(dto.getCstmrDivCd()) |
||||
.cstmrStatusCd(dto.getCstmrStatusCd()) |
||||
.cstmrStatusCngDt(dto.getCstmrStatusCngDt()) |
||||
.cptAuthCode(dto.getCptAuthCode()) |
||||
.userId(dto.getUserId()) |
||||
.joinDt(dto.getJoinDt()) |
||||
.joinIp(dto.getJoinIp()) |
||||
.siteCode(dto.getSiteCode()) |
||||
.memberDivCd(dto.getMemberDivCd()) |
||||
.userPswd(dto.getUserPswd()) |
||||
.pswdUpdtDt(dto.getPswdUpdtDt()) |
||||
.rfrshToken(dto.getRtrshToken()) |
||||
.trmnlId(dto.getTrmnlId()) |
||||
.build(); |
||||
} |
||||
|
||||
public static PtyCstmrDTO toDto(PtyCstmrBas entity){ |
||||
PtyCstmrDTO dto = new PtyCstmrDTO(); |
||||
dto.setCstmrSno(entity.getCstmrSno()); |
||||
dto.setAuthId(entity.getAuthId()); |
||||
dto.setCstmrDivCd(entity.getCstmrDivCd()); |
||||
dto.setCstmrStatusCd(entity.getCstmrStatusCd()); |
||||
dto.setCstmrStatusCngDt(entity.getCstmrStatusCngDt()); |
||||
dto.setCptAuthCode(entity.getCptAuthCode()); |
||||
dto.setUserId(entity.getUserId()); |
||||
dto.setJoinDt(entity.getJoinDt()); |
||||
dto.setJoinIp(entity.getJoinIp()); |
||||
dto.setSiteCode(entity.getSiteCode()); |
||||
dto.setMemberDivCd(entity.getMemberDivCd()); |
||||
dto.setUserPswd(entity.getUserPswd()); |
||||
dto.setPswdUpdtDt(entity.getPswdUpdtDt()); |
||||
dto.setRtrshToken(entity.getRfrshToken()); |
||||
dto.setTrmnlId(entity.getTrmnlId()); |
||||
|
||||
return dto; |
||||
} |
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,63 @@
|
||||
package kr.co.palnet.kac.api.v1.user.account.model; |
||||
|
||||
import kr.co.palnet.kac.data.pty.model.PtyCstmrDtl; |
||||
import lombok.Data; |
||||
|
||||
import java.time.LocalDate; |
||||
import java.time.LocalDateTime; |
||||
|
||||
@Data |
||||
public class PtyCstmrDtlDTO { |
||||
|
||||
private Long cstmrSno; |
||||
|
||||
private String ipinDi; |
||||
|
||||
private String ipinCi; |
||||
|
||||
private String joinCrtfyCd; |
||||
|
||||
private String cntryCd; |
||||
|
||||
private String genderCd; |
||||
|
||||
private String memberName; |
||||
|
||||
private LocalDate brthdyDate; |
||||
|
||||
private String email; |
||||
|
||||
private String hpno; |
||||
|
||||
private String clncd; |
||||
|
||||
private String addr; |
||||
|
||||
private String addrDtlCn; |
||||
|
||||
private String zip; |
||||
|
||||
private LocalDateTime updateDt; |
||||
|
||||
private String updateUserId; |
||||
|
||||
public static PtyCstmrDtl toEntity(PtyCstmrDtlDTO dto){ |
||||
return PtyCstmrDtl.builder() |
||||
.cstmrSno(dto.getCstmrSno()) |
||||
.ipinCi(dto.getIpinCi()) |
||||
.ipinDi(dto.getIpinDi()) |
||||
.joinCrtfyCd(dto.getJoinCrtfyCd()) |
||||
.cntryCd(dto.getCntryCd()) |
||||
.genderCd(dto.getGenderCd()) |
||||
.memberName(dto.getMemberName()) |
||||
.brthdyDate(dto.getBrthdyDate()) |
||||
.email(dto.getEmail()) |
||||
.hpno(dto.getHpno()) |
||||
.clncd(dto.getClncd()) |
||||
.updateDt(dto.getUpdateDt()) |
||||
.updateUserId(dto.getUpdateUserId()) |
||||
.build(); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,14 @@
|
||||
package kr.co.palnet.kac.api.v1.user.account.model.register; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
public class AgreeTermsModel { |
||||
|
||||
@Schema(description = "약관 일련번호", example = "1") |
||||
private Long termsSno; |
||||
@Schema(description = "동의여부", example = "Y") |
||||
private String agreeYn; |
||||
|
||||
} |
@ -0,0 +1,111 @@
|
||||
package kr.co.palnet.kac.api.v1.user.account.model.register; |
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema; |
||||
import kr.co.palnet.kac.api.v1.user.account.model.PtyCstmrDTO; |
||||
import kr.co.palnet.kac.api.v1.user.account.model.PtyCstmrDtlDTO; |
||||
import kr.co.palnet.kac.util.HttpUtils; |
||||
import lombok.Data; |
||||
|
||||
import java.time.LocalDate; |
||||
import java.time.LocalDateTime; |
||||
|
||||
@Data |
||||
public class FormRegisterRQ { |
||||
|
||||
@Schema(description = "고객구분코드" , example = "MEMBER") |
||||
private String cstrmDivCd; |
||||
|
||||
@Schema(description = "고객상태코드" , example = "A") |
||||
private String cstrmStatusCd; |
||||
|
||||
@Schema(description = "유저 아이디(중복인 경우 숫자 변경)" , example = "tester01") |
||||
private String userId; |
||||
|
||||
@Schema(description = "유저 권한" , example = "USER") |
||||
private String authId; |
||||
|
||||
@Schema(description = "사이트 코드" , example = "DRON") |
||||
private String siteCode; |
||||
|
||||
@Schema(description = "유저 비밀번호" , example = "test1234") |
||||
private String userPswd; |
||||
|
||||
@Schema(description = "가입인증 수단 코드" , example = "HP_CRTFD") |
||||
private String joinCrtfyCd; |
||||
|
||||
@Schema(description = "멤버 이름" , example = "TESTER") |
||||
private String memberName; |
||||
|
||||
@Schema(description = "생년월일", example = "1997-05-05", implementation = String.class) |
||||
private LocalDate brthdyDate; |
||||
|
||||
@Schema(description = "이메일" , example = "tester@test.co.kr") |
||||
private String email; |
||||
|
||||
@Schema(description = "멤버 휴대폰번호" , example = "01012345678") |
||||
private String hpno; |
||||
|
||||
@Schema(description = "국가 코드" , example = "+82") |
||||
private String clncd; |
||||
|
||||
private AgreeTermsModel[] terms; |
||||
|
||||
@Schema(description = "권한코드(부서)" , example = "KAC") |
||||
private String cptAuthCode; |
||||
|
||||
// @Schema(hidden = true)
|
||||
// private String memberDivCd;
|
||||
|
||||
@Schema(hidden = true) |
||||
private String ipinDi; |
||||
|
||||
@Schema(hidden = true) |
||||
private String ipinCi; |
||||
|
||||
@Schema(description = "국가코드" , example = "KOR") |
||||
private String cntryCd; |
||||
|
||||
@Schema(description = "성별코드" , example = "M") |
||||
private String genderCd; |
||||
|
||||
// @Schema(hidden = true)
|
||||
// private Instant testDt;
|
||||
|
||||
// @Schema(hidden = true)
|
||||
// private String trmnlId;
|
||||
|
||||
public static PtyCstmrDTO toBasicDto(FormRegisterRQ rq){ |
||||
PtyCstmrDTO dto = new PtyCstmrDTO(); |
||||
dto.setCstmrDivCd(rq.getCstrmDivCd()); |
||||
dto.setCstmrStatusCd(rq.getCstrmStatusCd()); |
||||
dto.setUserId(rq.getUserId()); |
||||
dto.setAuthId(rq.getAuthId()); |
||||
dto.setSiteCode(rq.getSiteCode()); |
||||
dto.setUserPswd(rq.getUserPswd()); |
||||
dto.setJoinDt(LocalDateTime.now()); |
||||
dto.setJoinIp(HttpUtils.getRequestIp()); |
||||
dto.setCptAuthCode(rq.getCptAuthCode() == null ? "KAC": rq.getCptAuthCode()); |
||||
|
||||
return dto; |
||||
} |
||||
|
||||
public static PtyCstmrDtlDTO toDetailDto(FormRegisterRQ rq, Long cstmrSno){ |
||||
PtyCstmrDtlDTO dto = new PtyCstmrDtlDTO(); |
||||
dto.setCstmrSno(cstmrSno); |
||||
dto.setIpinCi(rq.getIpinCi()); |
||||
dto.setIpinDi(rq.getIpinDi()); |
||||
dto.setJoinCrtfyCd(rq.getJoinCrtfyCd()); |
||||
dto.setCntryCd(rq.getCntryCd() == null || rq.getCntryCd().isEmpty() ? "KOR" : rq.getCntryCd()); |
||||
dto.setGenderCd(rq.getGenderCd()); |
||||
dto.setMemberName(rq.getMemberName()); |
||||
dto.setBrthdyDate(rq.getBrthdyDate()); |
||||
dto.setEmail(rq.getEmail()); |
||||
dto.setHpno(rq.getHpno()); |
||||
dto.setClncd(rq.getClncd()); |
||||
dto.setUpdateDt(LocalDateTime.now()); |
||||
dto.setUpdateUserId(rq.getUserId()); |
||||
|
||||
return dto; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,76 @@
|
||||
package kr.co.palnet.kac.api.v1.user.account.service; |
||||
|
||||
import kr.co.palnet.kac.api.v1.user.account.model.PtyCstmrDTO; |
||||
import kr.co.palnet.kac.api.v1.user.account.model.PtyCstmrDtlDTO; |
||||
import kr.co.palnet.kac.api.v1.user.account.model.register.FormRegisterRQ; |
||||
import kr.co.palnet.kac.api.v1.user.account.model.register.AgreeTermsModel; |
||||
import kr.co.palnet.kac.core.exception.BaseErrorCode; |
||||
import kr.co.palnet.kac.core.exception.BaseException; |
||||
import kr.co.palnet.kac.data.pty.model.PtyCstmrBas; |
||||
import kr.co.palnet.kac.data.pty.model.PtyCstmrDtl; |
||||
import kr.co.palnet.kac.data.pty.model.PtyTermsAgreeTxn; |
||||
import kr.co.palnet.kac.data.pty.service.PtyCstmrDomainService; |
||||
import kr.co.palnet.kac.util.EncryptUtil; |
||||
import kr.co.palnet.kac.util.HttpUtils; |
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.springframework.stereotype.Service; |
||||
import org.springframework.transaction.annotation.Transactional; |
||||
|
||||
import java.time.Instant; |
||||
import java.time.LocalDateTime; |
||||
|
||||
@Service |
||||
@Slf4j |
||||
@RequiredArgsConstructor |
||||
public class UserAccountService { |
||||
|
||||
private final PtyCstmrDomainService ptyCstmrDomainService; |
||||
|
||||
@Transactional |
||||
public void createUser(FormRegisterRQ rq) { |
||||
|
||||
PtyCstmrBas registeredUser = ptyCstmrDomainService.getCstmrInfoByUserId(rq.getUserId()); |
||||
if(registeredUser != null) throw new BaseException(BaseErrorCode.DATA_ALREADY_EXISTS); |
||||
|
||||
|
||||
rq.setHpno(rq.getHpno().replaceAll("-", "")); |
||||
|
||||
//처리 1. 민감정보 암호화 처리(비밀번호 , 이름 , 휴대폰번호 , 이메일)
|
||||
rq.setUserPswd(EncryptUtil.sha256Encrypt(rq.getUserPswd())); |
||||
rq.setHpno(EncryptUtil.encrypt(rq.getHpno())); |
||||
rq.setEmail(EncryptUtil.encrypt(rq.getEmail())); |
||||
|
||||
//처리 2. 마스터 정보 저장
|
||||
PtyCstmrDTO basicDto = FormRegisterRQ.toBasicDto(rq); |
||||
PtyCstmrBas basEntity = ptyCstmrDomainService.savePtyCstmrBas(PtyCstmrDTO.toEntity(basicDto)); |
||||
|
||||
if(basEntity == null) { |
||||
throw new BaseException(BaseErrorCode.NOT_PROCESS); |
||||
} |
||||
|
||||
//처리 3. 상세 정보 저장
|
||||
PtyCstmrDtlDTO detailDto = FormRegisterRQ.toDetailDto(rq, basEntity.getCstmrSno()); |
||||
ptyCstmrDomainService.savePtyCstmrDtl(PtyCstmrDtlDTO.toEntity(detailDto)); |
||||
|
||||
//처리 4. 약관 동의 정보 저장
|
||||
if(rq.getTerms() != null && rq.getTerms().length > 0){ |
||||
for(AgreeTermsModel model : rq.getTerms()){ |
||||
PtyTermsAgreeTxn agreeEntity = new PtyTermsAgreeTxn(); |
||||
agreeEntity.setCstmrSno(basEntity.getCstmrSno()); |
||||
agreeEntity.setProcIp(HttpUtils.getRequestIp()); |
||||
agreeEntity.setTermsSno(model.getTermsSno()); |
||||
agreeEntity.setUpdateDt(LocalDateTime.now() ); |
||||
agreeEntity.setUpdateUserId(basEntity.getUserId()); |
||||
agreeEntity.setAgreeYn(model.getAgreeYn()); |
||||
if(model.getAgreeYn().equals("Y")) { |
||||
agreeEntity.setAgreeDt(LocalDateTime.now() ); |
||||
} |
||||
|
||||
ptyCstmrDomainService.savePtyTermsAgreeTxn(agreeEntity); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,35 @@
|
||||
package kr.co.palnet.kac.util; |
||||
|
||||
import jakarta.servlet.http.HttpServletRequest; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.apache.commons.lang3.StringUtils; |
||||
import org.springframework.web.context.request.RequestContextHolder; |
||||
import org.springframework.web.context.request.ServletRequestAttributes; |
||||
|
||||
@Slf4j |
||||
public class HttpUtils { |
||||
|
||||
/** |
||||
* 클라이언트 IP 를 가져온다 |
||||
* @return 클라이언트 IP |
||||
*/ |
||||
public static String getRequestIp() { |
||||
HttpServletRequest req = getCurrentRequest(); |
||||
|
||||
String[] HEADER_CLIENT_IP = { "NS-CLIENT-IP", "X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR"}; |
||||
for (String name : HEADER_CLIENT_IP) { |
||||
String clientIp = req.getHeader(name); |
||||
if(!StringUtils.isEmpty(clientIp) && !"unknown".equalsIgnoreCase(clientIp)) { |
||||
log.debug("{}={}", name, clientIp); |
||||
return clientIp; |
||||
} |
||||
} |
||||
|
||||
return req.getRemoteAddr(); |
||||
} |
||||
|
||||
public static HttpServletRequest getCurrentRequest() { |
||||
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
||||
return sra.getRequest(); |
||||
} |
||||
} |
Loading…
Reference in new issue