From 13088f53a6bd801dbae5dd01b9b158efc656f869 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 10 Dec 2023 19:07:51 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20-=20=EB=A9=94=EC=9D=B8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=84=B9=EC=85=98=EB=B3=84=20API=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/AudioContentRepository.kt | 18 ++++++ .../main/AudioContentMainController.kt | 61 +++++++++++++++++++ .../content/main/AudioContentMainService.kt | 30 +++++++++ 3 files changed, 109 insertions(+) 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 94c9ffc..f609302 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -94,6 +94,8 @@ interface AudioContentQueryRepository { limit: Long = 12, sortType: String = "매출" ): List + + fun getAudioContentCurationList(isAdult: Boolean, offset: Long, limit: Long): List } @Repository @@ -544,4 +546,20 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) .limit(limit) .fetch() } + + override fun getAudioContentCurationList(isAdult: Boolean, offset: Long, limit: Long): List { + var where = audioContentCuration.isActive.isTrue + + if (!isAdult) { + where = where.and(audioContentCuration.isAdult.isFalse) + } + + return queryFactory + .selectFrom(audioContentCuration) + .where(where) + .offset(offset) + .limit(limit) + .orderBy(audioContentCuration.orders.asc()) + .fetch() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt index 9c51e43..4a6ea13 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.content.main import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.content.order.OrderService import kr.co.vividnext.sodalive.member.Member import org.springframework.data.domain.Pageable import org.springframework.security.core.annotation.AuthenticationPrincipal @@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController @RequestMapping("/audio-content/main") class AudioContentMainController( private val service: AudioContentMainService, + private val orderService: OrderService, private val manageService: AudioContentMainManageService ) { @@ -26,6 +28,48 @@ class AudioContentMainController( ApiResponse.ok(manageService.getMain(member)) } + @GetMapping("/new-content-upload-creator") + fun newContentUploadCreatorList( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getNewContentUploadCreatorList( + memberId = member.id!!, + isAdult = member.auth != null + ) + ) + } + + @GetMapping("/banner-list") + fun getMainBannerList( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getAudioContentMainBannerList( + memberId = member.id!!, + isAdult = member.auth != null + ) + ) + } + + @GetMapping("/order-list") + fun getMainOrderList( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + orderService.getAudioContentMainOrderList( + memberId = member.id!!, + limit = 20 + ) + ) + } + @GetMapping("/new") fun getNewContentByTheme( @RequestParam("theme") theme: String, @@ -56,4 +100,21 @@ class AudioContentMainController( ApiResponse.ok(service.getNewContentFor2WeeksByTheme(theme, member, pageable)) } + + @GetMapping("/curation-list") + fun getCurationList( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + pageable: Pageable + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getAudioContentCurationListWithPaging( + memberId = member.id!!, + isAdult = member.auth != null, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt index 50ca1ff..96d4b75 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt @@ -29,6 +29,7 @@ class AudioContentMainService( return audioContentThemeRepository.getActiveThemeOfContent(isAdult = isAdult) } + @Transactional(readOnly = true) fun getNewContentByTheme(theme: String, member: Member, pageable: Pageable): List { return repository.findByTheme( cloudfrontHost = imageHost, @@ -42,6 +43,7 @@ class AudioContentMainService( .toList() } + @Transactional(readOnly = true) fun getNewContentFor2WeeksByTheme(theme: String, member: Member, pageable: Pageable): GetNewContentAllResponse { val totalCount = repository.totalCountNewContentFor2Weeks(theme, isAdult = member.auth != null) val items = repository.findByThemeFor2Weeks( @@ -141,4 +143,32 @@ class AudioContentMainService( } .filter { it.contents.isNotEmpty() } .toList() + + @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["default"], + key = "'getAudioContentCurationListWithPaging:' + #memberId + ':' + #isAdult + ':' + #offset + ':' + #limit" + ) + fun getAudioContentCurationListWithPaging(memberId: Long, isAdult: Boolean, offset: Long, limit: Long) = + repository.getAudioContentCurationList(isAdult = isAdult, offset = offset, limit = limit) + .asSequence() + .map { + GetAudioContentCurationResponse( + curationId = it.id!!, + title = it.title, + description = it.description, + contents = repository.findAudioContentByCurationId( + curationId = it.id!!, + cloudfrontHost = imageHost, + isAdult = isAdult + ) + .asSequence() + .filter { content -> + !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = content.creatorId) + } + .toList() + ) + } + .filter { it.contents.isNotEmpty() } + .toList() } -- 2.40.1 From 80930ebd3df6a19db16c689b47175bce73d322f0 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 10 Dec 2023 21:26:15 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=A7=80=EA=B8=88=20=EC=A6=89=EC=8B=9C=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=A7=8C=EB=93=A4=EA=B8=B0,=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EC=8B=9C=EC=9E=91=20-=20?= =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EC=8B=9C=EC=9E=91=EC=8B=9C=20?= =?UTF-8?q?=EB=B3=B8=EC=9D=B8=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=A7=8C?= =?UTF-8?q?=EC=9D=B4=20=EC=95=84=EB=8B=8C=20=EC=A7=84=ED=96=89=20=EC=A4=91?= =?UTF-8?q?=EC=9D=B8=20=EB=AA=A8=EB=93=A0=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=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 --- .../kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt | 5 +++-- .../kr/co/vividnext/sodalive/live/room/LiveRoomService.kt | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt index b7de267..9f03a50 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt @@ -41,7 +41,7 @@ interface LiveRoomQueryRepository { fun getRecentRoomInfo(memberId: Long, cloudFrontHost: String): GetRecentRoomInfoResponse? fun getDonationTotal(roomId: Long): Int? fun getDonationList(roomId: Long, cloudFrontHost: String): List - fun getRoomActiveAndChannelNameIsNotNull(): List + fun getRoomActiveAndChannelNameIsNotNull(memberId: Long): List } class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : LiveRoomQueryRepository { @@ -191,12 +191,13 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L .fetch() } - override fun getRoomActiveAndChannelNameIsNotNull(): List { + override fun getRoomActiveAndChannelNameIsNotNull(memberId: Long): List { return queryFactory .selectFrom(liveRoom) .where( liveRoom.isActive.isTrue .and(liveRoom.channelName.isNotNull) + .and(liveRoom.member.id.eq(memberId)) ) .fetch() } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt index 46577ed..09101b0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt @@ -183,7 +183,7 @@ class LiveRoomService( } if (now == beginDateTime) { - val activeRooms = repository.getRoomActiveAndChannelNameIsNotNull() + val activeRooms = repository.getRoomActiveAndChannelNameIsNotNull(memberId = member.id!!) for (activeRoom in activeRooms) { activeRoom.isActive = false } @@ -410,7 +410,7 @@ class LiveRoomService( throw SodaException("$startAvailableDateTimeString 이후에 시작할 수 있습니다.") } - val activeRooms = repository.getRoomActiveAndChannelNameIsNotNull() + val activeRooms = repository.getRoomActiveAndChannelNameIsNotNull(memberId = member.id!!) for (activeRoom in activeRooms) { activeRoom.isActive = false } -- 2.40.1