탐색 커뮤니티 다국어 메시지 분리

This commit is contained in:
2025-12-23 16:44:27 +09:00
parent f429ffbbbe
commit 4087d11420
6 changed files with 290 additions and 68 deletions

View File

@@ -5,6 +5,8 @@ import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.explorer.profile.PostCreatorNoticeRequest
import kr.co.vividnext.sodalive.explorer.profile.PostWriteCheersRequest
import kr.co.vividnext.sodalive.explorer.profile.PutWriteCheersRequest
import kr.co.vividnext.sodalive.i18n.LangContext
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
import kr.co.vividnext.sodalive.member.Member
import org.springframework.data.domain.Pageable
import org.springframework.security.access.prepost.PreAuthorize
@@ -20,12 +22,16 @@ import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/explorer")
class ExplorerController(private val service: ExplorerService) {
class ExplorerController(
private val service: ExplorerService,
private val messageSource: SodaMessageSource,
private val langContext: LangContext
) {
@GetMapping("/creator-rank")
fun getCreatorRank(
@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.getCreatorRank(memberId = member.id!!))
}
@@ -34,7 +40,7 @@ class ExplorerController(private val service: ExplorerService) {
fun getExplorer(
@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.getExplorer(member))
}
@@ -44,7 +50,7 @@ class ExplorerController(private val service: ExplorerService) {
@RequestParam channel: 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.getSearchChannel(channel, member))
}
@@ -55,7 +61,7 @@ class ExplorerController(private val service: ExplorerService) {
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@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.getCreatorProfile(
creatorId = creatorId,
@@ -72,7 +78,7 @@ class ExplorerController(private val service: ExplorerService) {
@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.getCreatorProfileDonationRanking(creatorId, pageable, member))
}
@@ -81,8 +87,9 @@ class ExplorerController(private val service: ExplorerService) {
@RequestBody request: PostWriteCheersRequest,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.writeCheers(request, member), "등록되었습니다.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val message = messageSource.getMessage("explorer.cheers.created", langContext.lang)
ApiResponse.ok(service.writeCheers(request, member), message)
}
@PutMapping("/profile/cheers")
@@ -90,8 +97,9 @@ class ExplorerController(private val service: ExplorerService) {
@RequestBody request: PutWriteCheersRequest,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.modifyCheers(request, member), "수정되었습니다.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val message = messageSource.getMessage("explorer.cheers.updated", langContext.lang)
ApiResponse.ok(service.modifyCheers(request, member), message)
}
@PostMapping("/profile/notice")
@@ -100,8 +108,9 @@ class ExplorerController(private val service: ExplorerService) {
@RequestBody request: PostCreatorNoticeRequest,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.saveNotice(member, request.notice), "공지사항이 저장되었습니다.")
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val message = messageSource.getMessage("explorer.notice.saved", langContext.lang)
ApiResponse.ok(service.saveNotice(member, request.notice), message)
}
@GetMapping("/profile/{id}/follower-list")
@@ -110,7 +119,7 @@ class ExplorerController(private val service: ExplorerService) {
@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.getFollowerList(creatorId, member, pageable))
}
@@ -121,7 +130,7 @@ class ExplorerController(private val service: ExplorerService) {
@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.getCreatorProfileCheers(creatorId, timezone, pageable))
}
}

View File

@@ -19,6 +19,9 @@ import kr.co.vividnext.sodalive.explorer.profile.CreatorCheers
import kr.co.vividnext.sodalive.explorer.profile.QChannelNotice.channelNotice
import kr.co.vividnext.sodalive.explorer.profile.QCreatorCheers.creatorCheers
import kr.co.vividnext.sodalive.explorer.profile.TimeDifferenceResult
import kr.co.vividnext.sodalive.i18n.Lang
import kr.co.vividnext.sodalive.i18n.LangContext
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
import kr.co.vividnext.sodalive.live.room.LiveRoom
import kr.co.vividnext.sodalive.live.room.LiveRoomType
import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom
@@ -40,11 +43,12 @@ import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.Locale
@Repository
class ExplorerQueryRepository(
private val queryFactory: JPAQueryFactory,
private val messageSource: SodaMessageSource,
private val langContext: LangContext,
@Value("\${cloud.aws.cloud-front.host}")
private val cloudFrontHost: String
@@ -243,7 +247,7 @@ class ExplorerQueryRepository(
val creator = queryFactory
.selectFrom(member)
.where(member.id.eq(creatorId))
.fetchFirst() ?: throw SodaException("없는 사용자 입니다.")
.fetchFirst() ?: throw SodaException(messageKey = "member.validation.user_not_found")
val creatorTagCount = creator.tags
.asSequence()
@@ -383,6 +387,12 @@ class ExplorerQueryRepository(
)
}
val dateTimePattern = messageSource
.getMessage("explorer.date.live_room.datetime_format", langContext.lang)
?: messageSource.getMessage("explorer.date.live_room.datetime_format", Lang.KO).orEmpty()
val dateTimeFormatter = DateTimeFormatter.ofPattern(dateTimePattern)
.withLocale(langContext.lang.locale)
return result
.map {
val reservations = it.reservations
@@ -393,11 +403,7 @@ class ExplorerQueryRepository(
val beginDateTime = it.beginDateTime
.atZone(ZoneId.of("UTC"))
.withZoneSameInstant(ZoneId.of(timezone))
.format(
DateTimeFormatter
.ofPattern("yyyy년 MM월 dd일 (E) a hh시 mm분")
.withLocale(Locale.KOREAN)
)
.format(dateTimeFormatter)
val beginDateTimeUtc = it.beginDateTime
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
@@ -451,6 +457,12 @@ class ExplorerQueryRepository(
}
fun getCheersList(creatorId: Long, timezone: String, offset: Long, limit: Long): GetCheersResponse {
val cheersDatePattern = messageSource
.getMessage("explorer.date.cheers.format", langContext.lang)
?: messageSource.getMessage("explorer.date.cheers.format", Lang.KO).orEmpty()
val cheersDateFormatter = DateTimeFormatter.ofPattern(cheersDatePattern)
.withLocale(langContext.lang.locale)
val totalCount = queryFactory
.selectFrom(creatorCheers)
.where(
@@ -489,7 +501,7 @@ class ExplorerQueryRepository(
},
content = it.cheers,
languageCode = it.languageCode,
date = date.format(DateTimeFormatter.ofPattern("yyyy.MM.dd E hh:mm a")),
date = date.format(cheersDateFormatter),
replyList = it.children.asSequence()
.map { cheers ->
val replyDate = cheers.createdAt!!
@@ -507,7 +519,7 @@ class ExplorerQueryRepository(
},
content = cheers.cheers,
languageCode = cheers.languageCode,
date = replyDate.format(DateTimeFormatter.ofPattern("yyyy.MM.dd E hh:mm a")),
date = replyDate.format(cheersDateFormatter),
replyList = listOf()
)
}

View File

@@ -19,7 +19,9 @@ import kr.co.vividnext.sodalive.explorer.profile.PutWriteCheersRequest
import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.CreatorCommunityService
import kr.co.vividnext.sodalive.fcm.FcmEvent
import kr.co.vividnext.sodalive.fcm.FcmEventType
import kr.co.vividnext.sodalive.i18n.Lang
import kr.co.vividnext.sodalive.i18n.LangContext
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailUser
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRole
@@ -50,6 +52,7 @@ class ExplorerService(
private val applicationEventPublisher: ApplicationEventPublisher,
private val contentTranslationRepository: ContentTranslationRepository,
private val messageSource: SodaMessageSource,
private val langContext: LangContext,
@Value("\${cloud.aws.cloud-front.host}")
@@ -68,15 +71,20 @@ class ExplorerService(
val lastSunday = lastMonday
.plusDays(6)
val startDateFormatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일")
val endDateFormatter = DateTimeFormatter.ofPattern("MM월 dd일")
val startDatePattern = messageSource.getMessage("explorer.date.creator_rank.start_format", langContext.lang)
?: messageSource.getMessage("explorer.date.creator_rank.start_format", Lang.KO).orEmpty()
val endDatePattern = messageSource.getMessage("explorer.date.creator_rank.end_format", langContext.lang)
?: messageSource.getMessage("explorer.date.creator_rank.end_format", Lang.KO).orEmpty()
val startDateFormatter = DateTimeFormatter.ofPattern(startDatePattern).withLocale(langContext.lang.locale)
val endDateFormatter = DateTimeFormatter.ofPattern(endDatePattern).withLocale(langContext.lang.locale)
val formattedLastMonday = lastMonday.format(startDateFormatter)
val formattedLastSunday = lastSunday.format(endDateFormatter)
return GetExplorerSectionResponse(
title = "인기 크리에이터",
coloredTitle = "인기",
title = messageSource.getMessage("explorer.section.creator_rank.title", langContext.lang).orEmpty(),
coloredTitle = messageSource.getMessage("explorer.section.creator_rank.colored_title", langContext.lang)
.orEmpty(),
color = "FF5C49",
desc = "$formattedLastMonday ~ $formattedLastSunday",
creators = creatorRankings
@@ -99,15 +107,20 @@ class ExplorerService(
val lastSunday = lastMonday
.plusDays(6)
val startDateFormatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일")
val endDateFormatter = DateTimeFormatter.ofPattern("MM월 dd일")
val startDatePattern = messageSource.getMessage("explorer.date.creator_rank.start_format", langContext.lang)
?: messageSource.getMessage("explorer.date.creator_rank.start_format", Lang.KO).orEmpty()
val endDatePattern = messageSource.getMessage("explorer.date.creator_rank.end_format", langContext.lang)
?: messageSource.getMessage("explorer.date.creator_rank.end_format", Lang.KO).orEmpty()
val startDateFormatter = DateTimeFormatter.ofPattern(startDatePattern).withLocale(langContext.lang.locale)
val endDateFormatter = DateTimeFormatter.ofPattern(endDatePattern).withLocale(langContext.lang.locale)
val formattedLastMonday = lastMonday.format(startDateFormatter)
val formattedLastSunday = lastSunday.format(endDateFormatter)
val creatorRankingSection = GetExplorerSectionResponse(
title = "인기 크리에이터",
coloredTitle = "인기",
title = messageSource.getMessage("explorer.section.creator_rank.title", langContext.lang).orEmpty(),
coloredTitle = messageSource.getMessage("explorer.section.creator_rank.colored_title", langContext.lang)
.orEmpty(),
color = "FF5C49",
desc = "$formattedLastMonday ~ $formattedLastSunday",
creators = creatorRankings
@@ -121,16 +134,18 @@ class ExplorerService(
.map { it.toExplorerSectionCreator(cloudFrontHost) }
val newCreatorsSection = GetExplorerSectionResponse(
title = "새로 시작",
coloredTitle = "새로",
title = messageSource.getMessage("explorer.section.new_creators.title", langContext.lang).orEmpty(),
coloredTitle = messageSource.getMessage("explorer.section.new_creators.colored_title", langContext.lang)
.orEmpty(),
color = "5FD28F",
creators = newCreators
)
sections.add(newCreatorsSection)
val maleCreatorSection = GetExplorerSectionResponse(
title = "남자 크리에이터",
coloredTitle = "남자",
title = messageSource.getMessage("explorer.section.male_creators.title", langContext.lang).orEmpty(),
coloredTitle = messageSource.getMessage("explorer.section.male_creators.colored_title", langContext.lang)
.orEmpty(),
color = "39abde",
creators = queryRepository
.findCreatorByGender(1)
@@ -139,8 +154,9 @@ class ExplorerService(
)
val femaleCreatorSection = GetExplorerSectionResponse(
title = "여자 크리에이터",
coloredTitle = "여자",
title = messageSource.getMessage("explorer.section.female_creators.title", langContext.lang).orEmpty(),
coloredTitle = messageSource.getMessage("explorer.section.female_creators.colored_title", langContext.lang)
.orEmpty(),
color = "ffa517",
creators = queryRepository
.findCreatorByGender(0)
@@ -162,7 +178,7 @@ class ExplorerService(
fun getSearchChannel(channel: String, member: Member): List<GetRoomDetailUser> {
if (channel.length < 2) {
throw SodaException("두 글자 이상 입력 하셔야 합니다.")
throw SodaException(messageKey = "explorer.search.channel.min_length")
}
return queryRepository.getSearchChannel(channel, member.id!!)
@@ -179,11 +195,17 @@ class ExplorerService(
member: Member
): GetCreatorProfileResponse {
// 크리에이터(유저) 정보
val creatorAccount = queryRepository.getMember(creatorId) ?: throw SodaException("없는 사용자 입니다.")
val creatorAccount = queryRepository.getMember(creatorId)
?: throw SodaException(messageKey = "member.validation.user_not_found")
// 차단된 사용자 체크
val isBlocked = memberService.isBlocked(blockedMemberId = member.id!!, memberId = creatorId)
if (isBlocked) throw SodaException("${creatorAccount.nickname}님의 요청으로 채널 접근이 제한됩니다.")
if (isBlocked) {
val messageTemplate = messageSource
.getMessage("explorer.creator.blocked_access", langContext.lang)
.orEmpty()
throw SodaException(message = String.format(messageTemplate, creatorAccount.nickname))
}
val isCreator = creatorAccount.role == MemberRole.CREATOR
@@ -461,10 +483,16 @@ class ExplorerService(
@Transactional
fun writeCheers(request: PostWriteCheersRequest, member: Member) {
val creator = queryRepository.getMember(request.creatorId) ?: throw SodaException("없는 사용자 입니다.")
val creator = queryRepository.getMember(request.creatorId)
?: throw SodaException(messageKey = "member.validation.user_not_found")
val isBlocked = memberService.isBlocked(blockedMemberId = member.id!!, memberId = request.creatorId)
if (isBlocked) throw SodaException("${creator.nickname}님의 요청으로 팬토크 작성이 제한됩니다.")
if (isBlocked) {
val messageTemplate = messageSource
.getMessage("explorer.creator.blocked_cheers", langContext.lang)
.orEmpty()
throw SodaException(message = String.format(messageTemplate, creator.nickname))
}
val cheers = CreatorCheers(cheers = request.content, languageCode = request.languageCode)
cheers.member = member
@@ -510,7 +538,7 @@ class ExplorerService(
@Transactional
fun modifyCheers(request: PutWriteCheersRequest, member: Member) {
val cheers = queryRepository.getCheers(request.cheersId)
?: throw SodaException("잘못된 요청입니다.")
?: throw SodaException(messageKey = "common.error.invalid_request")
if (cheers.member!!.id!! == member.id!!) {
if (request.content != null) {
@@ -544,7 +572,7 @@ class ExplorerService(
FcmEvent(
type = FcmEventType.CHANGE_NOTICE,
title = member.nickname,
message = "새 글이 등록되었습니다.",
message = messageSource.getMessage("explorer.notice.fcm.message", langContext.lang).orEmpty(),
creatorId = member.id!!
)
)

View File

@@ -36,7 +36,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@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.createCommunityPost(
@@ -57,7 +57,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@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.modifyCommunityPost(
@@ -75,7 +75,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@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.getCommunityPostList(
@@ -95,7 +95,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@RequestParam timezone: 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.getCommunityPostDetail(
@@ -112,7 +112,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@RequestBody request: PostCommunityPostLikeRequest,
@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.communityPostLike(request, member))
}
@@ -122,7 +122,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@RequestBody request: CreateCommunityPostCommentRequest,
@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.createCommunityPostComment(
@@ -140,7 +140,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@RequestBody request: ModifyCommunityPostCommentRequest,
@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.modifyCommunityPostComment(request = request, member = member)
@@ -154,7 +154,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@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.getCommunityPostCommentList(
@@ -174,7 +174,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@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.getCommentReplyList(
@@ -191,7 +191,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@RequestParam timezone: 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.getLatestPostListFromCreatorsYouFollow(
@@ -207,7 +207,7 @@ class CreatorCommunityController(private val service: CreatorCommunityService) {
@RequestBody request: PurchasePostRequest,
@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.purchasePost(

View File

@@ -19,6 +19,8 @@ import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.like.PostCommu
import kr.co.vividnext.sodalive.extensions.getTimeAgoString
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.member.Member
import kr.co.vividnext.sodalive.member.block.BlockMemberRepository
import kr.co.vividnext.sodalive.utils.generateFileName
@@ -45,6 +47,8 @@ class CreatorCommunityService(
private val objectMapper: ObjectMapper,
private val audioContentCloudFront: AudioContentCloudFront,
private val applicationEventPublisher: ApplicationEventPublisher,
private val messageSource: SodaMessageSource,
private val langContext: LangContext,
@Value("\${cloud.aws.s3.bucket}")
private val imageBucket: String,
@@ -65,11 +69,11 @@ class CreatorCommunityService(
val request = objectMapper.readValue(requestString, CreateCommunityPostRequest::class.java)
if (request.price > 0 && postImage == null) {
throw SodaException("유료 게시글 등록을 위해서는 이미지가 필요합니다.")
throw SodaException(messageKey = "creator.community.paid_post_image_required")
}
if (audioFile != null && postImage == null) {
throw SodaException("오디오 등록을 위해서는 이미지가 필요합니다.")
throw SodaException(messageKey = "creator.community.audio_post_image_required")
}
postImage?.let { validateImage(it, request.price > 0) }
@@ -119,7 +123,7 @@ class CreatorCommunityService(
FcmEvent(
type = FcmEventType.CHANGE_NOTICE,
title = member.nickname,
message = "새 글이 등록되었습니다.",
message = messageSource.getMessage("creator.community.fcm.new_post", langContext.lang).orEmpty(),
creatorId = member.id!!
)
)
@@ -130,7 +134,7 @@ class CreatorCommunityService(
val request = objectMapper.readValue(requestString, ModifyCommunityPostRequest::class.java)
val post = repository.findByIdAndMemberId(id = request.creatorCommunityId, memberId = member.id!!)
?: throw SodaException("잘못된 요청입니다.")
?: throw SodaException(messageKey = "common.error.invalid_request")
postImage?.let { validateImage(it, post.price > 0) }
@@ -269,10 +273,15 @@ class CreatorCommunityService(
isAdult: Boolean
): GetCommunityPostListResponse {
val post = repository.getCommunityPost(postId, isAdult = isAdult)
?: throw SodaException("잘못된 요청입니다.\n다시 시도해 주세요.")
?: throw SodaException(messageKey = "creator.community.invalid_request_retry")
val isBlocked = blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = post.creatorId)
if (isBlocked) throw SodaException("${post.creatorNickname}님의 요청으로 접근이 제한됩니다.")
if (isBlocked) {
val messageTemplate = messageSource
.getMessage("creator.community.blocked_access", langContext.lang)
.orEmpty()
throw SodaException(message = String.format(messageTemplate, post.creatorNickname))
}
val isLike = likeRepository.findByPostIdAndMemberId(postId = post.id, memberId = memberId)?.isActive ?: false
val likeCount = likeRepository.totalCountCommunityPostLikeByPostId(post.id)
@@ -345,7 +354,7 @@ class CreatorCommunityService(
postLike.member = member
val post = repository.findByIdAndActive(request.postId, isAdult = member.auth != null)
?: throw SodaException("잘못된 요청입니다.\n다시 시도해 주세요.")
?: throw SodaException(messageKey = "creator.community.invalid_request_retry")
postLike.creatorCommunity = post
likeRepository.save(postLike)
@@ -365,11 +374,11 @@ class CreatorCommunityService(
isSecret: Boolean = false
) {
val post = repository.findByIdOrNull(id = postId)
?: throw SodaException("잘못된 게시물 입니다.\n다시 시도해 주세요.")
?: throw SodaException(messageKey = "creator.community.invalid_post_retry")
val isExistOrdered = useCanRepository.isExistCommunityPostOrdered(postId = postId, memberId = member.id!!)
if (isSecret && !isExistOrdered) {
throw SodaException("게시글을 구매 후 비밀댓글을 등록할 수 있습니다.")
throw SodaException(messageKey = "creator.community.secret_comment_purchase_required")
}
val postComment = CreatorCommunityComment(comment = comment, isSecret = isSecret)
@@ -392,7 +401,7 @@ class CreatorCommunityService(
@Transactional
fun modifyCommunityPostComment(request: ModifyCommunityPostCommentRequest, member: Member) {
val postComment = commentRepository.findByIdOrNull(id = request.commentId)
?: throw SodaException("잘못된 접근 입니다.\n확인 후 다시 시도해 주세요.")
?: throw SodaException(messageKey = "creator.community.invalid_access_retry")
if (request.comment != null && postComment.member!!.id!! == member.id!!) {
postComment.comment = request.comment
@@ -530,10 +539,15 @@ class CreatorCommunityService(
container: String
): GetCommunityPostListResponse {
val post = repository.findByIdAndActive(postId, isAdult)
?: throw SodaException("잘못된 요청입니다.\n다시 시도해 주세요.")
?: throw SodaException(messageKey = "creator.community.invalid_request_retry")
val isBlocked = blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = post.member!!.id!!)
if (isBlocked) throw SodaException("${post.member!!.nickname}님의 요청으로 접근이 제한됩니다.")
if (isBlocked) {
val messageTemplate = messageSource
.getMessage("creator.community.blocked_access", langContext.lang)
.orEmpty()
throw SodaException(message = String.format(messageTemplate, post.member!!.nickname))
}
val existOrdered = useCanRepository.isExistCommunityPostOrdered(postId = postId, memberId = memberId)