diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/AdminChatCharacterController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/AdminChatCharacterController.kt index 62c0c50e..5e5b79b2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/AdminChatCharacterController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/AdminChatCharacterController.kt @@ -352,7 +352,8 @@ class AdminChatCharacterController( applicationEventPublisher.publishEvent( LanguageTranslationEvent( id = request.id, - targetType = LanguageTranslationTargetType.CHARACTER + targetType = LanguageTranslationTargetType.CHARACTER, + waitTransactionCommit = true ) ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/original/service/AdminOriginalWorkService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/original/service/AdminOriginalWorkService.kt index c181f33e..c0d6138e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/original/service/AdminOriginalWorkService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/original/service/AdminOriginalWorkService.kt @@ -95,7 +95,8 @@ class AdminOriginalWorkService( applicationEventPublisher.publishEvent( LanguageTranslationEvent( id = originalWork.id!!, - targetType = LanguageTranslationTargetType.ORIGINAL_WORK + targetType = LanguageTranslationTargetType.ORIGINAL_WORK, + waitTransactionCommit = true ) ) } @@ -165,7 +166,8 @@ class AdminOriginalWorkService( applicationEventPublisher.publishEvent( LanguageTranslationEvent( id = ow.id!!, - targetType = LanguageTranslationTargetType.ORIGINAL_WORK + targetType = LanguageTranslationTargetType.ORIGINAL_WORK, + waitTransactionCommit = true ) ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/theme/AdminContentThemeService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/theme/AdminContentThemeService.kt index 2c4b0aef..eef76ed7 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/theme/AdminContentThemeService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/theme/AdminContentThemeService.kt @@ -47,7 +47,8 @@ class AdminContentThemeService( applicationEventPublisher.publishEvent( LanguageTranslationEvent( id = savedTheme.id!!, - targetType = LanguageTranslationTargetType.CONTENT_THEME + targetType = LanguageTranslationTargetType.CONTENT_THEME, + waitTransactionCommit = true ) ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index a130c0ca..a61a2af6 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -183,7 +183,8 @@ class AudioContentService( applicationEventPublisher.publishEvent( LanguageTranslationEvent( id = request.contentId, - targetType = LanguageTranslationTargetType.CONTENT + targetType = LanguageTranslationTargetType.CONTENT, + waitTransactionCommit = true ) ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryService.kt index 04291ffb..f42a1293 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/category/CategoryService.kt @@ -75,7 +75,8 @@ class CategoryService( applicationEventPublisher.publishEvent( LanguageTranslationEvent( id = request.categoryId, - targetType = LanguageTranslationTargetType.CREATOR_CONTENT_CATEGORY + targetType = LanguageTranslationTargetType.CREATOR_CONTENT_CATEGORY, + waitTransactionCommit = true ) ) } @@ -158,7 +159,7 @@ class CategoryService( val sourceLang = entity.languageCode if (!sourceLang.isNullOrBlank() && sourceLang != locale) { val existing = translations[item.categoryId] - if (existing != null && !existing.category.isNullOrBlank()) { + if (existing != null && existing.category.isNotBlank()) { result.add(GetCategoryListResponse(categoryId = item.categoryId, category = existing.category)) continue } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentService.kt index d0ef8fb8..e502fd88 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentService.kt @@ -203,7 +203,8 @@ class CreatorAdminContentService( applicationEventPublisher.publishEvent( LanguageTranslationEvent( id = request.id, - targetType = LanguageTranslationTargetType.CONTENT + targetType = LanguageTranslationTargetType.CONTENT, + waitTransactionCommit = true ) ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt index 105e3350..3d1c0318 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/series/CreatorAdminContentSeriesService.kt @@ -117,7 +117,8 @@ class CreatorAdminContentSeriesService( applicationEventPublisher.publishEvent( LanguageTranslationEvent( id = series.id!!, - targetType = LanguageTranslationTargetType.SERIES + targetType = LanguageTranslationTargetType.SERIES, + waitTransactionCommit = true ) ) } @@ -211,7 +212,8 @@ class CreatorAdminContentSeriesService( applicationEventPublisher.publishEvent( LanguageTranslationEvent( id = series.id!!, - targetType = LanguageTranslationTargetType.SERIES + targetType = LanguageTranslationTargetType.SERIES, + waitTransactionCommit = true ) ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/i18n/translation/LanguageTranslationEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/i18n/translation/LanguageTranslationEvent.kt index 99e241ee..94cfcb47 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/i18n/translation/LanguageTranslationEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/i18n/translation/LanguageTranslationEvent.kt @@ -28,6 +28,7 @@ import kr.co.vividnext.sodalive.content.translation.ContentTranslation import kr.co.vividnext.sodalive.content.translation.ContentTranslationPayload import kr.co.vividnext.sodalive.content.translation.ContentTranslationRepository import kr.co.vividnext.sodalive.i18n.translation.PapagoTranslationService.Companion.getTranslatableLanguageCodes +import org.springframework.context.event.EventListener import org.springframework.data.repository.findByIdOrNull import org.springframework.scheduling.annotation.Async import org.springframework.stereotype.Component @@ -51,7 +52,8 @@ enum class LanguageTranslationTargetType { class LanguageTranslationEvent( val id: Long, - val targetType: LanguageTranslationTargetType + val targetType: LanguageTranslationTargetType, + val waitTransactionCommit: Boolean = false ) @Component @@ -76,9 +78,20 @@ class LanguageTranslationListener( private val translationService: PapagoTranslationService ) { @Async - @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + @EventListener(condition = "!#event.waitTransactionCommit") @Transactional(propagation = Propagation.REQUIRES_NEW) - fun translation(event: LanguageTranslationEvent) { + fun translationImmediate(event: LanguageTranslationEvent) { + processTranslation(event) + } + + @Async + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, condition = "#event.waitTransactionCommit") + @Transactional(propagation = Propagation.REQUIRES_NEW) + fun translationAfterCommit(event: LanguageTranslationEvent) { + processTranslation(event) + } + + private fun processTranslation(event: LanguageTranslationEvent) { when (event.targetType) { LanguageTranslationTargetType.CONTENT -> handleContentLanguageTranslation(event) LanguageTranslationTargetType.CHARACTER -> handleCharacterLanguageTranslation(event) @@ -92,8 +105,7 @@ class LanguageTranslationListener( private fun handleContentLanguageTranslation(event: LanguageTranslationEvent) { val audioContent = audioContentRepository.findByIdOrNull(event.id) ?: return - val languageCode = audioContent.languageCode - if (languageCode != null) return + val languageCode = audioContent.languageCode ?: return getTranslatableLanguageCodes(languageCode).forEach { locale -> val tags = audioContent.audioContentHashTags @@ -150,8 +162,7 @@ class LanguageTranslationListener( private fun handleCharacterLanguageTranslation(event: LanguageTranslationEvent) { val character = chatCharacterRepository.findByIdOrNull(event.id) ?: return - val languageCode = character.languageCode - if (languageCode != null) return + val languageCode = character.languageCode ?: return getTranslatableLanguageCodes(languageCode).forEach { locale -> val personality = character.personalities.firstOrNull() @@ -285,8 +296,7 @@ class LanguageTranslationListener( private fun handleSeriesLanguageTranslation(event: LanguageTranslationEvent) { val series = seriesRepository.findByIdOrNull(event.id) ?: return - val languageCode = series.languageCode - if (languageCode != null) return + val languageCode = series.languageCode ?: return getTranslatableLanguageCodes(languageCode).forEach { locale -> val keywords = series.keywordList @@ -385,8 +395,7 @@ class LanguageTranslationListener( private fun handleOriginalWorkLanguageTranslation(event: LanguageTranslationEvent) { val originalWork = originalWorkRepository.findByIdOrNull(event.id) ?: return - val languageCode = originalWork.languageCode - if (languageCode != null) return + val languageCode = originalWork.languageCode ?: return /** * handleSeriesLanguageTranslation 참조하여 원작 번역 구현