diff --git a/src/main/kotlin/com/psr/psr/cs/dto/assembler/CsAssembler.kt b/src/main/kotlin/com/psr/psr/cs/dto/assembler/CsAssembler.kt deleted file mode 100644 index 3153f1f..0000000 --- a/src/main/kotlin/com/psr/psr/cs/dto/assembler/CsAssembler.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.psr.psr.cs.dto.assembler - -import com.psr.psr.cs.dto.response.FaqListRes -import com.psr.psr.cs.dto.response.FaqRes -import com.psr.psr.cs.dto.response.NoticeListRes -import com.psr.psr.cs.dto.response.NoticeRes -import com.psr.psr.cs.entity.Faq -import com.psr.psr.cs.entity.Notice -import org.springframework.stereotype.Component -import java.util.stream.Collectors - -@Component -class CsAssembler { - - // 공지사항 메인 - fun toNoticeListRes(noticeList: List?): NoticeListRes { - if (noticeList!!.isEmpty()) return NoticeListRes(null) - return NoticeListRes(noticeList.stream().map { - n -> NoticeRes(n.id, n.title, n.createdAt) - }.collect(Collectors.toList())) - } - - // 공지사항 상세 - fun toNoticeRes(notice: Notice): NoticeRes { - return NoticeRes(notice.id, notice.title, notice.createdAt, notice.imgUrl, notice.content) - } - - // 자주 묻는 질문 메인 - fun toFaqListRes(faqList: List?) : FaqListRes { - if(faqList!!.isEmpty()) return FaqListRes(null) - return FaqListRes(faqList.stream().map { - f -> FaqRes(f.id, f.type.value, f.title) - }.collect(Collectors.toList())) - } - - // 자주 묻는 질문 상세 - fun toFaqRes(faq: Faq): FaqRes { - return FaqRes(faq.id, faq.type.value, faq.title, faq.content) - } - - fun toNoticeListResForHomePage(noticeList: List?): NoticeListRes { - return NoticeListRes( - noticeLists = noticeList?.map { n -> toNoticeResHome(n) }!!.toList() - ) - } - - fun toNoticeResHome(notice: Notice): NoticeRes { - return NoticeRes(noticeId = notice.id, title = notice.title) - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/cs/dto/response/FaqListRes.kt b/src/main/kotlin/com/psr/psr/cs/dto/response/FaqListRes.kt index e3609bb..67e921d 100644 --- a/src/main/kotlin/com/psr/psr/cs/dto/response/FaqListRes.kt +++ b/src/main/kotlin/com/psr/psr/cs/dto/response/FaqListRes.kt @@ -1,5 +1,17 @@ package com.psr.psr.cs.dto.response +import com.psr.psr.cs.entity.Faq +import java.util.stream.Collectors + data class FaqListRes ( val faqLists: List? -) \ No newline at end of file +){ + companion object{ + fun toFaqListRes(faqList: List?) : FaqListRes { + if(faqList!!.isEmpty()) return FaqListRes(null) + return FaqListRes(faqList.stream().map { + f -> FaqRes(f.id, f.type.value, f.title) + }.collect(Collectors.toList())) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/cs/dto/response/FaqRes.kt b/src/main/kotlin/com/psr/psr/cs/dto/response/FaqRes.kt index 81e4703..cf1fdda 100644 --- a/src/main/kotlin/com/psr/psr/cs/dto/response/FaqRes.kt +++ b/src/main/kotlin/com/psr/psr/cs/dto/response/FaqRes.kt @@ -1,6 +1,7 @@ package com.psr.psr.cs.dto.response import com.fasterxml.jackson.annotation.JsonInclude +import com.psr.psr.cs.entity.Faq data class FaqRes ( val faqId: Long, @@ -8,4 +9,10 @@ data class FaqRes ( val title: String, @JsonInclude(JsonInclude.Include.NON_NULL) val content: String?= null, -) \ No newline at end of file +){ + companion object{ + fun toFaqRes(faq: Faq): FaqRes { + return FaqRes(faq.id, faq.type.value, faq.title, faq.content) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/cs/dto/response/NoticeListRes.kt b/src/main/kotlin/com/psr/psr/cs/dto/response/NoticeListRes.kt index 9d92900..97a960d 100644 --- a/src/main/kotlin/com/psr/psr/cs/dto/response/NoticeListRes.kt +++ b/src/main/kotlin/com/psr/psr/cs/dto/response/NoticeListRes.kt @@ -1,5 +1,24 @@ package com.psr.psr.cs.dto.response +import com.psr.psr.cs.dto.response.NoticeRes.Companion.toNoticeResHome +import com.psr.psr.cs.entity.Notice +import java.util.stream.Collectors + data class NoticeListRes ( val noticeLists: List? -) \ No newline at end of file +){ + companion object{ + fun toNoticeListRes(noticeList: List?): NoticeListRes { + if (noticeList!!.isEmpty()) return NoticeListRes(null) + return NoticeListRes(noticeList.stream().map { + n -> NoticeRes(n.id, n.title, n.createdAt) + }.collect(Collectors.toList())) + } + + fun toNoticeListResForHomePage(noticeList: List?): NoticeListRes { + return NoticeListRes( + noticeLists = noticeList?.map { n -> toNoticeResHome(n) }!!.toList() + ) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/cs/dto/response/NoticeRes.kt b/src/main/kotlin/com/psr/psr/cs/dto/response/NoticeRes.kt index fac8ab0..d935628 100644 --- a/src/main/kotlin/com/psr/psr/cs/dto/response/NoticeRes.kt +++ b/src/main/kotlin/com/psr/psr/cs/dto/response/NoticeRes.kt @@ -2,6 +2,7 @@ package com.psr.psr.cs.dto.response import com.fasterxml.jackson.annotation.JsonFormat import com.fasterxml.jackson.annotation.JsonInclude +import com.psr.psr.cs.entity.Notice import java.time.LocalDateTime data class NoticeRes ( @@ -14,4 +15,14 @@ data class NoticeRes ( val imgUrl: String ?= null, @JsonInclude(JsonInclude.Include.NON_NULL) val content: String ?= null -) \ No newline at end of file +){ + companion object{ + fun toNoticeRes(notice: Notice): NoticeRes { + return NoticeRes(notice.id, notice.title, notice.createdAt, notice.imgUrl, notice.content) + } + + fun toNoticeResHome(notice: Notice): NoticeRes { + return NoticeRes(noticeId = notice.id, title = notice.title) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/cs/service/CsService.kt b/src/main/kotlin/com/psr/psr/cs/service/CsService.kt index 6d718a8..a7dba73 100644 --- a/src/main/kotlin/com/psr/psr/cs/service/CsService.kt +++ b/src/main/kotlin/com/psr/psr/cs/service/CsService.kt @@ -4,7 +4,6 @@ import com.psr.psr.cs.dto.response.FaqListRes import com.psr.psr.cs.dto.response.FaqRes import com.psr.psr.cs.dto.response.NoticeListRes import com.psr.psr.cs.dto.response.NoticeRes -import com.psr.psr.cs.dto.assembler.CsAssembler import com.psr.psr.cs.entity.FaqType import com.psr.psr.cs.repository.FaqRepository import com.psr.psr.cs.repository.NoticeRepository @@ -17,37 +16,35 @@ import org.springframework.stereotype.Service class CsService( private val faqRepository: FaqRepository, private val noticeRepository: NoticeRepository, - private val csAssembler: CsAssembler ) { // 공지사항 메인 fun getNotices() : NoticeListRes { - return csAssembler.toNoticeListRes(noticeRepository.findByStatusOrderByCreatedAtDesc(ACTIVE_STATUS)) + return NoticeListRes.toNoticeListRes(noticeRepository.findByStatusOrderByCreatedAtDesc(ACTIVE_STATUS)) } // 공지사항 상세 fun getNotice(noticeId: Long) : NoticeRes { val notice = noticeRepository.findByIdAndStatus(noticeId, ACTIVE_STATUS) ?: throw BaseException(BaseResponseCode.NOT_FOUND_NOTICE) - return csAssembler.toNoticeRes(notice) + return NoticeRes.toNoticeRes(notice) } // 자주 묻는 질문 메인 fun getFaqs(type: String?): FaqListRes { - return if(type == null) csAssembler.toFaqListRes(faqRepository.findByStatusOrderByCreatedAtDesc(ACTIVE_STATUS)) + return if(type == null) FaqListRes.toFaqListRes(faqRepository.findByStatusOrderByCreatedAtDesc(ACTIVE_STATUS)) else{ - csAssembler.toFaqListRes(faqRepository.findByTypeAndStatusOrderByCreatedAtDesc(FaqType.getTypeByName(type), ACTIVE_STATUS)) + FaqListRes.toFaqListRes(faqRepository.findByTypeAndStatusOrderByCreatedAtDesc(FaqType.getTypeByName(type), ACTIVE_STATUS)) } } // 자주 묻는 질문 상세 fun getFaq(faqId: Long): FaqRes { val faq = faqRepository.findByIdAndStatus(faqId, ACTIVE_STATUS) ?: throw BaseException(BaseResponseCode.NOT_FOUND_FAQ) - return csAssembler.toFaqRes(faq) + return FaqRes.toFaqRes(faq) } // 홈 화면 조회 - 공지사항 fun getHomePage(): NoticeListRes { - return csAssembler.toNoticeListResForHomePage(noticeRepository.findTop3ByStatusOrderByCreatedAtDesc(ACTIVE_STATUS)) - } - + return NoticeListRes.toNoticeListResForHomePage(noticeRepository.findTop3ByStatusOrderByCreatedAtDesc(ACTIVE_STATUS)) + } } \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/global/jwt/dto/TokenDto.kt b/src/main/kotlin/com/psr/psr/global/jwt/dto/TokenDto.kt index 4c71c38..a3f2d4a 100644 --- a/src/main/kotlin/com/psr/psr/global/jwt/dto/TokenDto.kt +++ b/src/main/kotlin/com/psr/psr/global/jwt/dto/TokenDto.kt @@ -1,5 +1,6 @@ package com.psr.psr.global.jwt.dto +import com.psr.psr.global.Constant import org.jetbrains.annotations.NotNull data class TokenDto( @@ -8,4 +9,11 @@ data class TokenDto( @field:NotNull var refreshToken: String, val type: String ?= null -) +){ + companion object{ + fun toTokenDto(tokenDto: TokenDto) { + tokenDto.accessToken.replace(Constant.JWT.BEARER_PREFIX, "").also { tokenDto.accessToken = it } + tokenDto.refreshToken.replace(Constant.JWT.BEARER_PREFIX, "").also { tokenDto.refreshToken = it } + } + } +} diff --git a/src/main/kotlin/com/psr/psr/user/dto/UserInterestListDto.kt b/src/main/kotlin/com/psr/psr/user/dto/UserInterestListDto.kt index 4980c93..bfe311d 100644 --- a/src/main/kotlin/com/psr/psr/user/dto/UserInterestListDto.kt +++ b/src/main/kotlin/com/psr/psr/user/dto/UserInterestListDto.kt @@ -1,5 +1,15 @@ package com.psr.psr.user.dto +import com.psr.psr.user.entity.UserInterest + data class UserInterestListDto ( val interestList: List? -) \ No newline at end of file +){ + companion object{ + fun toUserInterestListDto(interests: List?): UserInterestListDto { + return UserInterestListDto( + interestList = interests?.map { i -> UserInterestDto(i.category.value) }?.toList() + ) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/user/dto/assembler/UserAssembler.kt b/src/main/kotlin/com/psr/psr/user/dto/assembler/UserAssembler.kt deleted file mode 100644 index b842131..0000000 --- a/src/main/kotlin/com/psr/psr/user/dto/assembler/UserAssembler.kt +++ /dev/null @@ -1,113 +0,0 @@ -package com.psr.psr.user.dto.assembler - -import com.psr.psr.global.Constant -import com.psr.psr.global.jwt.dto.TokenDto -import com.psr.psr.user.dto.UserInterestDto -import com.psr.psr.user.dto.UserInterestListDto -import com.psr.psr.user.dto.eidReq.Business -import com.psr.psr.user.dto.eidReq.BusinessListReq -import com.psr.psr.user.dto.phoneReq.MessageReq -import com.psr.psr.user.dto.phoneReq.SMSReq -import com.psr.psr.user.dto.request.SignUpReq -import com.psr.psr.user.dto.request.UserEidReq -import com.psr.psr.user.dto.request.ValidPhoneReq -import com.psr.psr.user.dto.response.EmailRes -import com.psr.psr.user.dto.response.MyPageInfoRes -import com.psr.psr.user.dto.response.ProfileRes -import com.psr.psr.user.entity.* -import org.apache.commons.lang3.RandomStringUtils -import org.springframework.stereotype.Component -import java.time.LocalDate -import java.time.format.DateTimeFormatter -import java.util.* -import java.util.stream.Collectors - -@Component -class UserAssembler { - /** - * toEntity - */ - fun toEntity(signUpReq: SignUpReq): User { - return User(email = signUpReq.email, - password = signUpReq.password, - type = Type.getTypeByValue(signUpReq.type), - phone = signUpReq.phone, - imgUrl = signUpReq.imgUrl, - provider = Provider.LOCAL, - marketing = signUpReq.marketing, - notification = signUpReq.notification, - name = signUpReq.name, - nickname = signUpReq.nickname, - deviceToken = signUpReq.deviceToken) - } - - fun toInterestListEntity(user: User, signUpReq: SignUpReq): List { - return signUpReq.interestList.stream() - .map { i -> - UserInterest(category = Category.getCategoryByValue(i.category), - user = user) - }.collect(Collectors.toList()) - } - - fun toInterestEntity(user: User, category: Category): UserInterest { - return UserInterest(user = user, - category = category) - } - - fun toBusinessEntity(user: User, signUpReq: SignUpReq): BusinessInfo { - val format = DateTimeFormatter.ofPattern("yyyyMMdd") - return BusinessInfo(user = user, - companyName = signUpReq.entreInfo!!.companyName, - ownerName = signUpReq.entreInfo.ownerName, - number = signUpReq.entreInfo.number, - date = LocalDate.parse(signUpReq.entreInfo.companyDate, format) - ) - } - - fun toUserEidList(userEidReq: UserEidReq): BusinessListReq { - val business = Business(userEidReq.number, userEidReq.companyDate, userEidReq.ownerName, userEidReq.companyName) - return BusinessListReq(Collections.singletonList(business)) - } - - /** - * toDto - */ - fun toMyPageInfoRes(user: User) : MyPageInfoRes { - return MyPageInfoRes(user.email, user.imgUrl, user.type.value, user.phone, user.nickname) - } - - fun toProfileRes(user: User) : ProfileRes { - return ProfileRes(user.nickname, user.imgUrl) - } - - fun toTokenDto(tokenDto: TokenDto) { - tokenDto.accessToken.replace(Constant.JWT.BEARER_PREFIX, "").also { tokenDto.accessToken = it } - tokenDto.refreshToken.replace(Constant.JWT.BEARER_PREFIX, "").also { tokenDto.refreshToken = it } - } - - fun toSMSReqDto(validPhoneReq: ValidPhoneReq, key: String, sendPhone: String) : SMSReq{ - val message = MessageReq(to = validPhoneReq.phone) - return SMSReq( - from = sendPhone, - content = "[PSR] 인증번호는 [ $key ] 을 입력해주세요", - messages = listOf(message) // 싱글톤 list = Collections.singletonList() - ) - } - - fun toEmailResDto(user: User): EmailRes { - return EmailRes(email = user.email) - } - - fun toUserInterestListDto(interests: List?): UserInterestListDto { - return UserInterestListDto( - interestList = interests?.map { i -> UserInterestDto(i.category.value) }?.toList() - ) - } - - /** - * Utils - */ - fun createSmsKey() : String{ - return RandomStringUtils.random(5, false, true); - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/user/dto/eidReq/BusinessListReq.kt b/src/main/kotlin/com/psr/psr/user/dto/eidReq/BusinessListReq.kt index 0106e93..5708d6b 100644 --- a/src/main/kotlin/com/psr/psr/user/dto/eidReq/BusinessListReq.kt +++ b/src/main/kotlin/com/psr/psr/user/dto/eidReq/BusinessListReq.kt @@ -1,10 +1,17 @@ package com.psr.psr.user.dto.eidReq +import com.psr.psr.user.dto.request.UserEidReq import jakarta.validation.constraints.NotBlank +import java.util.* data class BusinessListReq ( @field:NotBlank val businesses: List ){ - + companion object{ + fun toUserEidList(userEidReq: UserEidReq): BusinessListReq { + val business = Business(userEidReq.number, userEidReq.companyDate, userEidReq.ownerName, userEidReq.companyName) + return BusinessListReq(Collections.singletonList(business)) + } + } } \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/user/dto/phoneReq/SMSReq.kt b/src/main/kotlin/com/psr/psr/user/dto/phoneReq/SMSReq.kt index efd2f2f..5d1c697 100644 --- a/src/main/kotlin/com/psr/psr/user/dto/phoneReq/SMSReq.kt +++ b/src/main/kotlin/com/psr/psr/user/dto/phoneReq/SMSReq.kt @@ -1,5 +1,7 @@ package com.psr.psr.user.dto.phoneReq +import com.psr.psr.user.dto.request.ValidPhoneReq + data class SMSReq ( val type: String?= "SMS", val contentType: String?="COMM", @@ -7,4 +9,15 @@ data class SMSReq ( val from: String, val content: String, val messages: List -) \ No newline at end of file +){ + companion object{ + fun toSMSReqDto(validPhoneReq: ValidPhoneReq, key: String, sendPhone: String) : SMSReq{ + val message = MessageReq(to = validPhoneReq.phone) + return SMSReq( + from = sendPhone, + content = "[PSR] 인증번호는 [ $key ] 을 입력해주세요", + messages = listOf(message) // 싱글톤 list = Collections.singletonList() + ) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/user/dto/response/EmailRes.kt b/src/main/kotlin/com/psr/psr/user/dto/response/EmailRes.kt index 1454e16..682a334 100644 --- a/src/main/kotlin/com/psr/psr/user/dto/response/EmailRes.kt +++ b/src/main/kotlin/com/psr/psr/user/dto/response/EmailRes.kt @@ -1,6 +1,14 @@ package com.psr.psr.user.dto.response +import com.psr.psr.user.entity.User + data class EmailRes( val email: String, -) \ No newline at end of file +){ + companion object{ + fun toEmailResDto(user: User): EmailRes { + return EmailRes(email = user.email) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/user/dto/response/MyPageInfoRes.kt b/src/main/kotlin/com/psr/psr/user/dto/response/MyPageInfoRes.kt index 605326c..35cc25a 100644 --- a/src/main/kotlin/com/psr/psr/user/dto/response/MyPageInfoRes.kt +++ b/src/main/kotlin/com/psr/psr/user/dto/response/MyPageInfoRes.kt @@ -1,5 +1,7 @@ package com.psr.psr.user.dto.response +import com.psr.psr.user.entity.User + data class MyPageInfoRes( val email: String, @@ -7,4 +9,10 @@ data class MyPageInfoRes( val type: String, val phone: String, val nickname: String, -) \ No newline at end of file +){ + companion object{ + fun toMyPageInfoRes(user: User) : MyPageInfoRes { + return MyPageInfoRes(user.email, user.imgUrl, user.type.value, user.phone, user.nickname) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/user/dto/response/ProfileRes.kt b/src/main/kotlin/com/psr/psr/user/dto/response/ProfileRes.kt index e997d5b..e3c6186 100644 --- a/src/main/kotlin/com/psr/psr/user/dto/response/ProfileRes.kt +++ b/src/main/kotlin/com/psr/psr/user/dto/response/ProfileRes.kt @@ -1,7 +1,15 @@ package com.psr.psr.user.dto.response +import com.psr.psr.user.entity.User + data class ProfileRes( val nickname: String, val imgUrl: String? = null -) \ No newline at end of file +){ + companion object{ + fun toProfileRes(user: User) : ProfileRes { + return ProfileRes(user.nickname, user.imgUrl) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/psr/psr/user/entity/BusinessInfo.kt b/src/main/kotlin/com/psr/psr/user/entity/BusinessInfo.kt index 7e52c12..204196e 100644 --- a/src/main/kotlin/com/psr/psr/user/entity/BusinessInfo.kt +++ b/src/main/kotlin/com/psr/psr/user/entity/BusinessInfo.kt @@ -1,10 +1,12 @@ package com.psr.psr.user.entity import com.psr.psr.global.entity.BaseEntity +import com.psr.psr.user.dto.request.SignUpReq import jakarta.persistence.* import org.hibernate.annotations.SQLDelete import org.jetbrains.annotations.NotNull import java.time.LocalDate +import java.time.format.DateTimeFormatter @Entity @SQLDelete(sql = "UPDATE business_info SET status = 'inactive', updated_at = current_timestamp WHERE id = ?") @@ -27,4 +29,16 @@ data class BusinessInfo( @NotNull var date: LocalDate -): BaseEntity() +): BaseEntity(){ + companion object{ + fun toBusinessEntity(user: User, signUpReq: SignUpReq): BusinessInfo { + val format = DateTimeFormatter.ofPattern("yyyyMMdd") + return BusinessInfo(user = user, + companyName = signUpReq.entreInfo!!.companyName, + ownerName = signUpReq.entreInfo.ownerName, + number = signUpReq.entreInfo.number, + date = LocalDate.parse(signUpReq.entreInfo.companyDate, format) + ) + } + } +} diff --git a/src/main/kotlin/com/psr/psr/user/entity/User.kt b/src/main/kotlin/com/psr/psr/user/entity/User.kt index 74aa061..60921f1 100644 --- a/src/main/kotlin/com/psr/psr/user/entity/User.kt +++ b/src/main/kotlin/com/psr/psr/user/entity/User.kt @@ -3,6 +3,7 @@ package com.psr.psr.user.entity import com.psr.psr.global.entity.BaseEntity import com.psr.psr.global.entityListener.UserEntityListener import com.psr.psr.product.entity.Product +import com.psr.psr.user.dto.request.SignUpReq import jakarta.persistence.* import org.hibernate.annotations.DynamicInsert import org.hibernate.annotations.DynamicUpdate @@ -65,4 +66,20 @@ class User( @Where(clause = "status = 'active'") var interests: List? = ArrayList() -): BaseEntity() +): BaseEntity(){ + companion object{ + fun toEntity(signUpReq: SignUpReq): User { + return User(email = signUpReq.email, + password = signUpReq.password, + type = Type.getTypeByValue(signUpReq.type), + phone = signUpReq.phone, + imgUrl = signUpReq.imgUrl, + provider = Provider.LOCAL, + marketing = signUpReq.marketing, + notification = signUpReq.notification, + name = signUpReq.name, + nickname = signUpReq.nickname, + deviceToken = signUpReq.deviceToken) + } + } +} diff --git a/src/main/kotlin/com/psr/psr/user/entity/UserInterest.kt b/src/main/kotlin/com/psr/psr/user/entity/UserInterest.kt index 19397e9..28fb4bd 100644 --- a/src/main/kotlin/com/psr/psr/user/entity/UserInterest.kt +++ b/src/main/kotlin/com/psr/psr/user/entity/UserInterest.kt @@ -1,9 +1,11 @@ package com.psr.psr.user.entity import com.psr.psr.global.entity.BaseEntity +import com.psr.psr.user.dto.request.SignUpReq import jakarta.persistence.* import org.hibernate.annotations.SQLDelete import org.jetbrains.annotations.NotNull +import java.util.stream.Collectors @Entity @SQLDelete(sql = "UPDATE user_interest SET status = 'inactive', updated_at = current_timestamp WHERE id = ?") @@ -19,4 +21,19 @@ data class UserInterest( @Enumerated(EnumType.STRING) var category: Category -): BaseEntity() +): BaseEntity(){ + companion object{ + fun toInterestListEntity(user: User, signUpReq: SignUpReq): List { + return signUpReq.interestList.stream() + .map { i -> + UserInterest(category = Category.getCategoryByValue(i.category), + user = user) + }.collect(Collectors.toList()) + } + + fun toInterestEntity(user: User, category: Category): UserInterest { + return UserInterest(user = user, + category = category) + } + } +} diff --git a/src/main/kotlin/com/psr/psr/user/service/UserService.kt b/src/main/kotlin/com/psr/psr/user/service/UserService.kt index 9a10ed8..6ecc5a7 100644 --- a/src/main/kotlin/com/psr/psr/user/service/UserService.kt +++ b/src/main/kotlin/com/psr/psr/user/service/UserService.kt @@ -21,21 +21,21 @@ import com.psr.psr.global.exception.BaseResponseCode.* import com.psr.psr.global.jwt.dto.TokenDto import com.psr.psr.global.jwt.utils.JwtUtils import com.psr.psr.user.dto.* -import com.psr.psr.user.dto.assembler.UserAssembler +import com.psr.psr.user.dto.eidReq.BusinessListReq import com.psr.psr.user.dto.eidReq.BusinessListRes +import com.psr.psr.user.dto.phoneReq.SMSReq import com.psr.psr.user.dto.request.* import com.psr.psr.user.dto.response.EmailRes import com.psr.psr.user.dto.response.MyPageInfoRes import com.psr.psr.user.dto.response.PostNotiRes import com.psr.psr.user.dto.response.ProfileRes -import com.psr.psr.user.entity.Category -import com.psr.psr.user.entity.Type -import com.psr.psr.user.entity.User +import com.psr.psr.user.entity.* import com.psr.psr.user.repository.BusinessInfoRepository import com.psr.psr.user.repository.UserInterestRepository import com.psr.psr.user.repository.UserRepository import com.psr.psr.user.utils.SmsUtils import jakarta.servlet.http.HttpServletRequest +import org.apache.commons.lang3.RandomStringUtils import org.apache.tomcat.util.codec.binary.Base64 import org.springframework.beans.factory.annotation.Value import org.springframework.http.HttpHeaders @@ -71,8 +71,6 @@ class UserService( private val serviceId: String, @Value("\${naver.cloud.sms.send-phone}") private val sendPhone: String, - private val userAssembler: UserAssembler - ) { // 회원가입 @Transactional @@ -96,13 +94,13 @@ class UserService( val encodedPassword = passwordEncoder.encode(signUpReq.password) signUpReq.password = encodedPassword // user 저장 - val user = userRepository.save(userAssembler.toEntity(signUpReq)) - userInterestRepository.saveAll(userAssembler.toInterestListEntity(user, signUpReq)) + val user = userRepository.save(User.toEntity(signUpReq)) + userInterestRepository.saveAll(UserInterest.toInterestListEntity(user, signUpReq)) // 사업자인경우 if (user.type == Type.ENTREPRENEUR){ if(signUpReq.entreInfo == null) throw BaseException(NOT_EMPTY_EID) - businessInfoRepository.save(userAssembler.toBusinessEntity(user, signUpReq)) + businessInfoRepository.save(BusinessInfo.toBusinessEntity(user, signUpReq)) } // token 생성 @@ -132,7 +130,7 @@ class UserService( // 사용자 프로필 불러오기 fun getProfile(user: User): ProfileRes { - return userAssembler.toProfileRes(user) + return ProfileRes.toProfileRes(user) } // 사용자 프로필 변경 @@ -171,7 +169,7 @@ class UserService( // 공공데이터포털에서 사용자 불러오기 private fun getEidInfo(userEidReq: UserEidReq): BusinessListRes { val url = EID_URL + serviceKey - val businesses = userAssembler.toUserEidList(userEidReq) + val businesses = BusinessListReq.toUserEidList(userEidReq) val json = ObjectMapper().writeValueAsString(businesses) val factory = DefaultUriBuilderFactory(url) factory.encodingMode = DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY; @@ -193,13 +191,13 @@ class UserService( // 마이페이지 정보 불러오기 fun getMyPageInfo(user: User): MyPageInfoRes { - return userAssembler.toMyPageInfoRes(user) + return MyPageInfoRes.toMyPageInfoRes(user) } // 토큰 재발급 fun reissueToken(tokenDto: TokenDto): TokenDto { // bearer String replace blank - userAssembler.toTokenDto(tokenDto) + TokenDto.toTokenDto(tokenDto) // refresh token 검증 jwtUtils.validateToken(tokenDto.refreshToken) // accessToken 내 사용자 정보 @@ -251,7 +249,7 @@ class UserService( .forEach { interest -> if(!categoryLists.contains(interest)) { // 과거에 삭제했던 경우 / 새롭게 생성하는 경우 - val interestE = userInterestRepository.findByUserAndCategory(user, interest)?: userAssembler.toInterestEntity(user, interest) + val interestE = userInterestRepository.findByUserAndCategory(user, interest)?: UserInterest.toInterestEntity(user, interest) interestE.status = ACTIVE_STATUS userInterestRepository.save(interestE) } @@ -267,7 +265,7 @@ class UserService( // 관심 목록 조회 fun getWatchList(user: User) :UserInterestListDto { - return userAssembler.toUserInterestListDto(user.interests) + return UserInterestListDto.toUserInterestListDto(user.interests) } // 유효 휴대폰 검증 @@ -277,7 +275,7 @@ class UserService( val url = FIRST_URL + MIDDLE_URL + serviceId + FINAL_URL val factory = DefaultUriBuilderFactory(url) factory.encodingMode = DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY - val smsKey = userAssembler.createSmsKey() + val smsKey = createSmsKey() WebClient.builder() .uriBuilderFactory(factory) @@ -287,7 +285,7 @@ class UserService( .defaultHeader(ACCESS_KEY_HEADER, accessKey) .defaultHeader(SIGNATURE_HEADER, makeSignature(time)) .build().post() - .bodyValue(this.userAssembler.toSMSReqDto(validPhoneReq, smsKey, sendPhone)) + .bodyValue(SMSReq.toSMSReqDto(validPhoneReq, smsKey, sendPhone)) .retrieve() .onStatus({ it.isError }) { response -> throw BaseException(PHONE_ERROR) @@ -309,7 +307,7 @@ class UserService( // 인증번호 확인 checkValidSmsKey(findIdPwReq.phone, findIdPwReq.smsKey) val user: User = userRepository.findByNameAndPhoneAndStatus(findIdPwReq.name!!, findIdPwReq.phone, ACTIVE_STATUS) ?: throw BaseException(NOT_FOUND_USER) - return userAssembler.toEmailResDto(user) + return EmailRes.toEmailResDto(user) } // 비밀번호 변경을 위한 인증 @@ -346,4 +344,8 @@ class UserService( val rawHmac = mac.doFinal(message.toByteArray(charset(UTF_8))) return Base64.encodeBase64String(rawHmac) } + + fun createSmsKey() : String{ + return RandomStringUtils.random(5, false, true); + } } \ No newline at end of file