크리에이터 관리자 메시지 다국어화

This commit is contained in:
2025-12-23 16:54:48 +09:00
parent 4087d11420
commit f38382d2be
8 changed files with 120 additions and 28 deletions

View File

@@ -23,7 +23,7 @@ class CreatorAdminContentController(private val service: CreatorAdminContentServ
pageable: Pageable,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
ApiResponse.ok(service.getAudioContentList(pageable, member))
}
@@ -34,7 +34,7 @@ class CreatorAdminContentController(private val service: CreatorAdminContentServ
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
ApiResponse.ok(service.searchAudioContent(searchWord, member, pageable))
}
@@ -45,7 +45,7 @@ class CreatorAdminContentController(private val service: CreatorAdminContentServ
@RequestPart("request") requestString: String,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
ApiResponse.ok(service.updateAudioContent(coverImage, requestString, member))
}

View File

@@ -72,7 +72,7 @@ class CreatorAdminContentService(
}
fun searchAudioContent(searchWord: String, member: Member, pageable: Pageable): GetCreatorAdminContentListResponse {
if (searchWord.length < 2) throw SodaException("2글자 이상 입력하세요.")
if (searchWord.length < 2) throw SodaException(messageKey = "creator.admin.content.search_word_min_length")
val totalCount = repository.getAudioContentTotalCount(
memberId = member.id!!,
searchWord
@@ -113,7 +113,7 @@ class CreatorAdminContentService(
fun updateAudioContent(coverImage: MultipartFile?, requestString: String, member: Member) {
val request = objectMapper.readValue(requestString, UpdateCreatorAdminContentRequest::class.java)
val audioContent = repository.getAudioContent(memberId = member.id!!, audioContentId = request.id)
?: throw SodaException("잘못된 콘텐츠 입니다.")
?: throw SodaException(messageKey = "creator.admin.content.invalid_content")
if (coverImage != null) {
val metadata = ObjectMetadata()
@@ -157,7 +157,7 @@ class CreatorAdminContentService(
}
if (request.price != null) {
if (request.price < 5) throw SodaException("콘텐츠의 최소금액은 5캔 입니다.")
if (request.price < 5) throw SodaException(messageKey = "creator.admin.content.min_price")
val contentPriceChangeLog = ContentPriceChangeLog(prevPrice = audioContent.price)
contentPriceChangeLog.audioContent = audioContent

View File

@@ -21,7 +21,7 @@ class CreatorAdminCategoryController(private val service: CreatorAdminCategorySe
@RequestParam(value = "search_word") searchWord: String,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
ApiResponse.ok(
service.searchContentNotInCategory(
@@ -38,7 +38,7 @@ class CreatorAdminCategoryController(private val service: CreatorAdminCategorySe
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
ApiResponse.ok(
service.getContentInCategory(

View File

@@ -24,7 +24,7 @@ class CreatorAdminMemberController(private val service: CreatorAdminMemberServic
@RequestHeader("Authorization") token: String,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
ApiResponse.ok(service.logout(token.removePrefix("Bearer "), member.id!!))
}

View File

@@ -3,6 +3,8 @@ package kr.co.vividnext.sodalive.creator.admin.member
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SodaException
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.member.MemberRepository
import kr.co.vividnext.sodalive.member.MemberRole
@@ -27,6 +29,8 @@ class CreatorAdminMemberService(
private val authenticationManagerBuilder: AuthenticationManagerBuilder,
private val pushTokenService: PushTokenService,
private val messageSource: SodaMessageSource,
private val langContext: LangContext,
@Value("\${cloud.aws.cloud-front.host}")
private val cloudFrontHost: String
@@ -36,7 +40,7 @@ class CreatorAdminMemberService(
fun login(request: LoginRequest): ApiResponse<LoginResponse> {
return ApiResponse.ok(
message = "로그인 되었습니다.",
message = messageSource.getMessage("creator.admin.member.login_success", langContext.lang),
data = login(request.email, request.password)
)
}
@@ -44,7 +48,7 @@ class CreatorAdminMemberService(
@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)
@@ -52,7 +56,7 @@ class CreatorAdminMemberService(
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)
@@ -60,13 +64,14 @@ class CreatorAdminMemberService(
}
private fun login(email: String, password: String): LoginResponse {
val member = repository.findByEmail(email = email) ?: throw SodaException("로그인 정보를 확인해주세요.")
val member = repository.findByEmail(email = email)
?: throw SodaException(messageKey = "common.error.bad_credentials")
if (!member.isActive) {
throw SodaException("탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.")
throw SodaException(messageKey = "creator.admin.member.inactive_account")
}
if (member.role != MemberRole.CREATOR) {
throw SodaException("로그인 정보를 확인해주세요.")
throw SodaException(messageKey = "common.error.bad_credentials")
}
val authenticationToken = UsernamePasswordAuthenticationToken(email, password)

View File

@@ -2,6 +2,8 @@ package kr.co.vividnext.sodalive.creator.admin.signature
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.i18n.LangContext
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
import kr.co.vividnext.sodalive.live.signature.SignatureCanSortType
import kr.co.vividnext.sodalive.member.Member
import org.springframework.data.domain.Pageable
@@ -18,14 +20,18 @@ import org.springframework.web.multipart.MultipartFile
@RestController
@PreAuthorize("hasRole('CREATOR')")
@RequestMapping("/creator-admin/signature")
class CreatorAdminSignatureController(private val service: CreatorAdminSignatureService) {
class CreatorAdminSignatureController(
private val service: CreatorAdminSignatureService,
private val messageSource: SodaMessageSource,
private val langContext: LangContext
) {
@GetMapping
fun getSignatureCanList(
pageable: Pageable,
@RequestParam("sort-type", required = false) sortType: SignatureCanSortType?,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
ApiResponse.ok(
data = service.getSignatureList(
@@ -44,7 +50,7 @@ class CreatorAdminSignatureController(private val service: CreatorAdminSignature
@RequestParam("isAdult", required = false) isAdult: Boolean? = false,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
ApiResponse.ok(
service.createSignature(
@@ -54,7 +60,7 @@ class CreatorAdminSignatureController(private val service: CreatorAdminSignature
isAdult = isAdult ?: false,
memberId = member.id!!
),
"등록되었습니다."
messageSource.getMessage("creator.admin.signature.created", langContext.lang)
)
}
@@ -68,9 +74,9 @@ class CreatorAdminSignatureController(private val service: CreatorAdminSignature
@RequestParam("isAdult", required = false) isAdult: Boolean?,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
if (can == null && time == null && image == null && isActive == null && isAdult == null) {
throw SodaException("변경사항이 없습니다.")
throw SodaException(messageKey = "creator.admin.signature.no_changes")
}
ApiResponse.ok(
@@ -83,7 +89,11 @@ class CreatorAdminSignatureController(private val service: CreatorAdminSignature
isAdult = isAdult,
memberId = member.id!!
),
if (isActive == false) "삭제되었습니다." else "수정되었습니다."
if (isActive == false) {
messageSource.getMessage("creator.admin.signature.deleted", langContext.lang)
} else {
messageSource.getMessage("creator.admin.signature.updated", langContext.lang)
}
)
}
}

View File

@@ -44,11 +44,11 @@ class CreatorAdminSignatureService(
@Transactional
fun createSignature(can: Int, time: Int, image: MultipartFile, memberId: Long, isAdult: Boolean) {
if (can <= 0) throw SodaException("1캔 이상 설정할 수 있습니다.")
if (time < 3 || time > 20) throw SodaException("시간은 3초 이상 20초 이하로 설정할 수 있습니다.")
if (can <= 0) throw SodaException(messageKey = "creator.admin.signature.min_can")
if (time < 3 || time > 20) throw SodaException(messageKey = "creator.admin.signature.time_range")
val member = memberRepository.findCreatorByIdOrNull(memberId = memberId)
?: throw SodaException("잘못된 접근입니다.")
?: throw SodaException(messageKey = "creator.admin.signature.invalid_access")
val signatureCan = SignatureCan(can = can, time = time, isAdult = isAdult)
signatureCan.creator = member
@@ -77,15 +77,15 @@ class CreatorAdminSignatureService(
isAdult: Boolean?
) {
val signatureCan = repository.findSignatureByIdOrNull(id = id, memberId = memberId)
?: throw SodaException("잘못된 요청입니다.")
?: throw SodaException(messageKey = "creator.admin.signature.invalid_request")
if (can != null) {
if (can <= 0) throw SodaException("1캔 이상 설정할 수 있습니다.")
if (can <= 0) throw SodaException(messageKey = "creator.admin.signature.min_can")
signatureCan.can = can
}
if (time != null) {
if (time < 3 || time > 20) throw SodaException("시간은 3초 이상 20초 이하로 설정할 수 있습니다.")
if (time < 3 || time > 20) throw SodaException(messageKey = "creator.admin.signature.time_range")
signatureCan.time = time
}

View File

@@ -1098,6 +1098,80 @@ class SodaMessageSource {
)
)
private val creatorAdminMemberMessages = mapOf(
"creator.admin.member.login_success" to mapOf(
Lang.KO to "로그인 되었습니다.",
Lang.EN to "Logged in.",
Lang.JA to "ログインしました。"
),
"creator.admin.member.inactive_account" to mapOf(
Lang.KO to "탈퇴한 계정입니다.\n고객센터로 문의해 주시기 바랍니다.",
Lang.EN to "This account has been deactivated.\nPlease contact customer support.",
Lang.JA to "退会したアカウントです。\nカスタマーサポートにお問い合わせください。"
)
)
private val creatorAdminSignatureMessages = mapOf(
"creator.admin.signature.created" to mapOf(
Lang.KO to "등록되었습니다.",
Lang.EN to "Successfully registered.",
Lang.JA to "登録されました。"
),
"creator.admin.signature.updated" to mapOf(
Lang.KO to "수정되었습니다.",
Lang.EN to "Updated.",
Lang.JA to "更新されました。"
),
"creator.admin.signature.deleted" to mapOf(
Lang.KO to "삭제되었습니다.",
Lang.EN to "Deleted.",
Lang.JA to "削除されました。"
),
"creator.admin.signature.no_changes" to mapOf(
Lang.KO to "변경사항이 없습니다.",
Lang.EN to "No changes to update.",
Lang.JA to "変更事項がありません。"
),
"creator.admin.signature.min_can" to mapOf(
Lang.KO to "1캔 이상 설정할 수 있습니다.",
Lang.EN to "You can set at least 1 can.",
Lang.JA to "1缶以上設定できます。"
),
"creator.admin.signature.time_range" to mapOf(
Lang.KO to "시간은 3초 이상 20초 이하로 설정할 수 있습니다.",
Lang.EN to "Time must be between 3 and 20 seconds.",
Lang.JA to "時間は3秒以上20秒以下に設定できます。"
),
"creator.admin.signature.invalid_access" to mapOf(
Lang.KO to "잘못된 접근입니다.",
Lang.EN to "Invalid access.",
Lang.JA to "不正なアクセスです。"
),
"creator.admin.signature.invalid_request" to mapOf(
Lang.KO to "잘못된 요청입니다.",
Lang.EN to "Invalid request.",
Lang.JA to "不正なリクエストです。"
)
)
private val creatorAdminContentMessages = mapOf(
"creator.admin.content.search_word_min_length" to mapOf(
Lang.KO to "2글자 이상 입력하세요.",
Lang.EN to "Please enter at least 2 characters.",
Lang.JA to "2文字以上入力してください。"
),
"creator.admin.content.invalid_content" to mapOf(
Lang.KO to "잘못된 콘텐츠 입니다.",
Lang.EN to "Invalid content.",
Lang.JA to "不正なコンテンツです。"
),
"creator.admin.content.min_price" to mapOf(
Lang.KO to "콘텐츠의 최소금액은 5캔 입니다.",
Lang.EN to "Minimum price for content is 5 cans.",
Lang.JA to "コンテンツの最低価格は5缶です。"
)
)
private val creatorCommunityMessages = mapOf(
"creator.community.paid_post_image_required" to mapOf(
Lang.KO to "유료 게시글 등록을 위해서는 이미지가 필요합니다.",
@@ -1185,6 +1259,9 @@ class SodaMessageSource {
explorerResponseMessages,
explorerValidationMessages,
explorerAccessMessages,
creatorAdminMemberMessages,
creatorAdminSignatureMessages,
creatorAdminContentMessages,
creatorCommunityMessages
)
for (messages in messageGroups) {