From b6b21aae0ab8ef42bc4576b2443146365fa62a93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Mon, 19 Feb 2024 11:57:50 +0900 Subject: [PATCH] =?UTF-8?q?feature:=20User=EB=AA=A8=EB=93=88=20-=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/kac-app/build.gradle | 1 + .../app/core/security/AppSecurityConfig.java | 1 + .../src/main/resources/application-db.yml | 4 +- .../kr/co/palnet/kac/util/EncryptUtil.java | 13 ++ .../kac/data/pty/model/PtyCstmrBas.java | 9 +- .../kac/data/pty/model/PtyCstmrDtl.java | 3 +- .../kac/data/pty/model/PtyTermsAgreeTxn.java | 5 +- .../pty/service/PtyCstmrDomainService.java | 22 ++++ web/api-user/build.gradle | 9 ++ .../controller/UserAccountController.java | 35 ++++++ .../v1/user/account/model/PtyCstmrDTO.java | 84 +++++++++++++ .../v1/user/account/model/PtyCstmrDtlDTO.java | 63 ++++++++++ .../model/register/AgreeTermsModel.java | 14 +++ .../model/register/FormRegisterRQ.java | 111 ++++++++++++++++++ .../account/service/UserAccountService.java | 76 ++++++++++++ .../java/kr/co/palnet/kac/util/HttpUtils.java | 35 ++++++ 16 files changed, 476 insertions(+), 9 deletions(-) create mode 100644 web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/controller/UserAccountController.java create mode 100644 web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/PtyCstmrDTO.java create mode 100644 web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/PtyCstmrDtlDTO.java create mode 100644 web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/register/AgreeTermsModel.java create mode 100644 web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/register/FormRegisterRQ.java create mode 100644 web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java create mode 100644 web/api-user/src/main/java/kr/co/palnet/kac/util/HttpUtils.java diff --git a/app/kac-app/build.gradle b/app/kac-app/build.gradle index 31698ca..59af035 100644 --- a/app/kac-app/build.gradle +++ b/app/kac-app/build.gradle @@ -39,6 +39,7 @@ dependencies { implementation project(":common:util") implementation project(":web:security") implementation project(":web:api-common") + implementation project(":web:api-user") } ext { diff --git a/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java b/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java index 48e8893..1e508c4 100644 --- a/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java +++ b/app/kac-app/src/main/java/kr/co/palnet/kac/app/core/security/AppSecurityConfig.java @@ -27,6 +27,7 @@ public class AppSecurityConfig extends SecurityConfig { // 시큐리티 적용 안하는 URL 목록 private final String[] IGNORE_URL = { "/v1/com/code/**", + "/v1/user/account/register", }; // 권한(ROLE)별 URL diff --git a/common/config-db/src/main/resources/application-db.yml b/common/config-db/src/main/resources/application-db.yml index 4085bd1..2223bde 100644 --- a/common/config-db/src/main/resources/application-db.yml +++ b/common/config-db/src/main/resources/application-db.yml @@ -1,7 +1,7 @@ spring: jpa: hibernate: - ddl-auto: none + ddl-auto: create naming: physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl datasource: @@ -9,4 +9,4 @@ spring: driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy jdbc-url: jdbc:log4jdbc:mysql://localhost:13306/PAV_KAC?characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true username: kac - password: palnet!234 \ No newline at end of file + password: palnet!234` \ No newline at end of file diff --git a/common/util/src/main/java/kr/co/palnet/kac/util/EncryptUtil.java b/common/util/src/main/java/kr/co/palnet/kac/util/EncryptUtil.java index 26d4396..f495b77 100644 --- a/common/util/src/main/java/kr/co/palnet/kac/util/EncryptUtil.java +++ b/common/util/src/main/java/kr/co/palnet/kac/util/EncryptUtil.java @@ -1,5 +1,6 @@ package kr.co.palnet.kac.util; +import kr.co.palnet.kac.util.kisa.KISA_SHA256; import lombok.extern.slf4j.Slf4j; import javax.crypto.Cipher; @@ -72,6 +73,18 @@ public class EncryptUtil { return encrypted; } + public static String sha256Encrypt(String str) { + + byte[] bytes = str.getBytes(); + byte[] pszDigest = new byte[32]; + KISA_SHA256.SHA256_Encrpyt(bytes, bytes.length, pszDigest); + StringBuffer encrypted = new StringBuffer(); + for (int i = 0; i < 32; i++) { + encrypted.append(String.format("%02x", pszDigest[i])); + } + return encrypted.toString(); + } + public static void main(String[] args) { String key = "1234567890123456"; String initVector = "1234567890123456"; diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrBas.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrBas.java index 67670cc..526f371 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrBas.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrBas.java @@ -4,6 +4,7 @@ import jakarta.persistence.*; import lombok.*; import java.time.Instant; +import java.time.LocalDateTime; import java.util.List; @@ -29,13 +30,13 @@ public class PtyCstmrBas { @Column(name = "CSTMR_DIV_CD", length = 20, nullable = false) private String cstmrDivCd; - // 고객상태코드 + // 고객상태코드 [A : 계정이 활성화 됨, W : 계정이 비활성화됨-회원탈퇴] @Column(name = "CSTMR_STATUS_CD", length = 20, nullable = false) private String cstmrStatusCd; // 고객상태변경일시 @Column(name = "CSTMR_STATUS_CNG_DT", columnDefinition = "datetime") - private Instant cstmrStatusCngDt; + private LocalDateTime cstmrStatusCngDt; // 관할기관코드 @Column(name = "CPT_AUTH_CODE", length = 10) @@ -47,7 +48,7 @@ public class PtyCstmrBas { // 가입일시 @Column(name = "JOIN_DT", columnDefinition = "datetime(6)", nullable = false) - private Instant joinDt; + private LocalDateTime joinDt; // 가입IP주소 @Column(name = "JOIN_IP", length = 39, nullable = false) @@ -67,7 +68,7 @@ public class PtyCstmrBas { // 비밀번호수정일시 @Column(name = "PSWD_UPDT_DT", columnDefinition = "datetime") - private Instant pswdUpdtDt; + private LocalDateTime pswdUpdtDt; // 재활용토큰 @Column(name = "RFRSH_TOKEN") diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrDtl.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrDtl.java index a3e980a..77e4c7d 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrDtl.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyCstmrDtl.java @@ -5,6 +5,7 @@ import lombok.*; import java.time.Instant; import java.time.LocalDate; +import java.time.LocalDateTime; @Data @@ -74,7 +75,7 @@ public class PtyCstmrDtl { // 수정일시 @Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) - private Instant updateDt; + private LocalDateTime updateDt; // 수정사용자ID @Column(name = "UPDATE_USER_ID", length = 30, nullable = false) diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyTermsAgreeTxn.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyTermsAgreeTxn.java index 952ba67..07f75f9 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyTermsAgreeTxn.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/model/PtyTermsAgreeTxn.java @@ -4,6 +4,7 @@ import jakarta.persistence.*; import lombok.*; import java.time.Instant; +import java.time.LocalDateTime; @Data @@ -34,7 +35,7 @@ public class PtyTermsAgreeTxn { // 동의일시 @Column(name = "AGREE_DT", columnDefinition = "datetime") - private Instant agreeDt; + private LocalDateTime agreeDt; // 처리IP주소 @Column(name = "PROC_IP", length = 39) @@ -42,7 +43,7 @@ public class PtyTermsAgreeTxn { // 수정일시 @Column(name = "UPDATE_DT", columnDefinition = "datetime", nullable = false) - private Instant updateDt; + private LocalDateTime updateDt; // 수정사용자ID @Column(name = "UPDATE_USER_ID", length = 30, nullable = false) diff --git a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java index 47e429b..f27ad18 100644 --- a/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java +++ b/data/pty/src/main/java/kr/co/palnet/kac/data/pty/service/PtyCstmrDomainService.java @@ -1,7 +1,11 @@ package kr.co.palnet.kac.data.pty.service; 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.repository.PtyCstmrBasRepository; +import kr.co.palnet.kac.data.pty.repository.PtyCstmrDtlRepository; +import kr.co.palnet.kac.data.pty.repository.PtyTermsAgreeTxnRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -12,8 +16,26 @@ import org.springframework.stereotype.Service; public class PtyCstmrDomainService { private final PtyCstmrBasRepository ptyCstmrBasRepository; + private final PtyCstmrDtlRepository ptyCstmrDtlRepository; + + private final PtyTermsAgreeTxnRepository ptyTermsAgreeTxnRepository; + public PtyCstmrBas getCstmrInfoByUserId(String userId) { return ptyCstmrBasRepository.findByUserId(userId); } + public PtyCstmrBas savePtyCstmrBas(PtyCstmrBas entity) { + return ptyCstmrBasRepository.save(entity); + } + + public PtyCstmrDtl savePtyCstmrDtl(PtyCstmrDtl entity){ + return ptyCstmrDtlRepository.save(entity); + } + + public PtyTermsAgreeTxn savePtyTermsAgreeTxn(PtyTermsAgreeTxn entity){ + return ptyTermsAgreeTxnRepository.save(entity); + } + + + } diff --git a/web/api-user/build.gradle b/web/api-user/build.gradle index 6875d3b..9501fe5 100644 --- a/web/api-user/build.gradle +++ b/web/api-user/build.gradle @@ -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") } diff --git a/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/controller/UserAccountController.java b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/controller/UserAccountController.java new file mode 100644 index 0000000..cb288af --- /dev/null +++ b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/controller/UserAccountController.java @@ -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 createUser(@RequestBody FormRegisterRQ rq){ + + userAccountService.createUser(rq); + + return ResponseEntity.status(HttpStatus.CREATED).body(null); + } + + +} diff --git a/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/PtyCstmrDTO.java b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/PtyCstmrDTO.java new file mode 100644 index 0000000..36c8a7b --- /dev/null +++ b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/PtyCstmrDTO.java @@ -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; + } + + + +} diff --git a/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/PtyCstmrDtlDTO.java b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/PtyCstmrDtlDTO.java new file mode 100644 index 0000000..4eccb49 --- /dev/null +++ b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/PtyCstmrDtlDTO.java @@ -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(); + } + + +} diff --git a/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/register/AgreeTermsModel.java b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/register/AgreeTermsModel.java new file mode 100644 index 0000000..a2ee415 --- /dev/null +++ b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/register/AgreeTermsModel.java @@ -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; + +} diff --git a/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/register/FormRegisterRQ.java b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/register/FormRegisterRQ.java new file mode 100644 index 0000000..05d51a1 --- /dev/null +++ b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/model/register/FormRegisterRQ.java @@ -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; + } + +} diff --git a/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java new file mode 100644 index 0000000..e07236b --- /dev/null +++ b/web/api-user/src/main/java/kr/co/palnet/kac/api/v1/user/account/service/UserAccountService.java @@ -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); + } + } + + } + +} diff --git a/web/api-user/src/main/java/kr/co/palnet/kac/util/HttpUtils.java b/web/api-user/src/main/java/kr/co/palnet/kac/util/HttpUtils.java new file mode 100644 index 0000000..96fa12d --- /dev/null +++ b/web/api-user/src/main/java/kr/co/palnet/kac/util/HttpUtils.java @@ -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(); + } +}