Merge pull request 'fix: 앱 콘텐츠 수정' (#323) from test into main
Reviewed-on: #323
This commit is contained in:
		| @@ -5,6 +5,9 @@ import com.querydsl.jpa.impl.JPAQueryFactory | |||||||
| import kr.co.vividnext.sodalive.content.QAudioContent.audioContent | import kr.co.vividnext.sodalive.content.QAudioContent.audioContent | ||||||
| import kr.co.vividnext.sodalive.content.category.QCategoryContent.categoryContent | import kr.co.vividnext.sodalive.content.category.QCategoryContent.categoryContent | ||||||
| import kr.co.vividnext.sodalive.content.comment.QAudioContentComment.audioContentComment | import kr.co.vividnext.sodalive.content.comment.QAudioContentComment.audioContentComment | ||||||
|  | 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.like.QAudioContentLike.audioContentLike | import kr.co.vividnext.sodalive.content.like.QAudioContentLike.audioContentLike | ||||||
| import kr.co.vividnext.sodalive.content.main.ContentCreatorResponse | import kr.co.vividnext.sodalive.content.main.ContentCreatorResponse | ||||||
| import kr.co.vividnext.sodalive.content.main.GetAudioContentMainItem | import kr.co.vividnext.sodalive.content.main.GetAudioContentMainItem | ||||||
| @@ -169,6 +172,10 @@ interface AudioContentQueryRepository { | |||||||
|     fun findNextContent(seriesId: Long, title: String, isAdult: Boolean): OtherContentResponse? |     fun findNextContent(seriesId: Long, title: String, isAdult: Boolean): OtherContentResponse? | ||||||
|  |  | ||||||
|     fun findSeriesIdByContentId(contentId: Long, isAdult: Boolean): Long? |     fun findSeriesIdByContentId(contentId: Long, isAdult: Boolean): Long? | ||||||
|  |  | ||||||
|  |     fun findContentHashTagByContentIdAndIsActive(contentId: Long, isActive: Boolean): List<AudioContentHashTag> | ||||||
|  |  | ||||||
|  |     fun findContentIdAndHashTagId(contentId: Long, hashTagId: Int): AudioContentHashTag? | ||||||
| } | } | ||||||
|  |  | ||||||
| @Repository | @Repository | ||||||
| @@ -1240,4 +1247,31 @@ class AudioContentQueryRepositoryImpl( | |||||||
|             .limit(1) |             .limit(1) | ||||||
|             .fetchFirst() |             .fetchFirst() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     override fun findContentHashTagByContentIdAndIsActive( | ||||||
|  |         contentId: Long, | ||||||
|  |         isActive: Boolean | ||||||
|  |     ): List<AudioContentHashTag> { | ||||||
|  |         return queryFactory | ||||||
|  |             .selectFrom(audioContentHashTag) | ||||||
|  |             .innerJoin(audioContentHashTag.audioContent, audioContent) | ||||||
|  |             .where( | ||||||
|  |                 audioContentHashTag.isActive.eq(isActive) | ||||||
|  |                     .and(audioContent.id.eq(contentId)) | ||||||
|  |             ) | ||||||
|  |             .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() | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -104,6 +104,7 @@ class AudioContentService( | |||||||
|  |  | ||||||
|         if (request.title != null) audioContent.title = request.title |         if (request.title != null) audioContent.title = request.title | ||||||
|         if (request.detail != null) audioContent.detail = request.detail |         if (request.detail != null) audioContent.detail = request.detail | ||||||
|  |         if (request.isPointAvailable != null) audioContent.isPointAvailable = request.isPointAvailable | ||||||
|         audioContent.isCommentAvailable = request.isCommentAvailable |         audioContent.isCommentAvailable = request.isCommentAvailable | ||||||
|         audioContent.isAdult = request.isAdult |         audioContent.isAdult = request.isAdult | ||||||
|  |  | ||||||
| @@ -124,6 +125,41 @@ class AudioContentService( | |||||||
|  |  | ||||||
|             audioContent.coverImage = coverImagePath |             audioContent.coverImage = coverImagePath | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         if (!request.tags.isNullOrBlank()) { | ||||||
|  |             val normalizedTags = request.tags | ||||||
|  |                 .replace("#", " #") | ||||||
|  |                 .split(" ") | ||||||
|  |                 .map { it.trim() } | ||||||
|  |                 .filter { it.isNotBlank() } | ||||||
|  |                 .map { if (it.startsWith("#")) it else "#$it" } | ||||||
|  |                 .distinct() | ||||||
|  |  | ||||||
|  |             val currentContentTags = repository.findContentHashTagByContentIdAndIsActive(request.contentId, 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 = repository.findContentIdAndHashTagId(request.contentId, hashTag.id!!) | ||||||
|  |                     ?: AudioContentHashTag() | ||||||
|  |                 audioContentHashTag.audioContent = audioContent | ||||||
|  |                 audioContentHashTag.hashTag = hashTag | ||||||
|  |                 audioContentHashTag.isActive = true | ||||||
|  |  | ||||||
|  |                 audioContentHashTag | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             audioContent.audioContentHashTags.addAll(newAudioContentHashTagList) | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Transactional |     @Transactional | ||||||
|   | |||||||
| @@ -4,6 +4,8 @@ data class ModifyAudioContentRequest( | |||||||
|     val contentId: Long, |     val contentId: Long, | ||||||
|     val title: String?, |     val title: String?, | ||||||
|     val detail: String?, |     val detail: String?, | ||||||
|  |     val tags: String?, | ||||||
|     val isAdult: Boolean, |     val isAdult: Boolean, | ||||||
|  |     val isPointAvailable: Boolean?, | ||||||
|     val isCommentAvailable: Boolean |     val isCommentAvailable: Boolean | ||||||
| ) | ) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user