|
|
|
@@ -7,6 +7,7 @@ import kr.co.vividnext.sodalive.can.payment.CanPaymentService
|
|
|
|
|
import kr.co.vividnext.sodalive.can.use.CanUsage
|
|
|
|
|
import kr.co.vividnext.sodalive.common.ApiResponse
|
|
|
|
|
import kr.co.vividnext.sodalive.common.SodaException
|
|
|
|
|
import kr.co.vividnext.sodalive.email.SendEmailService
|
|
|
|
|
import kr.co.vividnext.sodalive.jwt.TokenProvider
|
|
|
|
|
import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailUser
|
|
|
|
|
import kr.co.vividnext.sodalive.member.block.BlockMember
|
|
|
|
@@ -33,6 +34,7 @@ import kr.co.vividnext.sodalive.member.tag.MemberCreatorTag
|
|
|
|
|
import kr.co.vividnext.sodalive.member.tag.MemberTagRepository
|
|
|
|
|
import kr.co.vividnext.sodalive.member.token.MemberTokenRepository
|
|
|
|
|
import kr.co.vividnext.sodalive.utils.generateFileName
|
|
|
|
|
import kr.co.vividnext.sodalive.utils.generatePassword
|
|
|
|
|
import org.springframework.beans.factory.annotation.Value
|
|
|
|
|
import org.springframework.data.repository.findByIdOrNull
|
|
|
|
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken
|
|
|
|
@@ -46,6 +48,9 @@ import org.springframework.security.crypto.password.PasswordEncoder
|
|
|
|
|
import org.springframework.stereotype.Service
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional
|
|
|
|
|
import org.springframework.web.multipart.MultipartFile
|
|
|
|
|
import java.time.LocalDateTime
|
|
|
|
|
import java.time.ZoneId
|
|
|
|
|
import java.time.format.DateTimeFormatter
|
|
|
|
|
import java.util.concurrent.locks.ReentrantReadWriteLock
|
|
|
|
|
import kotlin.concurrent.write
|
|
|
|
|
|
|
|
|
@@ -62,6 +67,7 @@ class MemberService(
|
|
|
|
|
private val nicknameChangeLogRepository: NicknameChangeLogRepository,
|
|
|
|
|
private val memberTagRepository: MemberTagRepository,
|
|
|
|
|
|
|
|
|
|
private val emailService: SendEmailService,
|
|
|
|
|
private val canPaymentService: CanPaymentService,
|
|
|
|
|
private val memberNotificationService: MemberNotificationService,
|
|
|
|
|
|
|
|
|
@@ -546,6 +552,32 @@ class MemberService(
|
|
|
|
|
return "$cloudFrontHost/${member.profileImage!!}"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Transactional
|
|
|
|
|
fun forgotPassword(request: ForgotPasswordRequest) {
|
|
|
|
|
val member = repository.getMemberByEmail(email = request.email)
|
|
|
|
|
?: throw SodaException("등록되지 않은 계정입니다.\n확인 후 다시 시도해 주세요.")
|
|
|
|
|
|
|
|
|
|
val password = generatePassword(12)
|
|
|
|
|
member.password = passwordEncoder.encode(password)
|
|
|
|
|
|
|
|
|
|
val date = LocalDateTime.now()
|
|
|
|
|
.atZone(ZoneId.of("UTC"))
|
|
|
|
|
.withZoneSameInstant(ZoneId.of("Asia/Seoul"))
|
|
|
|
|
.format(DateTimeFormatter.ofPattern("yyyy년 MM월 dd일, HH:mm"))
|
|
|
|
|
|
|
|
|
|
val data = HashMap<String, String>()
|
|
|
|
|
data["password"] = password
|
|
|
|
|
data["date"] = date
|
|
|
|
|
|
|
|
|
|
val templateData = objectMapper.writeValueAsString(data)
|
|
|
|
|
|
|
|
|
|
emailService.sendTemplatedEmail(
|
|
|
|
|
template = "sodalive-find-password",
|
|
|
|
|
templateData = templateData,
|
|
|
|
|
receiver = request.email
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun getOrCreateLock(memberId: Long): ReentrantReadWriteLock {
|
|
|
|
|
return tokenLocks.computeIfAbsent(memberId) { ReentrantReadWriteLock() }
|
|
|
|
|
}
|
|
|
|
|