diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentRepository.kt index 519a969..72d5cff 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/CreatorAdminContentRepository.kt @@ -6,6 +6,7 @@ import com.querydsl.core.types.dsl.StringTemplate import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.content.AudioContent import kr.co.vividnext.sodalive.content.QAudioContent.audioContent +import kr.co.vividnext.sodalive.content.hashtag.AudioContentHashTag import kr.co.vividnext.sodalive.content.hashtag.QAudioContentHashTag.audioContentHashTag import kr.co.vividnext.sodalive.content.hashtag.QHashTag.hashTag import kr.co.vividnext.sodalive.content.theme.QAudioContentTheme.audioContentTheme @@ -27,6 +28,8 @@ interface CreatorAdminAudioContentQueryRepository { fun getHashTagList(audioContentId: Long): List fun getAudioContent(memberId: Long, audioContentId: Long): AudioContent? + + fun findContentHashTagByContentIdAndIsActive(contentId: Long, isActive: Boolean): List } class CreatorAdminAudioContentQueryRepositoryImpl( @@ -127,6 +130,20 @@ class CreatorAdminAudioContentQueryRepositoryImpl( .fetchFirst() } + override fun findContentHashTagByContentIdAndIsActive( + contentId: Long, + isActive: Boolean + ): List { + return queryFactory + .selectFrom(audioContentHashTag) + .innerJoin(audioContentHashTag.audioContent, audioContent) + .where( + audioContentHashTag.isActive.eq(isActive) + .and(audioContent.id.eq(contentId)) + ) + .fetch() + } + private fun formattedDateExpression( dateTime: DateTimePath, format: String = "%Y-%m-%d" 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 c5091c8..c12c912 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 @@ -7,6 +7,9 @@ import kr.co.vividnext.sodalive.aws.s3.S3Uploader import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.content.ContentPriceChangeLog import kr.co.vividnext.sodalive.content.ContentPriceChangeLogRepository +import kr.co.vividnext.sodalive.content.hashtag.AudioContentHashTag +import kr.co.vividnext.sodalive.content.hashtag.HashTag +import kr.co.vividnext.sodalive.content.hashtag.HashTagRepository import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.utils.generateFileName import org.springframework.beans.factory.annotation.Value @@ -18,6 +21,7 @@ import org.springframework.web.multipart.MultipartFile @Service class CreatorAdminContentService( private val repository: CreatorAdminContentRepository, + private val hashTagRepository: HashTagRepository, private val contentPriceChangeLogRepository: ContentPriceChangeLogRepository, private val audioContentCloudFront: AudioContentCloudFront, private val objectMapper: ObjectMapper, @@ -156,5 +160,38 @@ class CreatorAdminContentService( audioContent.price = request.price } + + if (!request.tags.isNullOrBlank()) { + val normalizedTags = request.tags + .replace("#", " #") + .split(" ") + .map { if (it.startsWith("#")) it else "#$it" } + .map { it.trim() } + .filter { it.isNotBlank() } + .distinct() + + val currentContentTags = repository.findContentHashTagByContentIdAndIsActive(request.id, true) + val currentTagMap = currentContentTags.associateBy { it.hashTag!!.tag } + + val tagsToAdd = normalizedTags.subtract(currentTagMap.keys) + val tagsToDeactivate = currentTagMap.keys.subtract(normalizedTags.toSet()) + + tagsToDeactivate.forEach { + currentTagMap[it]?.let { cht -> cht.isActive = false } + } + + val newAudioContentHashTagList = tagsToAdd.map { tag -> + val hashTag = hashTagRepository.findByTag(tag) + ?: hashTagRepository.save(HashTag(tag)) + + val audioContentHashTag = AudioContentHashTag() + audioContentHashTag.audioContent = audioContent + audioContentHashTag.hashTag = hashTag + + audioContentHashTag + } + + audioContent.audioContentHashTags.addAll(newAudioContentHashTagList) + } } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/UpdateCreatorAdminContentRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/UpdateCreatorAdminContentRequest.kt index 8eeda93..2df6a3a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/UpdateCreatorAdminContentRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/content/UpdateCreatorAdminContentRequest.kt @@ -4,6 +4,7 @@ data class UpdateCreatorAdminContentRequest( val id: Long, val title: String?, val detail: String?, + val tags: String?, val price: Int?, val isAdult: Boolean?, val isActive: Boolean?,