From 7ef654e89d821c644f6c125bec710aac5d68a98d Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 23 Dec 2025 17:35:38 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EB=8B=A4=EA=B5=AD=EC=96=B4=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/banner/AdminEventBannerService.kt | 14 +- .../event/charge/AdminChargeEventService.kt | 2 +- .../admin/explorer/AdminExplorerService.kt | 14 +- .../sodalive/admin/live/AdminLiveService.kt | 46 ++-- .../signature/AdminSignatureCanController.kt | 14 +- .../signature/AdminSignatureCanService.kt | 14 +- .../marketing/AdminAdMediaPartnerService.kt | 2 +- .../admin/member/AdminMemberService.kt | 32 +-- .../admin/member/tag/AdminMemberTagService.kt | 8 +- .../admin/point/PointPolicyService.kt | 2 +- .../member/AdminMemberStatisticsService.kt | 2 +- .../sodalive/i18n/SodaMessageSource.kt | 215 ++++++++++++++++++ 12 files changed, 305 insertions(+), 60 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/banner/AdminEventBannerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/banner/AdminEventBannerService.kt index a762b8ca..7aa7bacb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/banner/AdminEventBannerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/banner/AdminEventBannerService.kt @@ -34,7 +34,9 @@ class AdminEventBannerService( startDateString: String, endDateString: String ): Long { - if (detail == null && link.isNullOrBlank()) throw SodaException("상세이미지 혹은 링크를 등록하세요") + if (detail == null && link.isNullOrBlank()) { + throw SodaException(messageKey = "admin.event.banner.detail_or_link_required") + } val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm") val startDate = LocalDateTime.parse(startDateString, dateTimeFormatter) @@ -102,7 +104,7 @@ class AdminEventBannerService( event.detailImage = detailImagePath event.popupImage = popupImagePath - return event.id ?: throw SodaException("이벤트 등록을 하지 못했습니다.") + return event.id ?: throw SodaException(messageKey = "admin.event.banner.create_failed") } @Transactional @@ -118,10 +120,10 @@ class AdminEventBannerService( startDateString: String? = null, endDateString: String? = null ) { - if (id <= 0) throw SodaException("잘못된 요청입니다.") + if (id <= 0) throw SodaException(messageKey = "common.error.invalid_request") val event = repository.findByIdOrNull(id) - ?: throw SodaException("잘못된 요청입니다.") + ?: throw SodaException(messageKey = "common.error.invalid_request") if (thumbnail != null) { val metadata = ObjectMetadata() @@ -190,9 +192,9 @@ class AdminEventBannerService( @Transactional fun delete(id: Long) { - if (id <= 0) throw SodaException("잘못된 요청입니다.") + if (id <= 0) throw SodaException(messageKey = "common.error.invalid_request") val event = repository.findByIdOrNull(id) - ?: throw SodaException("잘못된 요청입니다.") + ?: throw SodaException(messageKey = "common.error.invalid_request") event.isActive = false } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventService.kt index c36d54e9..01e3025f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/event/charge/AdminChargeEventService.kt @@ -38,7 +38,7 @@ class AdminChargeEventService(private val repository: AdminChargeEventRepository @Transactional fun modifyChargeEvent(request: ModifyChargeEventRequest) { val chargeEvent = repository.findByIdOrNull(request.id) - ?: throw SodaException("해당하는 충전이벤트가 없습니다\n다시 시도해 주세요.") + ?: throw SodaException(messageKey = "admin.charge_event.not_found_retry") if (request.title != null) { chargeEvent.title = request.title diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/explorer/AdminExplorerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/explorer/AdminExplorerService.kt index 7bab12db..4538ea9c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/explorer/AdminExplorerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/explorer/AdminExplorerService.kt @@ -17,10 +17,10 @@ class AdminExplorerService( ) { @Transactional fun createExplorerSection(request: CreateExplorerSectionRequest): Long { - if (request.title.isBlank()) throw SodaException("제목을 입력하세요.") + if (request.title.isBlank()) throw SodaException(messageKey = "admin.explorer.title_required") val findExplorerSection = repository.findByTitle(request.title) - if (findExplorerSection != null) throw SodaException("동일한 제목이 있습니다.") + if (findExplorerSection != null) throw SodaException(messageKey = "admin.explorer.title_duplicate") val explorerSection = ExplorerSection(title = request.title, isAdult = request.isAdult) explorerSection.coloredTitle = request.coloredTitle @@ -37,7 +37,7 @@ class AdminExplorerService( } } - if (tags.size <= 0) throw SodaException("관심사를 선택하세요.") + if (tags.size <= 0) throw SodaException(messageKey = "admin.explorer.tags_required") explorerSection.tags = tags return repository.save(explorerSection).id!! @@ -53,14 +53,14 @@ class AdminExplorerService( request.coloredTitle == null && request.isActive == null ) { - throw SodaException("변경사항이 없습니다.") + throw SodaException(messageKey = "admin.explorer.no_changes") } val explorerSection = repository.findByIdOrNull(request.id) - ?: throw SodaException("해당하는 섹션이 없습니다.") + ?: throw SodaException(messageKey = "admin.explorer.section_not_found") if (request.title != null) { - if (request.title.isBlank()) throw SodaException("올바른 제목을 입력하세요.") + if (request.title.isBlank()) throw SodaException(messageKey = "admin.explorer.valid_title_required") explorerSection.title = request.title } @@ -97,7 +97,7 @@ class AdminExplorerService( } } - if (tags.size <= 0) throw SodaException("관심사를 입력하세요.") + if (tags.size <= 0) throw SodaException(messageKey = "admin.explorer.tags_input_required") if (tags != explorerSection.tags) { explorerSection.tags.clear() explorerSection.tags.addAll(tags) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt index f1fc0651..969ec154 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt @@ -15,6 +15,8 @@ import kr.co.vividnext.sodalive.can.use.UseCanCalculateStatus import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.fcm.FcmEvent import kr.co.vividnext.sodalive.fcm.FcmEventType +import kr.co.vividnext.sodalive.i18n.LangContext +import kr.co.vividnext.sodalive.i18n.SodaMessageSource import kr.co.vividnext.sodalive.live.recommend.RecommendLiveCreatorBanner import kr.co.vividnext.sodalive.live.recommend.RecommendLiveCreatorBannerRepository import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository @@ -49,6 +51,8 @@ class AdminLiveService( private val canRepository: CanRepository, private val applicationEventPublisher: ApplicationEventPublisher, + private val messageSource: SodaMessageSource, + private val langContext: LangContext, @Value("\${cloud.aws.s3.bucket}") private val bucket: String, @@ -118,10 +122,10 @@ class AdminLiveService( endDateString: String, isAdult: Boolean ): Long { - if (creatorId < 1) throw SodaException("올바른 크리에이터를 선택해 주세요.") + if (creatorId < 1) throw SodaException(messageKey = "admin.live.creator_required") val creator = memberRepository.findCreatorByIdOrNull(memberId = creatorId) - ?: throw SodaException("올바른 크리에이터를 선택해 주세요.") + ?: throw SodaException(messageKey = "admin.live.creator_required") val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm") val startDate = LocalDateTime.parse(startDateString, dateTimeFormatter) @@ -134,15 +138,15 @@ class AdminLiveService( .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() - if (startDate < nowDate) throw SodaException("노출 시작일은 현재시간 이후로 설정하셔야 합니다.") + if (startDate < nowDate) throw SodaException(messageKey = "admin.live.start_after_now") val endDate = LocalDateTime.parse(endDateString, dateTimeFormatter) .atZone(ZoneId.of("Asia/Seoul")) .withZoneSameInstant(ZoneId.of("UTC")) .toLocalDateTime() - if (endDate < nowDate) throw SodaException("노출 종료일은 현재시간 이후로 설정하셔야 합니다.") - if (endDate <= startDate) throw SodaException("노출 시작일은 노출 종료일 이전으로 설정하셔야 합니다.") + if (endDate < nowDate) throw SodaException(messageKey = "admin.live.end_after_now") + if (endDate <= startDate) throw SodaException(messageKey = "admin.live.start_before_end") val recommendCreatorBanner = RecommendLiveCreatorBanner( startDate = startDate, @@ -176,13 +180,13 @@ class AdminLiveService( isAdult: Boolean? ) { val recommendCreatorBanner = recommendCreatorBannerRepository.findByIdOrNull(recommendCreatorBannerId) - ?: throw SodaException("해당하는 추천라이브가 없습니다. 다시 확인해 주세요.") + ?: throw SodaException(messageKey = "admin.live.recommend_not_found_retry") if (creatorId != null) { - if (creatorId < 1) throw SodaException("올바른 크리에이터를 선택해 주세요.") + if (creatorId < 1) throw SodaException(messageKey = "admin.live.creator_required") val creator = memberRepository.findCreatorByIdOrNull(memberId = creatorId) - ?: throw SodaException("올바른 크리에이터를 선택해 주세요.") + ?: throw SodaException(messageKey = "admin.live.creator_required") recommendCreatorBanner.creator = creator } @@ -218,13 +222,13 @@ class AdminLiveService( if (endDate != null) { if (endDate <= startDate) { - throw SodaException("노출 시작일은 노출 종료일 이전으로 설정하셔야 합니다.") + throw SodaException(messageKey = "admin.live.start_before_end") } recommendCreatorBanner.endDate = endDate } else { if (recommendCreatorBanner.endDate <= startDate) { - throw SodaException("노출 시작일은 노출 종료일 이전으로 설정하셔야 합니다.") + throw SodaException(messageKey = "admin.live.start_before_end") } } @@ -237,7 +241,7 @@ class AdminLiveService( .toLocalDateTime() if (endDate <= recommendCreatorBanner.startDate) { - throw SodaException("노출 종료일은 노출 시작일 이후로 설정하셔야 합니다.") + throw SodaException(messageKey = "admin.live.end_after_start") } recommendCreatorBanner.endDate = endDate @@ -266,7 +270,10 @@ class AdminLiveService( for (room in findRoomList) { room.isActive = false - val roomCancel = LiveRoomCancel("관리자에 의한 취소 - 노쇼") + val cancelReason = messageSource + .getMessage("admin.live.cancel_reason.no_show", langContext.lang) + .orEmpty() + val roomCancel = LiveRoomCancel(cancelReason) roomCancel.room = room roomCancelRepository.save(roomCancel) @@ -286,7 +293,10 @@ class AdminLiveService( it.status = UseCanCalculateStatus.REFUND val charge = Charge(0, it.can, status = ChargeStatus.REFUND_CHARGE) - charge.title = "${it.can} 캔" + val canTitleTemplate = messageSource + .getMessage("live.room.can_title", langContext.lang) + .orEmpty() + charge.title = String.format(canTitleTemplate, it.can) charge.useCan = useCan when (it.paymentGateway) { @@ -300,7 +310,9 @@ class AdminLiveService( status = PaymentStatus.COMPLETE, paymentGateway = it.paymentGateway ) - payment.method = "환불" + payment.method = messageSource + .getMessage("live.room.refund_method", langContext.lang) + .orEmpty() charge.payment = payment chargeRepository.save(charge) @@ -313,11 +325,15 @@ class AdminLiveService( reservationRepository.cancelReservation(roomId = room.id!!) // 라이브 취소 푸시 발송 + val cancelMessageTemplate = messageSource + .getMessage("live.room.fcm.message.canceled", langContext.lang) + .orEmpty() + val cancelMessage = String.format(cancelMessageTemplate, room.title) applicationEventPublisher.publishEvent( FcmEvent( type = FcmEventType.CANCEL_LIVE, title = room.member!!.nickname, - message = "라이브 취소 : ${room.title}", + message = cancelMessage, recipientsMap = pushTokenListMap ) ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanController.kt index 435d417c..6281596c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanController.kt @@ -2,6 +2,8 @@ package kr.co.vividnext.sodalive.admin.live.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 org.springframework.data.domain.Pageable import org.springframework.security.access.prepost.PreAuthorize @@ -16,7 +18,11 @@ import org.springframework.web.multipart.MultipartFile @RestController @PreAuthorize("hasRole('ADMIN')") @RequestMapping("/admin/live/signature-can") -class AdminSignatureCanController(private val service: AdminSignatureCanService) { +class AdminSignatureCanController( + private val service: AdminSignatureCanService, + private val messageSource: SodaMessageSource, + private val langContext: LangContext +) { @GetMapping fun getSignatureCanList( pageable: Pageable, @@ -32,7 +38,7 @@ class AdminSignatureCanController(private val service: AdminSignatureCanService) @RequestParam("isAdult", required = false) isAdult: Boolean = false ) = ApiResponse.ok( service.createSignatureCan(can = can, time = time, creatorId = creatorId, image = image, isAdult = isAdult), - "등록되었습니다." + messageSource.getMessage("admin.signature_can.created", langContext.lang) ) @PutMapping @@ -45,7 +51,7 @@ class AdminSignatureCanController(private val service: AdminSignatureCanService) @RequestParam("isAdult", required = false) isAdult: Boolean? ) = run { if (can == null && time == null && image == null && isActive == null && isAdult == null) { - throw SodaException("변경사항이 없습니다.") + throw SodaException(messageKey = "admin.signature_can.no_changes") } ApiResponse.ok( @@ -57,7 +63,7 @@ class AdminSignatureCanController(private val service: AdminSignatureCanService) isActive = isActive, isAdult = isAdult ), - "수정되었습니다." + messageSource.getMessage("admin.signature_can.updated", langContext.lang) ) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanService.kt index ae5f3011..212a5aff 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanService.kt @@ -43,12 +43,12 @@ class AdminSignatureCanService( @Transactional fun createSignatureCan(can: Int, time: Int, creatorId: Long, image: MultipartFile, isAdult: Boolean) { - if (creatorId < 1) throw SodaException("올바른 크리에이터를 선택해 주세요.") - if (can <= 0) throw SodaException("1캔 이상 설정할 수 있습니다.") - if (time < 3 || time > 20) throw SodaException("시간은 3초 이상 20초 이하로 설정할 수 있습니다.") + if (creatorId < 1) throw SodaException(messageKey = "admin.signature_can.creator_required") + if (can <= 0) throw SodaException(messageKey = "admin.signature_can.min_can") + if (time < 3 || time > 20) throw SodaException(messageKey = "admin.signature_can.time_range") val creator = memberRepository.findCreatorByIdOrNull(memberId = creatorId) - ?: throw SodaException("올바른 크리에이터를 선택해 주세요.") + ?: throw SodaException(messageKey = "admin.signature_can.creator_required") val signatureCan = SignatureCan(can = can, isAdult = isAdult) signatureCan.creator = creator @@ -76,15 +76,15 @@ class AdminSignatureCanService( isAdult: Boolean? ) { val signatureCan = repository.findByIdOrNull(id = id) - ?: throw SodaException("잘못된 요청입니다.") + ?: throw SodaException(messageKey = "common.error.invalid_request") if (can != null) { - if (can <= 0) throw SodaException("1캔 이상 설정할 수 있습니다.") + if (can <= 0) throw SodaException(messageKey = "admin.signature_can.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 = "admin.signature_can.time_range") signatureCan.time = time } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerService.kt index 3e454c73..5b0441e7 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/marketing/AdminAdMediaPartnerService.kt @@ -20,7 +20,7 @@ class AdminAdMediaPartnerService(private val repository: AdMediaPartnerRepositor @Transactional fun updateMediaPartner(request: UpdateAdMediaPartnerRequest) { val entity = repository.findByIdOrNull(request.id) - ?: throw SodaException("잘못된 접근입니다") + ?: throw SodaException(messageKey = "admin.media_partner.invalid_access") if (request.mediaGroup != null) { entity.mediaGroup = request.mediaGroup diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt index 5a1f50f1..29e59710 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt @@ -1,6 +1,8 @@ package kr.co.vividnext.sodalive.admin.member 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.member.Member import kr.co.vividnext.sodalive.member.MemberProvider import kr.co.vividnext.sodalive.member.MemberRole @@ -17,6 +19,8 @@ import java.time.format.DateTimeFormatter class AdminMemberService( private val repository: AdminMemberRepository, private val passwordEncoder: PasswordEncoder, + private val messageSource: SodaMessageSource, + private val langContext: LangContext, @Value("\${cloud.aws.cloud-front.host}") private val cloudFrontHost: String @@ -24,7 +28,7 @@ class AdminMemberService( @Transactional fun updateMember(request: UpdateMemberRequest) { val member = repository.findByIdOrNull(request.id) - ?: throw SodaException("해당 유저가 없습니다.") + ?: throw SodaException(messageKey = "admin.member.not_found") if (member.role != request.userType) { member.role = request.userType @@ -44,7 +48,7 @@ class AdminMemberService( } fun searchMember(searchWord: String, pageable: Pageable): GetAdminMemberListResponse { - if (searchWord.length < 2) throw SodaException("2글자 이상 입력하세요.") + if (searchWord.length < 2) throw SodaException(messageKey = "admin.member.search_word_min_length") val totalCount = repository.searchMemberTotalCount(searchWord = searchWord) val memberList = processMemberListToGetAdminMemberListResponseItemList( memberList = repository.searchMember( @@ -71,7 +75,7 @@ class AdminMemberService( } fun searchCreator(searchWord: String, pageable: Pageable): GetAdminMemberListResponse { - if (searchWord.length < 2) throw SodaException("2글자 이상 입력하세요.") + if (searchWord.length < 2) throw SodaException(messageKey = "admin.member.search_word_min_length") val totalCount = repository.searchMemberTotalCount(searchWord = searchWord, role = MemberRole.CREATOR) val creatorList = processMemberListToGetAdminMemberListResponseItemList( memberList = repository.searchMember( @@ -92,18 +96,18 @@ class AdminMemberService( .asSequence() .map { val userType = when (it.role) { - MemberRole.ADMIN -> "관리자" - MemberRole.USER -> "일반회원" - MemberRole.CREATOR -> "크리에이터" - MemberRole.AGENT -> "에이전트" - MemberRole.BOT -> "봇" + MemberRole.ADMIN -> messageSource.getMessage("admin.member.role.admin", langContext.lang).orEmpty() + MemberRole.USER -> messageSource.getMessage("admin.member.role.user", langContext.lang).orEmpty() + MemberRole.CREATOR -> messageSource.getMessage("admin.member.role.creator", langContext.lang).orEmpty() + MemberRole.AGENT -> messageSource.getMessage("admin.member.role.agent", langContext.lang).orEmpty() + MemberRole.BOT -> messageSource.getMessage("admin.member.role.bot", langContext.lang).orEmpty() } val loginType = when (it.provider) { - MemberProvider.EMAIL -> "이메일" - MemberProvider.KAKAO -> "카카오" - MemberProvider.GOOGLE -> "구글" - MemberProvider.APPLE -> "애플" + MemberProvider.EMAIL -> messageSource.getMessage("member.provider.email", langContext.lang).orEmpty() + MemberProvider.KAKAO -> messageSource.getMessage("member.provider.kakao", langContext.lang).orEmpty() + MemberProvider.GOOGLE -> messageSource.getMessage("member.provider.google", langContext.lang).orEmpty() + MemberProvider.APPLE -> messageSource.getMessage("member.provider.apple", langContext.lang).orEmpty() } val signUpDate = it.createdAt!! @@ -146,7 +150,7 @@ class AdminMemberService( } fun searchMemberByNickname(searchWord: String, size: Int = 20): List { - if (searchWord.length < 2) throw SodaException("2글자 이상 입력하세요.") + if (searchWord.length < 2) throw SodaException(messageKey = "admin.member.search_word_min_length") val limit = if (size <= 0) 20 else size return repository.searchMemberByNickname(searchWord = searchWord, limit = limit.toLong()) } @@ -154,7 +158,7 @@ class AdminMemberService( @Transactional fun resetPassword(request: ResetPasswordRequest) { val member = repository.findByIdAndActive(memberId = request.memberId) - ?: throw SodaException("잘못된 회원정보입니다.\n다시 시도해 주세요.") + ?: throw SodaException(messageKey = "admin.member.reset_password_invalid") member.password = passwordEncoder.encode(member.email.split("@")[0]) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/tag/AdminMemberTagService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/tag/AdminMemberTagService.kt index f3c5806e..2c49bdaa 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/tag/AdminMemberTagService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/tag/AdminMemberTagService.kt @@ -35,7 +35,9 @@ class AdminMemberTagService( } private fun tagExistCheck(request: CreateMemberTagRequest) { - repository.findByTag(request.tag)?.let { throw SodaException("이미 등록된 태그 입니다.") } + repository.findByTag(request.tag)?.let { + throw SodaException(messageKey = "admin.member.tag.already_registered") + } } private fun createTag(tag: String, imagePath: String, isAdult: Boolean) { @@ -51,7 +53,7 @@ class AdminMemberTagService( @Transactional fun deleteTag(id: Long) { val creatorTag = repository.findByIdOrNull(id) - ?: throw SodaException("잘못된 요청입니다.") + ?: throw SodaException(messageKey = "common.error.invalid_request") creatorTag.tag = "${creatorTag.tag}_deleted" creatorTag.isActive = false @@ -60,7 +62,7 @@ class AdminMemberTagService( @Transactional fun modifyTag(id: Long, image: MultipartFile?, requestString: String) { val creatorTag = repository.findByIdOrNull(id) - ?: throw SodaException("잘못된 요청입니다.") + ?: throw SodaException(messageKey = "common.error.invalid_request") val request = objectMapper.readValue(requestString, CreateMemberTagRequest::class.java) creatorTag.tag = request.tag diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/point/PointPolicyService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/point/PointPolicyService.kt index c179114e..f257d7a2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/point/PointPolicyService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/point/PointPolicyService.kt @@ -26,7 +26,7 @@ class PointPolicyService(private val repository: PointPolicyRepository) { @Transactional fun update(id: Long, request: ModifyPointRewardPolicyRequest) { val pointPolicy = repository.findByIdOrNull(id) - ?: throw SodaException("잘못된 접근입니다.") + ?: throw SodaException(messageKey = "admin.point.policy.invalid_access") val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsService.kt index ce085564..e4a197da 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/statistics/member/AdminMemberStatisticsService.kt @@ -32,7 +32,7 @@ class AdminMemberStatisticsService(private val repository: AdminMemberStatistics ) if (dateRange == null) { - throw SodaException("잘못된 접근입니다.") + throw SodaException(messageKey = "admin.member.statistics.invalid_access") } var startDateTime = startDate.atStartOfDay() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt b/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt index f82574cf..acf9e416 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt @@ -389,6 +389,211 @@ class SodaMessageSource { ) ) + private val adminEventBannerMessages = mapOf( + "admin.event.banner.detail_or_link_required" to mapOf( + Lang.KO to "상세이미지 혹은 링크를 등록하세요", + Lang.EN to "Please register a detail image or a link.", + Lang.JA to "詳細画像またはリンクを登録してください。" + ), + "admin.event.banner.create_failed" to mapOf( + Lang.KO to "이벤트 등록을 하지 못했습니다.", + Lang.EN to "Failed to create the event.", + Lang.JA to "イベントの登録に失敗しました。" + ) + ) + + private val adminChargeEventMessages = mapOf( + "admin.charge_event.not_found_retry" to mapOf( + Lang.KO to "해당하는 충전이벤트가 없습니다\n다시 시도해 주세요.", + Lang.EN to "Charge event not found.\nPlease try again.", + Lang.JA to "該当するチャージイベントがありません。\nもう一度お試しください。" + ) + ) + + private val adminExplorerMessages = mapOf( + "admin.explorer.title_required" to mapOf( + Lang.KO to "제목을 입력하세요.", + Lang.EN to "Please enter a title.", + Lang.JA to "タイトルを入力してください。" + ), + "admin.explorer.title_duplicate" to mapOf( + Lang.KO to "동일한 제목이 있습니다.", + Lang.EN to "A section with the same title already exists.", + Lang.JA to "同じタイトルが存在します。" + ), + "admin.explorer.tags_required" to mapOf( + Lang.KO to "관심사를 선택하세요.", + Lang.EN to "Please select interests.", + Lang.JA to "関心事を選択してください。" + ), + "admin.explorer.no_changes" to mapOf( + Lang.KO to "변경사항이 없습니다.", + Lang.EN to "No changes to update.", + Lang.JA to "変更事項がありません。" + ), + "admin.explorer.section_not_found" to mapOf( + Lang.KO to "해당하는 섹션이 없습니다.", + Lang.EN to "Section not found.", + Lang.JA to "該当するセクションがありません。" + ), + "admin.explorer.valid_title_required" to mapOf( + Lang.KO to "올바른 제목을 입력하세요.", + Lang.EN to "Please enter a valid title.", + Lang.JA to "正しいタイトルを入力してください。" + ), + "admin.explorer.tags_input_required" to mapOf( + Lang.KO to "관심사를 입력하세요.", + Lang.EN to "Please enter interests.", + Lang.JA to "関心事を入力してください。" + ) + ) + + private val adminLiveMessages = mapOf( + "admin.live.creator_required" to mapOf( + Lang.KO to "올바른 크리에이터를 선택해 주세요.", + Lang.EN to "Please select a valid creator.", + Lang.JA to "正しいクリエイターを選択してください。" + ), + "admin.live.start_after_now" to mapOf( + Lang.KO to "노출 시작일은 현재시간 이후로 설정하셔야 합니다.", + Lang.EN to "Start date must be set after the current time.", + Lang.JA to "表示開始日は現在時刻より後に設定してください。" + ), + "admin.live.end_after_now" to mapOf( + Lang.KO to "노출 종료일은 현재시간 이후로 설정하셔야 합니다.", + Lang.EN to "End date must be set after the current time.", + Lang.JA to "表示終了日は現在時刻より後に設定してください。" + ), + "admin.live.start_before_end" to mapOf( + Lang.KO to "노출 시작일은 노출 종료일 이전으로 설정하셔야 합니다.", + Lang.EN to "Start date must be before the end date.", + Lang.JA to "表示開始日は表示終了日より前に設定してください。" + ), + "admin.live.recommend_not_found_retry" to mapOf( + Lang.KO to "해당하는 추천라이브가 없습니다. 다시 확인해 주세요.", + Lang.EN to "Recommended live not found. Please check again.", + Lang.JA to "該当するおすすめライブがありません。もう一度確認してください。" + ), + "admin.live.end_after_start" to mapOf( + Lang.KO to "노출 종료일은 노출 시작일 이후로 설정하셔야 합니다.", + Lang.EN to "End date must be after the start date.", + Lang.JA to "表示終了日は表示開始日より後に設定してください。" + ), + "admin.live.cancel_reason.no_show" to mapOf( + Lang.KO to "관리자에 의한 취소 - 노쇼", + Lang.EN to "Canceled by admin - no-show", + Lang.JA to "管理者によるキャンセル - ノーショー" + ) + ) + + private val adminSignatureCanMessages = mapOf( + "admin.signature_can.created" to mapOf( + Lang.KO to "등록되었습니다.", + Lang.EN to "Successfully registered.", + Lang.JA to "登録されました。" + ), + "admin.signature_can.no_changes" to mapOf( + Lang.KO to "변경사항이 없습니다.", + Lang.EN to "No changes to update.", + Lang.JA to "変更事項がありません。" + ), + "admin.signature_can.updated" to mapOf( + Lang.KO to "수정되었습니다.", + Lang.EN to "Updated.", + Lang.JA to "更新されました。" + ), + "admin.signature_can.creator_required" to mapOf( + Lang.KO to "올바른 크리에이터를 선택해 주세요.", + Lang.EN to "Please select a valid creator.", + Lang.JA to "正しいクリエイターを選択してください。" + ), + "admin.signature_can.min_can" to mapOf( + Lang.KO to "1캔 이상 설정할 수 있습니다.", + Lang.EN to "You can set at least 1 can.", + Lang.JA to "1缶以上設定できます。" + ), + "admin.signature_can.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秒以下に設定できます。" + ) + ) + + private val adminAdMediaPartnerMessages = mapOf( + "admin.media_partner.invalid_access" to mapOf( + Lang.KO to "잘못된 접근입니다", + Lang.EN to "Invalid access.", + Lang.JA to "不正なアクセスです。" + ) + ) + + private val adminMemberMessages = mapOf( + "admin.member.not_found" to mapOf( + Lang.KO to "해당 유저가 없습니다.", + Lang.EN to "User not found.", + Lang.JA to "該当するユーザーがいません。" + ), + "admin.member.search_word_min_length" to mapOf( + Lang.KO to "2글자 이상 입력하세요.", + Lang.EN to "Please enter at least 2 characters.", + Lang.JA to "2文字以上入力してください。" + ), + "admin.member.reset_password_invalid" to mapOf( + Lang.KO to "잘못된 회원정보입니다.\n다시 시도해 주세요.", + Lang.EN to "Invalid member information.\nPlease try again.", + Lang.JA to "不正な会員情報です。\nもう一度お試しください。" + ), + "admin.member.role.admin" to mapOf( + Lang.KO to "관리자", + Lang.EN to "Admin", + Lang.JA to "管理者" + ), + "admin.member.role.user" to mapOf( + Lang.KO to "일반회원", + Lang.EN to "User", + Lang.JA to "一般会員" + ), + "admin.member.role.creator" to mapOf( + Lang.KO to "크리에이터", + Lang.EN to "Creator", + Lang.JA to "クリエイター" + ), + "admin.member.role.agent" to mapOf( + Lang.KO to "에이전트", + Lang.EN to "Agent", + Lang.JA to "エージェント" + ), + "admin.member.role.bot" to mapOf( + Lang.KO to "봇", + Lang.EN to "Bot", + Lang.JA to "ボット" + ) + ) + + private val adminMemberTagMessages = mapOf( + "admin.member.tag.already_registered" to mapOf( + Lang.KO to "이미 등록된 태그 입니다.", + Lang.EN to "Tag already registered.", + Lang.JA to "既に登録されたタグです。" + ) + ) + + private val adminPointPolicyMessages = mapOf( + "admin.point.policy.invalid_access" to mapOf( + Lang.KO to "잘못된 접근입니다.", + Lang.EN to "Invalid access.", + Lang.JA to "不正なアクセスです。" + ) + ) + + private val adminMemberStatisticsMessages = mapOf( + "admin.member.statistics.invalid_access" to mapOf( + Lang.KO to "잘못된 접근입니다.", + Lang.EN to "Invalid access.", + Lang.JA to "不正なアクセスです。" + ) + ) + private val messageMessages = mapOf( "message.error.recipient_not_found" to mapOf( Lang.KO to "받는 사람이 없습니다.", @@ -1318,6 +1523,16 @@ class SodaMessageSource { adminContentSeriesBannerMessages, adminContentSeriesGenreMessages, adminContentThemeMessages, + adminEventBannerMessages, + adminChargeEventMessages, + adminExplorerMessages, + adminLiveMessages, + adminSignatureCanMessages, + adminAdMediaPartnerMessages, + adminMemberMessages, + adminMemberTagMessages, + adminPointPolicyMessages, + adminMemberStatisticsMessages, messageMessages, noticeMessages, reportMessages,