회원 메시지 다국어 처리
회원/인증 API 응답 메시지를 다국어 키로 분리함.
This commit is contained in:
@@ -11,6 +11,8 @@ import kr.co.vividnext.sodalive.common.SodaException
|
||||
import kr.co.vividnext.sodalive.content.order.OrderService
|
||||
import kr.co.vividnext.sodalive.email.SendEmailService
|
||||
import kr.co.vividnext.sodalive.fcm.PushTokenService
|
||||
import kr.co.vividnext.sodalive.i18n.LangContext
|
||||
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
|
||||
import kr.co.vividnext.sodalive.jwt.TokenProvider
|
||||
import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository
|
||||
import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailUser
|
||||
@@ -95,6 +97,9 @@ class MemberService(
|
||||
private val passwordEncoder: PasswordEncoder,
|
||||
private val authenticationManagerBuilder: AuthenticationManagerBuilder,
|
||||
|
||||
private val messageSource: SodaMessageSource,
|
||||
private val langContext: LangContext,
|
||||
|
||||
private val objectMapper: ObjectMapper,
|
||||
|
||||
@Value("\${cloud.aws.s3.bucket}")
|
||||
@@ -109,13 +114,13 @@ class MemberService(
|
||||
@Transactional
|
||||
fun signUpV2(request: SignUpRequestV2): SignUpResponse {
|
||||
val stipulationTermsOfService = stipulationRepository.findByIdOrNull(StipulationIds.TERMS_OF_SERVICE_ID)
|
||||
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
|
||||
?: throw SodaException(messageKey = "member.validation.invalid_request_retry")
|
||||
|
||||
val stipulationPrivacyPolicy = stipulationRepository.findByIdOrNull(StipulationIds.PRIVACY_POLICY_ID)
|
||||
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
|
||||
?: throw SodaException(messageKey = "member.validation.invalid_request_retry")
|
||||
|
||||
if (!request.isAgreePrivacyPolicy || !request.isAgreeTermsOfService) {
|
||||
throw SodaException("약관에 동의하셔야 회원가입이 가능합니다.")
|
||||
throw SodaException(messageKey = "member.validation.agree_required")
|
||||
}
|
||||
|
||||
duplicateCheckEmail(request.email)
|
||||
@@ -160,14 +165,14 @@ class MemberService(
|
||||
requestString: String
|
||||
): SignUpResponse {
|
||||
val stipulationTermsOfService = stipulationRepository.findByIdOrNull(StipulationIds.TERMS_OF_SERVICE_ID)
|
||||
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
|
||||
?: throw SodaException(messageKey = "member.validation.invalid_request_retry")
|
||||
|
||||
val stipulationPrivacyPolicy = stipulationRepository.findByIdOrNull(StipulationIds.PRIVACY_POLICY_ID)
|
||||
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
|
||||
?: throw SodaException(messageKey = "member.validation.invalid_request_retry")
|
||||
|
||||
val request = objectMapper.readValue(requestString, SignUpRequest::class.java)
|
||||
if (!request.isAgreePrivacyPolicy || !request.isAgreeTermsOfService) {
|
||||
throw SodaException("약관에 동의하셔야 회원가입이 가능합니다.")
|
||||
throw SodaException(messageKey = "member.validation.agree_required")
|
||||
}
|
||||
|
||||
validatePassword(request.password)
|
||||
@@ -187,14 +192,14 @@ class MemberService(
|
||||
|
||||
fun login(request: LoginRequest): ApiResponse<LoginResponse> {
|
||||
return ApiResponse.ok(
|
||||
message = "로그인 되었습니다.",
|
||||
message = messageSource.getMessage("member.login.success", langContext.lang),
|
||||
data = login(request.email, request.password, request.isAdmin, request.isCreator)
|
||||
)
|
||||
}
|
||||
|
||||
fun getMember(id: Long, container: String): ProfileResponse {
|
||||
val member = repository.findByIdOrNull(id)
|
||||
?: throw SodaException("없는 사용자 입니다.")
|
||||
?: throw SodaException(messageKey = "member.validation.user_not_found")
|
||||
|
||||
return ProfileResponse(member, cloudFrontHost, container)
|
||||
}
|
||||
@@ -202,9 +207,9 @@ class MemberService(
|
||||
fun getMemberInfo(member: Member, container: String): GetMemberInfoResponse {
|
||||
val gender = if (member.auth != null) {
|
||||
if (member.auth!!.gender == 1) {
|
||||
"남"
|
||||
messageSource.getMessage("member.gender.male", langContext.lang)
|
||||
} else {
|
||||
"여"
|
||||
messageSource.getMessage("member.gender.female", langContext.lang)
|
||||
}
|
||||
} else {
|
||||
null
|
||||
@@ -260,7 +265,7 @@ class MemberService(
|
||||
@Transactional
|
||||
fun updateAdid(memberId: Long, adid: String) {
|
||||
val member = repository.findByIdOrNull(id = memberId)
|
||||
?: throw SodaException("로그인 정보를 확인해주세요.")
|
||||
?: throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
|
||||
member.adid = adid
|
||||
}
|
||||
@@ -305,28 +310,24 @@ class MemberService(
|
||||
isAdmin: Boolean = false,
|
||||
isCreator: Boolean = false
|
||||
): LoginResponse {
|
||||
val member = repository.findByEmail(email = email) ?: throw SodaException("없는 계정입니다.")
|
||||
val member = repository.findByEmail(email = email)
|
||||
?: throw SodaException(messageKey = "member.validation.account_not_found")
|
||||
|
||||
if (!member.isActive) {
|
||||
throw SodaException("탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.")
|
||||
throw SodaException(messageKey = "member.validation.inactive_account")
|
||||
}
|
||||
|
||||
if (member.provider != MemberProvider.EMAIL) {
|
||||
val provider = when (member.provider) {
|
||||
MemberProvider.APPLE -> "애플"
|
||||
MemberProvider.GOOGLE -> "구글"
|
||||
else -> "카카오"
|
||||
}
|
||||
|
||||
throw SodaException("해당 이메일은 $provider 계정으로 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.")
|
||||
val provider = resolveProviderLabel(member.provider)
|
||||
throw SodaException(message = formatMessage("member.validation.email_registered_with_provider", provider))
|
||||
}
|
||||
|
||||
if (isCreator && member.role != MemberRole.CREATOR) {
|
||||
throw SodaException("로그인 정보를 확인해주세요.")
|
||||
throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
}
|
||||
|
||||
if (isAdmin && member.role != MemberRole.ADMIN) {
|
||||
throw SodaException("로그인 정보를 확인해주세요.")
|
||||
throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
}
|
||||
|
||||
val authenticationToken = UsernamePasswordAuthenticationToken(email, password)
|
||||
@@ -414,22 +415,17 @@ class MemberService(
|
||||
|
||||
if (findMember != null) {
|
||||
if (findMember.provider == MemberProvider.EMAIL) {
|
||||
throw SodaException("이미 사용중인 이메일 입니다.", "email")
|
||||
throw SodaException(messageKey = "member.validation.email_in_use", errorProperty = "email")
|
||||
} else {
|
||||
val provider = when (findMember.provider) {
|
||||
MemberProvider.APPLE -> "애플"
|
||||
MemberProvider.GOOGLE -> "구글"
|
||||
else -> "카카오"
|
||||
}
|
||||
|
||||
val provider = resolveProviderLabel(findMember.provider)
|
||||
throw SodaException(
|
||||
"해당 이메일은 $provider 계정으로 이미 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.",
|
||||
"email"
|
||||
message = formatMessage("member.validation.email_registered_with_provider_already", provider),
|
||||
errorProperty = "email"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return ApiResponse.ok(message = "사용 가능한 이메일 입니다.")
|
||||
return ApiResponse.ok(message = messageSource.getMessage("member.validation.email_available", langContext.lang))
|
||||
}
|
||||
|
||||
private fun validateEmail(email: String) {
|
||||
@@ -441,8 +437,9 @@ class MemberService(
|
||||
|
||||
fun duplicateCheckNickname(nickname: String): ApiResponse<Any> {
|
||||
validateNickname(nickname)
|
||||
repository.findByNickname(nickname)?.let { throw SodaException("이미 사용중인 닉네임 입니다.", "nickname") }
|
||||
return ApiResponse.ok(message = "사용 가능한 닉네임 입니다.")
|
||||
repository.findByNickname(nickname)
|
||||
?.let { throw SodaException(messageKey = "member.validation.nickname_in_use", errorProperty = "nickname") }
|
||||
return ApiResponse.ok(message = messageSource.getMessage("member.validation.nickname_available", langContext.lang))
|
||||
}
|
||||
|
||||
private fun validateNickname(nickname: String) {
|
||||
@@ -469,8 +466,10 @@ class MemberService(
|
||||
)
|
||||
|
||||
if (creatorFollowing == null) {
|
||||
val creator = repository.findByIdOrNull(creatorId) ?: throw SodaException("크리에이터 정보를 확인해주세요.")
|
||||
val member = repository.findByIdOrNull(memberId) ?: throw SodaException("로그인 정보를 확인해주세요.")
|
||||
val creator = repository.findByIdOrNull(creatorId)
|
||||
?: throw SodaException(messageKey = "member.validation.creator_not_found")
|
||||
val member = repository.findByIdOrNull(memberId)
|
||||
?: throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
|
||||
val newCreatorFollowing = CreatorFollowing()
|
||||
newCreatorFollowing.member = member
|
||||
@@ -514,10 +513,10 @@ class MemberService(
|
||||
|
||||
if (blockMember == null) {
|
||||
val blockedMember = repository.findByIdOrNull(id = request.blockMemberId)
|
||||
?: throw SodaException("잘못된 요청입니다.")
|
||||
?: throw SodaException(messageKey = "common.error.invalid_request")
|
||||
|
||||
val member = repository.findByIdOrNull(id = memberId)
|
||||
?: throw SodaException("잘못된 요청입니다.")
|
||||
?: throw SodaException(messageKey = "common.error.invalid_request")
|
||||
|
||||
blockMember = BlockMember()
|
||||
blockMember.member = member
|
||||
@@ -545,7 +544,7 @@ class MemberService(
|
||||
|
||||
fun searchMember(nickname: String, member: Member): List<GetRoomDetailUser> {
|
||||
if (nickname.length < 2) {
|
||||
throw SodaException("두 글자 이상 입력 하셔야 합니다.")
|
||||
throw SodaException(messageKey = "member.validation.nickname_min_length")
|
||||
}
|
||||
|
||||
return repository.findByNicknameAndOtherCondition(nickname, member)
|
||||
@@ -560,7 +559,7 @@ class MemberService(
|
||||
@Transactional
|
||||
fun logout(token: String, memberId: Long) {
|
||||
val member = repository.findByIdOrNull(memberId)
|
||||
?: throw SodaException("로그인 정보를 확인해주세요.")
|
||||
?: throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
|
||||
member.pushToken = null
|
||||
pushTokenService.logout(memberId = memberId)
|
||||
@@ -568,7 +567,7 @@ class MemberService(
|
||||
val lock = getOrCreateLock(memberId = memberId)
|
||||
lock.write {
|
||||
val memberToken = tokenRepository.findByIdOrNull(memberId)
|
||||
?: throw SodaException("로그인 정보를 확인해주세요.")
|
||||
?: throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
|
||||
memberToken.tokenSet.remove(token)
|
||||
tokenRepository.save(memberToken)
|
||||
@@ -578,7 +577,7 @@ class MemberService(
|
||||
@Transactional
|
||||
fun logoutAll(memberId: Long) {
|
||||
val member = repository.findByIdOrNull(memberId)
|
||||
?: throw SodaException("로그인 정보를 확인해주세요.")
|
||||
?: throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
|
||||
member.pushToken = null
|
||||
pushTokenService.logout(memberId = memberId)
|
||||
@@ -589,16 +588,17 @@ class MemberService(
|
||||
|
||||
@Transactional
|
||||
fun signOut(signOutRequest: SignOutRequest, user: User) {
|
||||
val member = repository.findByEmail(user.username) ?: throw SodaException("로그인 정보를 확인해주세요.")
|
||||
val member = repository.findByEmail(user.username)
|
||||
?: throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
if (
|
||||
member.provider == MemberProvider.EMAIL &&
|
||||
!passwordEncoder.matches(signOutRequest.password, member.password)
|
||||
) {
|
||||
throw SodaException("비밀번호가 일치하지 않습니다.")
|
||||
throw SodaException(messageKey = "member.validation.password_mismatch")
|
||||
}
|
||||
|
||||
if (signOutRequest.reason.isBlank()) {
|
||||
throw SodaException("탈퇴하려는 이유를 입력해 주세요.")
|
||||
throw SodaException(messageKey = "member.validation.signout_reason_required")
|
||||
}
|
||||
|
||||
logoutAll(memberId = member.id!!)
|
||||
@@ -617,15 +617,16 @@ class MemberService(
|
||||
@Transactional
|
||||
fun updateNickname(profileUpdateRequest: ProfileUpdateRequest, user: User) {
|
||||
if (profileUpdateRequest.email != user.username) {
|
||||
throw SodaException("로그인 정보를 확인해 주세요.")
|
||||
throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
}
|
||||
|
||||
val member = repository.findByEmail(user.username) ?: throw SodaException("로그인 정보를 확인해주세요.")
|
||||
val member = repository.findByEmail(user.username)
|
||||
?: throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
|
||||
if (profileUpdateRequest.nickname != null) {
|
||||
validateNickname(profileUpdateRequest.nickname)
|
||||
repository.findByNickname(profileUpdateRequest.nickname)
|
||||
?.let { throw SodaException("이미 사용중인 닉네임 입니다.") }
|
||||
?.let { throw SodaException(messageKey = "member.validation.nickname_in_use") }
|
||||
|
||||
val price = repository.getChangeNicknamePrice(memberId = member.id!!).price
|
||||
if (price > 0) {
|
||||
@@ -648,17 +649,18 @@ class MemberService(
|
||||
@Transactional
|
||||
fun profileUpdate(profileUpdateRequest: ProfileUpdateRequest, user: User): ProfileResponse {
|
||||
if (profileUpdateRequest.email != user.username) {
|
||||
throw SodaException("로그인 정보를 확인해 주세요.")
|
||||
throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
}
|
||||
|
||||
val member = repository.findByEmail(user.username) ?: throw SodaException("로그인 정보를 확인해주세요.")
|
||||
val member = repository.findByEmail(user.username)
|
||||
?: throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
|
||||
if (profileUpdateRequest.modifyPassword != null) {
|
||||
if (passwordEncoder.matches(profileUpdateRequest.password, member.password)) {
|
||||
validatePassword(profileUpdateRequest.modifyPassword)
|
||||
member.password = passwordEncoder.encode(profileUpdateRequest.modifyPassword)
|
||||
} else {
|
||||
throw SodaException("비밀번호가 일치하지 않습니다.")
|
||||
throw SodaException(messageKey = "member.validation.password_mismatch")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -669,7 +671,7 @@ class MemberService(
|
||||
if (profileUpdateRequest.nickname != null) {
|
||||
validateNickname(profileUpdateRequest.nickname)
|
||||
repository.findByNickname(profileUpdateRequest.nickname)
|
||||
?.let { throw SodaException("이미 사용중인 닉네임 입니다.") }
|
||||
?.let { throw SodaException(messageKey = "member.validation.nickname_in_use") }
|
||||
member.nickname = profileUpdateRequest.nickname
|
||||
}
|
||||
|
||||
@@ -723,7 +725,8 @@ class MemberService(
|
||||
|
||||
@Transactional
|
||||
fun profileImageUpdate(multipartFile: MultipartFile, user: User): String {
|
||||
val member = repository.findByEmail(user.username) ?: throw SodaException("로그인 정보를 확인해주세요.")
|
||||
val member = repository.findByEmail(user.username)
|
||||
?: throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
|
||||
val metadata = ObjectMetadata()
|
||||
metadata.contentLength = multipartFile.size
|
||||
@@ -741,17 +744,11 @@ class MemberService(
|
||||
@Transactional
|
||||
fun forgotPassword(request: ForgotPasswordRequest) {
|
||||
val member = repository.getMemberByEmail(email = request.email)
|
||||
?: throw SodaException("등록되지 않은 계정입니다.\n확인 후 다시 시도해 주세요.")
|
||||
?: throw SodaException(messageKey = "member.validation.unregistered_account_retry")
|
||||
|
||||
val provider = when (member.provider) {
|
||||
MemberProvider.EMAIL -> "이메일"
|
||||
MemberProvider.KAKAO -> "카카오"
|
||||
MemberProvider.GOOGLE -> "구글"
|
||||
MemberProvider.APPLE -> "애플"
|
||||
}
|
||||
|
||||
if (provider != "이메일") {
|
||||
throw SodaException("해당 계정은 $provider 계정으로 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.")
|
||||
if (member.provider != MemberProvider.EMAIL) {
|
||||
val provider = resolveProviderLabel(member.provider)
|
||||
throw SodaException(message = formatMessage("member.validation.email_registered_with_provider", provider))
|
||||
}
|
||||
|
||||
val password = generatePassword(12)
|
||||
@@ -779,6 +776,21 @@ class MemberService(
|
||||
return repository.getMemberProfile(memberId, myMemberId)
|
||||
}
|
||||
|
||||
private fun formatMessage(key: String, vararg args: Any): String {
|
||||
val template = messageSource.getMessage(key, langContext.lang) ?: ""
|
||||
return if (args.isEmpty()) template else String.format(template, *args)
|
||||
}
|
||||
|
||||
private fun resolveProviderLabel(provider: MemberProvider): String {
|
||||
val key = when (provider) {
|
||||
MemberProvider.EMAIL -> "member.provider.email"
|
||||
MemberProvider.KAKAO -> "member.provider.kakao"
|
||||
MemberProvider.GOOGLE -> "member.provider.google"
|
||||
MemberProvider.APPLE -> "member.provider.apple"
|
||||
}
|
||||
return messageSource.getMessage(key, langContext.lang) ?: provider.name
|
||||
}
|
||||
|
||||
private fun getOrCreateLock(memberId: Long): ReentrantReadWriteLock {
|
||||
return tokenLocks.computeIfAbsent(memberId) { ReentrantReadWriteLock() }
|
||||
}
|
||||
@@ -786,7 +798,7 @@ class MemberService(
|
||||
@Transactional
|
||||
fun updateMarketingInfo(memberId: Long, adid: String, pid: String): String? {
|
||||
val member = repository.findByIdOrNull(id = memberId)
|
||||
?: throw SodaException("로그인 정보를 확인해주세요.")
|
||||
?: throw SodaException(messageKey = "common.error.bad_credentials")
|
||||
|
||||
if (adid != member.adid) {
|
||||
member.adid = adid
|
||||
@@ -814,15 +826,15 @@ class MemberService(
|
||||
if (findMember.isActive) {
|
||||
return MemberResolveResult(member = findMember, isNew = false)
|
||||
} else {
|
||||
throw SodaException("탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.")
|
||||
throw SodaException(messageKey = "member.validation.inactive_account")
|
||||
}
|
||||
}
|
||||
|
||||
val stipulationTermsOfService = stipulationRepository.findByIdOrNull(StipulationIds.TERMS_OF_SERVICE_ID)
|
||||
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
|
||||
?: throw SodaException(messageKey = "member.validation.invalid_request_retry")
|
||||
|
||||
val stipulationPrivacyPolicy = stipulationRepository.findByIdOrNull(StipulationIds.PRIVACY_POLICY_ID)
|
||||
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
|
||||
?: throw SodaException(messageKey = "member.validation.invalid_request_retry")
|
||||
|
||||
val email = googleUserInfo.email
|
||||
checkEmail(email)
|
||||
@@ -870,15 +882,15 @@ class MemberService(
|
||||
if (findMember.isActive) {
|
||||
return MemberResolveResult(member = findMember, isNew = false)
|
||||
} else {
|
||||
throw SodaException("탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.")
|
||||
throw SodaException(messageKey = "member.validation.inactive_account")
|
||||
}
|
||||
}
|
||||
|
||||
val stipulationTermsOfService = stipulationRepository.findByIdOrNull(StipulationIds.TERMS_OF_SERVICE_ID)
|
||||
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
|
||||
?: throw SodaException(messageKey = "member.validation.invalid_request_retry")
|
||||
|
||||
val stipulationPrivacyPolicy = stipulationRepository.findByIdOrNull(StipulationIds.PRIVACY_POLICY_ID)
|
||||
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
|
||||
?: throw SodaException(messageKey = "member.validation.invalid_request_retry")
|
||||
|
||||
val email = kakaoUserInfo.email
|
||||
checkEmail(email)
|
||||
@@ -918,13 +930,8 @@ class MemberService(
|
||||
val member = repository.findByEmail(email)
|
||||
|
||||
if (member != null) {
|
||||
val provider = when (member.provider) {
|
||||
MemberProvider.APPLE -> "애플"
|
||||
MemberProvider.GOOGLE -> "구글"
|
||||
else -> "카카오"
|
||||
}
|
||||
|
||||
throw SodaException("해당 이메일은 $provider 계정으로 가입되어 있습니다. 해당 소셜 로그인을 사용해 주세요.")
|
||||
val provider = resolveProviderLabel(member.provider)
|
||||
throw SodaException(message = formatMessage("member.validation.email_registered_with_provider", provider))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user