From 711842f00d2cf2513eda5c7a299fb4184b786117 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 26 Jan 2024 23:36:17 +0900 Subject: [PATCH 01/12] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=95,=20=ED=95=B4=EC=A0=9C=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/AudioContentController.kt | 22 +++++++++++++ .../sodalive/content/AudioContentService.kt | 30 +++++++++++++++++ .../sodalive/content/pin/PinContent.kt | 20 +++++++++++ .../content/pin/PinContentRepository.kt | 33 +++++++++++++++++++ 4 files changed, 105 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContent.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt index b8f8873..d86afd3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt @@ -196,4 +196,26 @@ class AudioContentController(private val service: AudioContentService) { fun releaseContent() = run { ApiResponse.ok(service.releaseContent()) } + + @PostMapping("/pin-to-the-top/{id}") + @PreAuthorize("hasRole('CREATOR')") + fun pinToTheTop( + @PathVariable id: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.pinToTheTop(contentId = id, member = member)) + } + + @PutMapping("/unpin-at-the-top/{id}") + @PreAuthorize("hasRole('CREATOR')") + fun unpinAtTheTop( + @PathVariable id: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.unpinAtTheTop(contentId = id, member = member)) + } } 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 09a65f1..7d5e387 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -16,6 +16,8 @@ import kr.co.vividnext.sodalive.content.like.PutAudioContentLikeResponse import kr.co.vividnext.sodalive.content.main.GetAudioContentRanking import kr.co.vividnext.sodalive.content.order.OrderRepository import kr.co.vividnext.sodalive.content.order.OrderType +import kr.co.vividnext.sodalive.content.pin.PinContent +import kr.co.vividnext.sodalive.content.pin.PinContentRepository import kr.co.vividnext.sodalive.content.theme.AudioContentThemeQueryRepository import kr.co.vividnext.sodalive.explorer.ExplorerQueryRepository import kr.co.vividnext.sodalive.extensions.convertLocalDateTime @@ -49,6 +51,7 @@ class AudioContentService( private val playbackTrackingRepository: PlaybackTrackingRepository, private val commentRepository: AudioContentCommentRepository, private val audioContentLikeRepository: AudioContentLikeRepository, + private val pinContentRepository: PinContentRepository, private val s3Uploader: S3Uploader, private val objectMapper: ObjectMapper, @@ -696,4 +699,31 @@ class AudioContentService( fun getContentRankingSortTypeList(): List { return listOf("매출", "댓글", "좋아요") } + + @Transactional + fun pinToTheTop(contentId: Long, member: Member) { + val audioContent = repository.findByIdAndCreatorId(contentId = contentId, creatorId = member.id!!) + ?: throw SodaException("잘못된 콘텐츠 입니다.\n다시 시도해 주세요.") + + val pinContentList = pinContentRepository.getPinContentList(memberId = member.id!!) + val pinContent = if (pinContentList.size >= 3) { + pinContentList[0] + } else { + PinContent() + } + + pinContent.member = member + pinContent.content = audioContent + pinContentRepository.save(pinContent) + } + + @Transactional + fun unpinAtTheTop(contentId: Long, member: Member) { + val pinContent = pinContentRepository.findByContentIdAndMemberId( + contentId = contentId, + memberId = member.id!! + ) ?: throw SodaException("잘못된 콘텐츠 입니다.\n다시 시도해 주세요.") + + pinContent.isActive = false + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContent.kt new file mode 100644 index 0000000..2d6fcc3 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContent.kt @@ -0,0 +1,20 @@ +package kr.co.vividnext.sodalive.content.pin + +import kr.co.vividnext.sodalive.common.BaseEntity +import kr.co.vividnext.sodalive.content.AudioContent +import kr.co.vividnext.sodalive.member.Member +import javax.persistence.Entity +import javax.persistence.FetchType +import javax.persistence.JoinColumn +import javax.persistence.ManyToOne + +@Entity +data class PinContent(var isActive: Boolean = true) : BaseEntity() { + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + var member: Member? = null + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "content_id", nullable = false) + var content: AudioContent? = null +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt new file mode 100644 index 0000000..a33f642 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt @@ -0,0 +1,33 @@ +package kr.co.vividnext.sodalive.content.pin + +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.content.pin.QPinContent.pinContent +import org.springframework.data.jpa.repository.JpaRepository + +interface PinContentRepository : JpaRepository, PinContentQueryRepository + +interface PinContentQueryRepository { + fun getPinContentList(memberId: Long): List + + fun findByContentIdAndMemberId(contentId: Long, memberId: Long): PinContent? +} + +class PinContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : PinContentQueryRepository { + override fun getPinContentList(memberId: Long): List { + return queryFactory + .selectFrom(pinContent) + .where(pinContent.member.id.eq(memberId)) + .orderBy(pinContent.updatedAt.asc()) + .fetch() + } + + override fun findByContentIdAndMemberId(contentId: Long, memberId: Long): PinContent? { + return queryFactory + .selectFrom(pinContent) + .where( + pinContent.content.id.eq(contentId) + .and(pinContent.member.id.eq(memberId)) + ) + .fetchFirst() + } +} From 443818efb5d3845fbd4d4cbea394d5c63b391e03 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 27 Jan 2024 00:03:34 +0900 Subject: [PATCH 02/12] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20-=20=EC=83=81=EB=8B=A8=EC=97=90=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=95=20=EC=83=81=ED=83=9C,=20=EA=B3=A0=EC=A0=95=EC=9D=B4?= =?UTF-8?q?=20=EA=B0=80=EB=8A=A5=ED=95=9C=20=EC=83=81=ED=83=9C=20=EC=9D=B8?= =?UTF-8?q?=EC=A7=80=20=ED=8C=90=EB=8B=A8=ED=95=98=EB=8A=94=20=ED=94=8C?= =?UTF-8?q?=EB=9E=98=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/content/AudioContentService.kt | 21 +++++++++++++++++++ .../content/GetAudioContentDetailResponse.kt | 2 ++ .../content/pin/PinContentRepository.kt | 17 +++++++++------ 3 files changed, 34 insertions(+), 6 deletions(-) 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 7d5e387..d44439b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -554,6 +554,25 @@ class AudioContentService( null } + val pinContent = pinContentRepository.findByContentIdAndMemberId( + contentId = id, + memberId = member.id!!, + active = true + ) + + val isPin = if (member.id!! == audioContent.member!!.id!!) { + pinContent != null + } else { + false + } + + val pinContentListCount = pinContentRepository.getPinContentList(memberId = member.id!!).size + val isAvailablePin = if (member.id!! == audioContent.member!!.id!!) { + pinContentListCount < 3 + } else { + false + } + return GetAudioContentDetailResponse( contentId = audioContent.id!!, title = audioContent.title, @@ -579,6 +598,8 @@ class AudioContentService( likeCount = likeCount, commentList = commentList, commentCount = commentCount, + isPin = isPin, + isAvailablePin = isAvailablePin, creator = AudioContentCreator( creatorId = creatorId, nickname = creator.nickname, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt index ed377b6..0049565 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt @@ -29,6 +29,8 @@ data class GetAudioContentDetailResponse( val likeCount: Int, val commentList: List, val commentCount: Int, + val isPin: Boolean, + val isAvailablePin: Boolean, val creator: AudioContentCreator ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt index a33f642..9b089e2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt @@ -9,7 +9,7 @@ interface PinContentRepository : JpaRepository, PinContentQuer interface PinContentQueryRepository { fun getPinContentList(memberId: Long): List - fun findByContentIdAndMemberId(contentId: Long, memberId: Long): PinContent? + fun findByContentIdAndMemberId(contentId: Long, memberId: Long, active: Boolean? = null): PinContent? } class PinContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : PinContentQueryRepository { @@ -21,13 +21,18 @@ class PinContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : .fetch() } - override fun findByContentIdAndMemberId(contentId: Long, memberId: Long): PinContent? { + override fun findByContentIdAndMemberId(contentId: Long, memberId: Long, active: Boolean?): PinContent? { + var where = pinContent.content.id.eq(contentId) + .and(pinContent.member.id.eq(memberId)) + + if (active != null) { + where = where + .and(pinContent.isActive.eq(active)) + } + return queryFactory .selectFrom(pinContent) - .where( - pinContent.content.id.eq(contentId) - .and(pinContent.member.id.eq(memberId)) - ) + .where(where) .fetchFirst() } } From 95e31bb629c11711a64e765c81623be9abffad84 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 27 Jan 2024 02:29:09 +0900 Subject: [PATCH 03/12] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=95=20-=20=EC=A4=91=EB=B3=B5=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=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 --- .../sodalive/content/AudioContentService.kt | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) 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 d44439b..aff1863 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -726,16 +726,25 @@ class AudioContentService( val audioContent = repository.findByIdAndCreatorId(contentId = contentId, creatorId = member.id!!) ?: throw SodaException("잘못된 콘텐츠 입니다.\n다시 시도해 주세요.") - val pinContentList = pinContentRepository.getPinContentList(memberId = member.id!!) - val pinContent = if (pinContentList.size >= 3) { - pinContentList[0] - } else { - PinContent() - } + var pinContent = pinContentRepository.findByContentIdAndMemberId( + contentId = contentId, + memberId = member.id!! + ) - pinContent.member = member - pinContent.content = audioContent - pinContentRepository.save(pinContent) + if (pinContent != null) { + pinContent.isActive = true + } else { + val pinContentList = pinContentRepository.getPinContentList(memberId = member.id!!) + pinContent = if (pinContentList.size >= 3) { + pinContentList[0] + } else { + PinContent() + } + + pinContent.member = member + pinContent.content = audioContent + pinContentRepository.save(pinContent) + } } @Transactional From cec4cd0d2852ebd9d70d81ce2862e5be24e89126 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 27 Jan 2024 02:43:41 +0900 Subject: [PATCH 04/12] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=95=20-=20=EA=B3=A0=EC=A0=95=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EA=B0=9C=EC=88=98=20=ED=91=9C=EC=8B=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/content/AudioContentService.kt | 2 +- .../sodalive/content/pin/PinContentRepository.kt | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) 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 aff1863..7ca0de6 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -566,7 +566,7 @@ class AudioContentService( false } - val pinContentListCount = pinContentRepository.getPinContentList(memberId = member.id!!).size + val pinContentListCount = pinContentRepository.getPinContentList(memberId = member.id!!, active = true).size val isAvailablePin = if (member.id!! == audioContent.member!!.id!!) { pinContentListCount < 3 } else { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt index 9b089e2..836628f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt @@ -7,16 +7,22 @@ import org.springframework.data.jpa.repository.JpaRepository interface PinContentRepository : JpaRepository, PinContentQueryRepository interface PinContentQueryRepository { - fun getPinContentList(memberId: Long): List + fun getPinContentList(memberId: Long, active: Boolean? = null): List fun findByContentIdAndMemberId(contentId: Long, memberId: Long, active: Boolean? = null): PinContent? } class PinContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : PinContentQueryRepository { - override fun getPinContentList(memberId: Long): List { + override fun getPinContentList(memberId: Long, active: Boolean?): List { + var where = pinContent.member.id.eq(memberId) + + if (active != null) { + where = where.and(pinContent.isActive.eq(active)) + } + return queryFactory .selectFrom(pinContent) - .where(pinContent.member.id.eq(memberId)) + .where(where) .orderBy(pinContent.updatedAt.asc()) .fetch() } From f70e5bae9afd2456824ad2af272c8426a9071c38 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 27 Jan 2024 03:42:27 +0900 Subject: [PATCH 05/12] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=95=20-=20=EA=B3=A0=EC=A0=95=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A0=95=EB=A0=AC=20?= =?UTF-8?q?=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/vividnext/sodalive/content/pin/PinContentRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt index 836628f..1819821 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/pin/PinContentRepository.kt @@ -23,7 +23,7 @@ class PinContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : return queryFactory .selectFrom(pinContent) .where(where) - .orderBy(pinContent.updatedAt.asc()) + .orderBy(pinContent.isActive.asc(), pinContent.updatedAt.asc()) .fetch() } From 77ed131f8907b7ae46dd573d742fb8a28c95380f Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 28 Jan 2024 16:58:54 +0900 Subject: [PATCH 06/12] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=95=20-=20active=EA=B0=80=20true=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=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 --- .../kr/co/vividnext/sodalive/content/AudioContentService.kt | 1 + 1 file changed, 1 insertion(+) 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 7ca0de6..d427927 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -741,6 +741,7 @@ class AudioContentService( PinContent() } + pinContent.isActive = true pinContent.member = member pinContent.content = audioContent pinContentRepository.save(pinContent) From 4a27a825a16f252efcc5d67ade2f6b841866aa01 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 28 Jan 2024 20:55:08 +0900 Subject: [PATCH 07/12] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20-=20=EA=B3=A0=EC=A0=95=EC=BD=98=ED=85=90=EC=B8=A0?= =?UTF-8?q?=EA=B0=80=20=EC=83=81=EC=9C=84=EC=97=90=20=EB=85=B8=EC=B6=9C?= =?UTF-8?q?=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=A0=95=EB=A0=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/content/AudioContentRepository.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt index 2966970..cad5cbe 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -16,6 +16,7 @@ import kr.co.vividnext.sodalive.content.main.banner.QAudioContentBanner.audioCon import kr.co.vividnext.sodalive.content.main.curation.AudioContentCuration import kr.co.vividnext.sodalive.content.main.curation.QAudioContentCuration.audioContentCuration import kr.co.vividnext.sodalive.content.order.QOrder.order +import kr.co.vividnext.sodalive.content.pin.QPinContent.pinContent import kr.co.vividnext.sodalive.content.theme.QAudioContentTheme.audioContentTheme import kr.co.vividnext.sodalive.event.QEvent.event import kr.co.vividnext.sodalive.member.MemberRole @@ -161,11 +162,14 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) } return queryFactory - .selectFrom(audioContent) + .select(audioContent) + .from(audioContent) + .leftJoin(pinContent) + .on(audioContent.id.eq(pinContent.content.id).and(pinContent.isActive.ne(false))) .where(where) .offset(offset) .limit(limit) - .orderBy(orderBy) + .orderBy(pinContent.isActive.desc(), pinContent.updatedAt.desc(), orderBy) .fetch() } From da1c096b45465ab60bbc280b0c028f3abc41611b Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 29 Jan 2024 00:29:29 +0900 Subject: [PATCH 08/12] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20-=20=EA=B3=A0=EC=A0=95=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=EB=A5=BC=20=EB=82=98=ED=83=80=EB=82=B4=EB=8A=94=20?= =?UTF-8?q?=ED=94=8C=EB=9E=98=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/AudioContentRepository.kt | 22 ++++++++++++++++--- .../sodalive/content/AudioContentService.kt | 21 ++++++------------ .../content/GetAudioContentListResponse.kt | 9 +++++--- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt index cad5cbe..654d2ea 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -34,11 +34,12 @@ interface AudioContentQueryRepository { fun findBundleByContentId(contentId: Long): List fun findByCreatorId( creatorId: Long, + coverImageHost: String, isAdult: Boolean = false, sortType: SortType = SortType.NEWEST, offset: Long = 0, limit: Long = 10 - ): List + ): List fun findTotalCountByCreatorId(creatorId: Long, isAdult: Boolean = false): Int fun getCreatorOtherContentList( @@ -140,11 +141,12 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) override fun findByCreatorId( creatorId: Long, + coverImageHost: String, isAdult: Boolean, sortType: SortType, offset: Long, limit: Long - ): List { + ): List { val orderBy = when (sortType) { SortType.NEWEST -> audioContent.releaseDate.desc() SortType.PRICE_HIGH -> audioContent.price.desc() @@ -162,7 +164,21 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) } return queryFactory - .select(audioContent) + .select( + QGetAudioContentListItem( + audioContent.id, + audioContent.coverImage.prepend(coverImageHost), + audioContent.title, + audioContent.price, + audioContent.theme.theme, + audioContent.duration, + Expressions.constant(0), + Expressions.constant(0), + pinContent.id.isNotNull, + audioContent.isAdult, + audioContent.releaseDate.gt(LocalDateTime.now()) + ) + ) .from(audioContent) .leftJoin(pinContent) .on(audioContent.id.eq(pinContent.content.id).and(pinContent.isActive.ne(false))) 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 d427927..31b0081 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -627,6 +627,7 @@ class AudioContentService( val audioContentList = repository.findByCreatorId( creatorId = creatorId, + coverImageHost = coverImageHost, isAdult = member.auth != null, sortType = sortType, offset = offset, @@ -636,23 +637,15 @@ class AudioContentService( val items = audioContentList .map { val commentCount = commentRepository - .totalCountCommentByContentId(it.id!!) + .totalCountCommentByContentId(it.contentId) val likeCount = audioContentLikeRepository - .totalCountAudioContentLike(it.id!!) + .totalCountAudioContentLike(it.contentId) - GetAudioContentListItem( - contentId = it.id!!, - coverImageUrl = "$coverImageHost/${it.coverImage!!}", - title = it.title, - price = it.price, - themeStr = it.theme!!.theme, - duration = it.duration, - likeCount = likeCount, - commentCount = commentCount, - isAdult = it.isAdult, - isScheduledToOpen = it.releaseDate != null && it.releaseDate!! > LocalDateTime.now() - ) + it.likeCount = likeCount + it.commentCount = commentCount + + it } return GetAudioContentListResponse( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentListResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentListResponse.kt index 2986176..b4f304d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentListResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentListResponse.kt @@ -1,19 +1,22 @@ package kr.co.vividnext.sodalive.content +import com.querydsl.core.annotations.QueryProjection + data class GetAudioContentListResponse( val totalCount: Int, val items: List ) -data class GetAudioContentListItem( +data class GetAudioContentListItem @QueryProjection constructor( val contentId: Long, val coverImageUrl: String, val title: String, val price: Int, val themeStr: String, val duration: String?, - val likeCount: Int, - val commentCount: Int, + var likeCount: Int = 0, + var commentCount: Int = 0, + val isPin: Boolean, val isAdult: Boolean, val isScheduledToOpen: Boolean ) From 67522804d9b69767adc018260bc4f6161d6c63cf Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 29 Jan 2024 00:50:56 +0900 Subject: [PATCH 09/12] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=B1=84=EB=84=90=20-=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0,=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EA=B0=9C=EC=88=98?= =?UTF-8?q?=20=EC=B5=9C=EB=8C=80=204=EA=B0=9C=EC=97=90=EC=84=9C=203?= =?UTF-8?q?=EA=B0=9C=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/explorer/ExplorerService.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt index 3cf3390..33ca0eb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt @@ -215,7 +215,7 @@ class ExplorerService( creatorId, userMember = member, timezone = timezone, - limit = 4 + limit = 3 ) // 오디오 콘텐츠 @@ -224,7 +224,7 @@ class ExplorerService( sortType = SortType.NEWEST, member = member, offset = 0, - limit = 4 + limit = 3 ).items // 공지사항 From 89beba25b66949329d3bb3584f0ab531056ee211 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 29 Jan 2024 11:15:12 +0900 Subject: [PATCH 10/12] =?UTF-8?q?=EA=B4=80=EB=9D=BC=EC=9E=90=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20-=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=20=EC=88=9C=EC=84=9C=20id=20->=20releaseDate?= =?UTF-8?q?=20=EB=82=B4=EB=A6=BC=EC=B0=A8=EC=88=9C=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/admin/content/AdminContentRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5b146ec..7879e45 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 @@ -83,7 +83,7 @@ class AdminAudioContentQueryRepositoryImpl( .where(where) .offset(offset) .limit(limit) - .orderBy(audioContent.id.desc()) + .orderBy(audioContent.releaseDate.desc()) .fetch() } From bf634b09dbc7d2cb26ffdca6d2547aa02cdcb509 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 29 Jan 2024 11:20:24 +0900 Subject: [PATCH 11/12] =?UTF-8?q?=EC=98=88=EC=95=BD=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EB=B0=B0=ED=8F=AC=20-=20=EC=BB=A8=EB=B2=84?= =?UTF-8?q?=ED=8C=85=20=EC=9E=91=EC=97=85=EC=9D=B4=20=EC=99=84=EB=A3=8C?= =?UTF-8?q?=EB=90=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=EA=B0=80=20=ED=95=B4=EB=8B=B9=20=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=EC=9D=B4=20=EB=90=98=EC=84=9C=20=EB=B0=B0=ED=8F=AC=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/content/AudioContentRepository.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt index 654d2ea..cffb8e1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -614,6 +614,7 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) val where = audioContent.isActive.isFalse .and(audioContent.releaseDate.isNotNull) .and(audioContent.releaseDate.loe(LocalDateTime.now())) + .and(audioContent.duration.isNotNull) return queryFactory .select(audioContent.id) From 653f1f8d58f6e636c21f870d9f74b377b603542d Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 29 Jan 2024 11:39:21 +0900 Subject: [PATCH 12/12] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20-=20=EC=BB=A4=EB=B2=84=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20URL=20=EC=9E=98=EB=AA=BB=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EB=90=98=EB=8D=98=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/content/AudioContentRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt index cffb8e1..d083cad 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -167,7 +167,7 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) .select( QGetAudioContentListItem( audioContent.id, - audioContent.coverImage.prepend(coverImageHost), + audioContent.coverImage.prepend("/").prepend(coverImageHost), audioContent.title, audioContent.price, audioContent.theme.theme,