원작 등록/수정시 번역 API 호출

This commit is contained in:
2025-12-16 06:10:18 +09:00
parent 8ae6943c2a
commit 7955be45da
6 changed files with 304 additions and 4 deletions

View File

@@ -33,6 +33,10 @@ class OriginalWork(
@Column(columnDefinition = "TEXT")
var description: String = "",
/** 언어 코드 */
@Column(nullable = true)
var languageCode: String? = null,
/** 원천 원작 */
@Column(nullable = true)
var originalWork: String? = null,

View File

@@ -0,0 +1,94 @@
package kr.co.vividnext.sodalive.chat.original.translation
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import kr.co.vividnext.sodalive.common.BaseEntity
import javax.persistence.AttributeConverter
import javax.persistence.Column
import javax.persistence.Convert
import javax.persistence.Converter
import javax.persistence.Entity
import javax.persistence.Table
import javax.persistence.UniqueConstraint
@Entity
@Table(
uniqueConstraints = [
UniqueConstraint(columnNames = ["original_work_id", "locale"])
]
)
class OriginalWorkTranslation(
@Column(name = "original_work_id")
val originalWorkId: Long,
@Column(name = "locale")
val locale: String,
@Column(columnDefinition = "json")
@Convert(converter = OriginalWorkTranslationPayloadConverter::class)
var renderedPayload: OriginalWorkTranslationPayload
) : BaseEntity()
data class OriginalWorkTranslationPayload(
val title: String,
val contentType: String,
val category: String,
val description: String,
val tags: List<String>
)
@Converter(autoApply = false)
class OriginalWorkTranslationPayloadConverter : AttributeConverter<OriginalWorkTranslationPayload, String> {
override fun convertToDatabaseColumn(attribute: OriginalWorkTranslationPayload?): String {
if (attribute == null) return "{}"
return objectMapper.writeValueAsString(attribute)
}
override fun convertToEntityAttribute(dbData: String?): OriginalWorkTranslationPayload {
if (dbData.isNullOrBlank()) {
return OriginalWorkTranslationPayload(
title = "",
contentType = "",
category = "",
description = "",
tags = emptyList()
)
}
return try {
val node = objectMapper.readTree(dbData)
val title = node.get("title")?.asText() ?: ""
val contentType = node.get("contentType")?.asText() ?: ""
val category = node.get("category")?.asText() ?: ""
val description = node.get("description")?.asText() ?: ""
val tagsNode = node.get("tags")
val tags: List<String> = when {
tagsNode == null || tagsNode.isNull -> emptyList()
tagsNode.isArray -> tagsNode.mapNotNull { it.asText(null) }.filter { it.isNotBlank() }
tagsNode.isTextual -> tagsNode.asText()
.split(',')
.map { it.trim() }
.filter { it.isNotEmpty() }
else -> emptyList()
}
OriginalWorkTranslationPayload(
title = title,
contentType = contentType,
category = category,
description = description,
tags = tags
)
} catch (_: Exception) {
OriginalWorkTranslationPayload(
title = "",
contentType = "",
category = "",
description = "",
tags = emptyList()
)
}
}
companion object {
private val objectMapper = jacksonObjectMapper()
}
}

View File

@@ -0,0 +1,7 @@
package kr.co.vividnext.sodalive.chat.original.translation
import org.springframework.data.jpa.repository.JpaRepository
interface OriginalWorkTranslationRepository : JpaRepository<OriginalWorkTranslation, Long> {
fun findByOriginalWorkIdAndLocale(originalWorkId: Long, locale: String): OriginalWorkTranslation?
}