From 9eff82824922e049223fdad6144b979d16aaecbd Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Jun 2025 20:10:13 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=ED=81=AC=EB=A6=AC=EC=97=90?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20=EC=88=98=EC=A0=95=20-=20=ED=83=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/CreatorAdminContentRepository.kt | 17 +++++++++ .../content/CreatorAdminContentService.kt | 37 +++++++++++++++++++ .../UpdateCreatorAdminContentRequest.kt | 1 + 3 files changed, 55 insertions(+) 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?, -- 2.40.1 From 2268f4a3fcbc4cd0bcd38fabf6419448b10f8d6d Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Jun 2025 20:21:50 +0900 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EC=88=98=EC=A0=95=20-=20=ED=83=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20-=20=EB=B9=88=20?= =?UTF-8?q?=EC=B9=B8=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20#=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=EB=90=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../creator/admin/content/CreatorAdminContentService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c12c912..5841114 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 @@ -165,8 +165,8 @@ class CreatorAdminContentService( val normalizedTags = request.tags .replace("#", " #") .split(" ") - .map { if (it.startsWith("#")) it else "#$it" } .map { it.trim() } + .map { if (it.startsWith("#")) it else "#$it" } .filter { it.isNotBlank() } .distinct() -- 2.40.1 From 97b2b38f8e4682c9fde82f421fdee2806325d209 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Jun 2025 20:25:54 +0900 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B4=80=EB=A6=AC=EC=9E=90,=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20-=20isActive=20=3D=20True=20=ED=83=9C=EA=B7=B8?= =?UTF-8?q?=EB=A7=8C=20=EC=A1=B0=ED=9A=8C=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/admin/content/AdminContentRepository.kt | 1 + .../creator/admin/content/CreatorAdminContentRepository.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt index 8365b2b..af36cb0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/content/AdminContentRepository.kt @@ -140,6 +140,7 @@ class AdminAudioContentQueryRepositoryImpl( audioContent.duration.isNotNull .and(audioContent.member.isNotNull) .and(audioContentHashTag.audioContent.id.eq(audioContentId)) + .and(audioContentHashTag.isActive.isTrue) ) .fetch() } 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 72d5cff..d92110c 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 @@ -114,6 +114,7 @@ class CreatorAdminAudioContentQueryRepositoryImpl( audioContent.duration.isNotNull .and(audioContent.member.isNotNull) .and(audioContentHashTag.audioContent.id.eq(audioContentId)) + .and(audioContentHashTag.isActive.isTrue) ) .fetch() } -- 2.40.1 From 5bdb101b529de52c626a83df4d59540b74f47c75 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Jun 2025 20:53:06 +0900 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EC=88=98=EC=A0=95=20-=20=ED=83=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20-=20=EB=B9=88=20?= =?UTF-8?q?=EC=B9=B8=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20#=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=EB=90=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../creator/admin/content/CreatorAdminContentService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5841114..5654b13 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 @@ -166,8 +166,8 @@ class CreatorAdminContentService( .replace("#", " #") .split(" ") .map { it.trim() } - .map { if (it.startsWith("#")) it else "#$it" } .filter { it.isNotBlank() } + .map { if (it.startsWith("#")) it else "#$it" } .distinct() val currentContentTags = repository.findContentHashTagByContentIdAndIsActive(request.id, true) -- 2.40.1 From 28427a873a2517ce4fa67d6e75b9daf6052ca8cf Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Jun 2025 21:20:47 +0900 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EC=88=98=EC=A0=95=20-=20=ED=83=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20-=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=20=EC=9E=88=EB=8A=94=20=ED=83=9C=EA=B7=B8=EB=8A=94=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20=EC=B6=94=EA=B0=80=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/CreatorAdminContentRepository.kt | 15 +++++++++++++++ .../admin/content/CreatorAdminContentService.kt | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) 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 d92110c..adf25ac 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 @@ -30,6 +30,8 @@ interface CreatorAdminAudioContentQueryRepository { fun getAudioContent(memberId: Long, audioContentId: Long): AudioContent? fun findContentHashTagByContentIdAndIsActive(contentId: Long, isActive: Boolean): List + + fun findContentIdAndHashTagId(contentId: Long, hashTagId: Int): AudioContentHashTag? } class CreatorAdminAudioContentQueryRepositoryImpl( @@ -145,6 +147,19 @@ class CreatorAdminAudioContentQueryRepositoryImpl( .fetch() } + override fun findContentIdAndHashTagId(contentId: Long, hashTagId: Int): AudioContentHashTag? { + return queryFactory + .selectFrom(audioContentHashTag) + .innerJoin(audioContentHashTag.audioContent, audioContent) + .innerJoin(audioContentHashTag.hashTag, hashTag) + .where( + audioContent.id.eq(contentId), + hashTag.id.eq(hashTagId) + ) + .orderBy(audioContentHashTag.id.asc()) + .fetchFirst() + } + 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 5654b13..55becbb 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 @@ -184,7 +184,8 @@ class CreatorAdminContentService( val hashTag = hashTagRepository.findByTag(tag) ?: hashTagRepository.save(HashTag(tag)) - val audioContentHashTag = AudioContentHashTag() + val audioContentHashTag = repository.findContentIdAndHashTagId(request.id, hashTag.id!!) + ?: AudioContentHashTag() audioContentHashTag.audioContent = audioContent audioContentHashTag.hashTag = hashTag -- 2.40.1 From fd1b17e3567e97a449fda1f8716a08ad011bb03a Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Jun 2025 21:33:00 +0900 Subject: [PATCH 6/6] =?UTF-8?q?fix:=20=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EC=88=98=EC=A0=95=20-=20=ED=83=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20-=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=20=EC=9E=88=EB=8A=94=20=ED=83=9C=EA=B7=B8=EB=8A=94=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20=EC=B6=94=EA=B0=80=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/creator/admin/content/CreatorAdminContentService.kt | 1 + 1 file changed, 1 insertion(+) 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 55becbb..1c97e30 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 @@ -188,6 +188,7 @@ class CreatorAdminContentService( ?: AudioContentHashTag() audioContentHashTag.audioContent = audioContent audioContentHashTag.hashTag = hashTag + audioContentHashTag.isActive = true audioContentHashTag } -- 2.40.1