| @@ -64,6 +64,7 @@ interface AudioContentQueryRepository { | |||||||
|         theme: String = "", |         theme: String = "", | ||||||
|         sortType: SortType = SortType.NEWEST, |         sortType: SortType = SortType.NEWEST, | ||||||
|         isAdult: Boolean = false, |         isAdult: Boolean = false, | ||||||
|  |         contentType: ContentType = ContentType.ALL, | ||||||
|         offset: Long = 0, |         offset: Long = 0, | ||||||
|         limit: Long = 20 |         limit: Long = 20 | ||||||
|     ): List<GetAudioContentMainItem> |     ): List<GetAudioContentMainItem> | ||||||
| @@ -79,11 +80,17 @@ interface AudioContentQueryRepository { | |||||||
|         memberId: Long, |         memberId: Long, | ||||||
|         theme: String = "", |         theme: String = "", | ||||||
|         isAdult: Boolean = false, |         isAdult: Boolean = false, | ||||||
|  |         contentType: ContentType = ContentType.ALL, | ||||||
|         offset: Long = 0, |         offset: Long = 0, | ||||||
|         limit: Long = 20 |         limit: Long = 20 | ||||||
|     ): List<GetAudioContentMainItem> |     ): List<GetAudioContentMainItem> | ||||||
|  |  | ||||||
|     fun totalCountNewContentFor2Weeks(theme: String, memberId: Long, isAdult: Boolean): Int |     fun totalCountNewContentFor2Weeks( | ||||||
|  |         theme: String, | ||||||
|  |         memberId: Long, | ||||||
|  |         isAdult: Boolean, | ||||||
|  |         contentType: ContentType = ContentType.ALL | ||||||
|  |     ): Int | ||||||
|  |  | ||||||
|     fun getNewContentUploadCreatorList( |     fun getNewContentUploadCreatorList( | ||||||
|         cloudfrontHost: String, |         cloudfrontHost: String, | ||||||
| @@ -95,7 +102,8 @@ interface AudioContentQueryRepository { | |||||||
|     fun findAudioContentByCurationId( |     fun findAudioContentByCurationId( | ||||||
|         curationId: Long, |         curationId: Long, | ||||||
|         cloudfrontHost: String, |         cloudfrontHost: String, | ||||||
|         isAdult: Boolean |         isAdult: Boolean, | ||||||
|  |         contentType: ContentType = ContentType.ALL | ||||||
|     ): List<GetAudioContentMainItem> |     ): List<GetAudioContentMainItem> | ||||||
|  |  | ||||||
|     fun getAudioContentRanking( |     fun getAudioContentRanking( | ||||||
| @@ -333,6 +341,7 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|         theme: String, |         theme: String, | ||||||
|         sortType: SortType, |         sortType: SortType, | ||||||
|         isAdult: Boolean, |         isAdult: Boolean, | ||||||
|  |         contentType: ContentType, | ||||||
|         offset: Long, |         offset: Long, | ||||||
|         limit: Long |         limit: Long | ||||||
|     ): List<GetAudioContentMainItem> { |     ): List<GetAudioContentMainItem> { | ||||||
| @@ -361,6 +370,13 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|  |  | ||||||
|         if (!isAdult) { |         if (!isAdult) { | ||||||
|             where = where.and(audioContent.isAdult.isFalse) |             where = where.and(audioContent.isAdult.isFalse) | ||||||
|  |         } else { | ||||||
|  |             if (contentType != ContentType.ALL) { | ||||||
|  |                 where = where.and( | ||||||
|  |                     audioContent.member.auth.gender.eq(if (contentType == ContentType.MALE) 0 else 1) | ||||||
|  |                         .or(audioContent.isAdult.isFalse) | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (theme.isNotBlank()) { |         if (theme.isNotBlank()) { | ||||||
| @@ -417,7 +433,12 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|             .size |             .size | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override fun totalCountNewContentFor2Weeks(theme: String, memberId: Long, isAdult: Boolean): Int { |     override fun totalCountNewContentFor2Weeks( | ||||||
|  |         theme: String, | ||||||
|  |         memberId: Long, | ||||||
|  |         isAdult: Boolean, | ||||||
|  |         contentType: ContentType | ||||||
|  |     ): Int { | ||||||
|         var where = audioContent.isActive.isTrue |         var where = audioContent.isActive.isTrue | ||||||
|             .and(audioContent.duration.isNotNull) |             .and(audioContent.duration.isNotNull) | ||||||
|             .and(audioContent.releaseDate.goe(LocalDateTime.now().minusWeeks(2))) |             .and(audioContent.releaseDate.goe(LocalDateTime.now().minusWeeks(2))) | ||||||
| @@ -429,6 +450,13 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|  |  | ||||||
|         if (!isAdult) { |         if (!isAdult) { | ||||||
|             where = where.and(audioContent.isAdult.isFalse) |             where = where.and(audioContent.isAdult.isFalse) | ||||||
|  |         } else { | ||||||
|  |             if (contentType != ContentType.ALL) { | ||||||
|  |                 where = where.and( | ||||||
|  |                     audioContent.member.auth.gender.eq(if (contentType == ContentType.MALE) 0 else 1) | ||||||
|  |                         .or(audioContent.isAdult.isFalse) | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (theme.isNotBlank()) { |         if (theme.isNotBlank()) { | ||||||
| @@ -450,6 +478,7 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|         memberId: Long, |         memberId: Long, | ||||||
|         theme: String, |         theme: String, | ||||||
|         isAdult: Boolean, |         isAdult: Boolean, | ||||||
|  |         contentType: ContentType, | ||||||
|         offset: Long, |         offset: Long, | ||||||
|         limit: Long |         limit: Long | ||||||
|     ): List<GetAudioContentMainItem> { |     ): List<GetAudioContentMainItem> { | ||||||
| @@ -464,6 +493,13 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|  |  | ||||||
|         if (!isAdult) { |         if (!isAdult) { | ||||||
|             where = where.and(audioContent.isAdult.isFalse) |             where = where.and(audioContent.isAdult.isFalse) | ||||||
|  |         } else { | ||||||
|  |             if (contentType != ContentType.ALL) { | ||||||
|  |                 where = where.and( | ||||||
|  |                     audioContent.member.auth.gender.eq(if (contentType == ContentType.MALE) 0 else 1) | ||||||
|  |                         .or(audioContent.isAdult.isFalse) | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (theme.isNotBlank()) { |         if (theme.isNotBlank()) { | ||||||
| @@ -514,7 +550,6 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|             .orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc()) |             .orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc()) | ||||||
|             .limit(20) |             .limit(20) | ||||||
|             .fetch() |             .fetch() | ||||||
|             .asSequence() |  | ||||||
|             .map { |             .map { | ||||||
|                 GetNewContentUploadCreator( |                 GetNewContentUploadCreator( | ||||||
|                     it.id!!, |                     it.id!!, | ||||||
| @@ -526,7 +561,6 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|                     } |                     } | ||||||
|                 ) |                 ) | ||||||
|             } |             } | ||||||
|             .toList() |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override fun getAudioContentMainBannerList(isAdult: Boolean): List<AudioContentBanner> { |     override fun getAudioContentMainBannerList(isAdult: Boolean): List<AudioContentBanner> { | ||||||
| @@ -562,7 +596,8 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|     override fun findAudioContentByCurationId( |     override fun findAudioContentByCurationId( | ||||||
|         curationId: Long, |         curationId: Long, | ||||||
|         cloudfrontHost: String, |         cloudfrontHost: String, | ||||||
|         isAdult: Boolean |         isAdult: Boolean, | ||||||
|  |         contentType: ContentType | ||||||
|     ): List<GetAudioContentMainItem> { |     ): List<GetAudioContentMainItem> { | ||||||
|         var where = audioContent.isActive.isTrue |         var where = audioContent.isActive.isTrue | ||||||
|             .and(audioContent.member.isNotNull) |             .and(audioContent.member.isNotNull) | ||||||
| @@ -572,6 +607,13 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|  |  | ||||||
|         if (!isAdult) { |         if (!isAdult) { | ||||||
|             where = where.and(audioContent.isAdult.isFalse) |             where = where.and(audioContent.isAdult.isFalse) | ||||||
|  |         } else { | ||||||
|  |             if (contentType != ContentType.ALL) { | ||||||
|  |                 where = where.and( | ||||||
|  |                     audioContent.member.auth.gender.eq(if (contentType == ContentType.MALE) 0 else 1) | ||||||
|  |                         .or(audioContent.isAdult.isFalse) | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return queryFactory |         return queryFactory | ||||||
|   | |||||||
| @@ -0,0 +1,12 @@ | |||||||
|  | package kr.co.vividnext.sodalive.content | ||||||
|  |  | ||||||
|  | enum class ContentType { | ||||||
|  |     // 전체 | ||||||
|  |     ALL, | ||||||
|  |  | ||||||
|  |     // 남성향 | ||||||
|  |     MALE, | ||||||
|  |  | ||||||
|  |     // 여성향 | ||||||
|  |     FEMALE | ||||||
|  | } | ||||||
| @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.content.main | |||||||
|  |  | ||||||
| import kr.co.vividnext.sodalive.common.ApiResponse | import kr.co.vividnext.sodalive.common.ApiResponse | ||||||
| import kr.co.vividnext.sodalive.common.SodaException | import kr.co.vividnext.sodalive.common.SodaException | ||||||
|  | import kr.co.vividnext.sodalive.content.ContentType | ||||||
| import kr.co.vividnext.sodalive.content.order.OrderService | import kr.co.vividnext.sodalive.content.order.OrderService | ||||||
| import kr.co.vividnext.sodalive.member.Member | import kr.co.vividnext.sodalive.member.Member | ||||||
| import org.springframework.data.domain.Pageable | import org.springframework.data.domain.Pageable | ||||||
| @@ -62,12 +63,22 @@ class AudioContentMainController( | |||||||
|     @GetMapping("/new") |     @GetMapping("/new") | ||||||
|     fun getNewContentByTheme( |     fun getNewContentByTheme( | ||||||
|         @RequestParam("theme") theme: String, |         @RequestParam("theme") theme: String, | ||||||
|  |         @RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null, | ||||||
|  |         @RequestParam("contentType", required = false) contentType: ContentType? = null, | ||||||
|         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, |         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, | ||||||
|         pageable: Pageable |         pageable: Pageable | ||||||
|     ) = run { |     ) = run { | ||||||
|         if (member == null) throw SodaException("로그인 정보를 확인해주세요.") |         if (member == null) throw SodaException("로그인 정보를 확인해주세요.") | ||||||
|  |  | ||||||
|         ApiResponse.ok(service.getNewContentByTheme(theme, member, pageable)) |         ApiResponse.ok( | ||||||
|  |             service.getNewContentByTheme( | ||||||
|  |                 theme, | ||||||
|  |                 isAdultContentVisible = isAdultContentVisible ?: true, | ||||||
|  |                 contentType = contentType ?: ContentType.ALL, | ||||||
|  |                 member, | ||||||
|  |                 pageable | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @GetMapping("/theme") |     @GetMapping("/theme") | ||||||
| @@ -82,16 +93,28 @@ class AudioContentMainController( | |||||||
|     @GetMapping("/new/all") |     @GetMapping("/new/all") | ||||||
|     fun getNewContentAllByTheme( |     fun getNewContentAllByTheme( | ||||||
|         @RequestParam("theme") theme: String, |         @RequestParam("theme") theme: String, | ||||||
|  |         @RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null, | ||||||
|  |         @RequestParam("contentType", required = false) contentType: ContentType? = null, | ||||||
|         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, |         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, | ||||||
|         pageable: Pageable |         pageable: Pageable | ||||||
|     ) = run { |     ) = run { | ||||||
|         if (member == null) throw SodaException("로그인 정보를 확인해주세요.") |         if (member == null) throw SodaException("로그인 정보를 확인해주세요.") | ||||||
|  |  | ||||||
|         ApiResponse.ok(service.getNewContentFor2WeeksByTheme(theme, member, pageable)) |         ApiResponse.ok( | ||||||
|  |             service.getNewContentFor2WeeksByTheme( | ||||||
|  |                 theme = theme, | ||||||
|  |                 isAdultContentVisible = isAdultContentVisible ?: true, | ||||||
|  |                 contentType = contentType ?: ContentType.ALL, | ||||||
|  |                 member = member, | ||||||
|  |                 pageable = pageable | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @GetMapping("/curation-list") |     @GetMapping("/curation-list") | ||||||
|     fun getCurationList( |     fun getCurationList( | ||||||
|  |         @RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null, | ||||||
|  |         @RequestParam("contentType", required = false) contentType: ContentType? = null, | ||||||
|         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, |         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, | ||||||
|         pageable: Pageable |         pageable: Pageable | ||||||
|     ) = run { |     ) = run { | ||||||
| @@ -100,7 +123,8 @@ class AudioContentMainController( | |||||||
|         ApiResponse.ok( |         ApiResponse.ok( | ||||||
|             service.getAudioContentCurationListWithPaging( |             service.getAudioContentCurationListWithPaging( | ||||||
|                 memberId = member.id!!, |                 memberId = member.id!!, | ||||||
|                 isAdult = member.auth != null, |                 isAdult = member.auth != null && (isAdultContentVisible ?: true), | ||||||
|  |                 contentType = contentType ?: ContentType.ALL, | ||||||
|                 offset = pageable.offset, |                 offset = pageable.offset, | ||||||
|                 limit = pageable.pageSize.toLong() |                 limit = pageable.pageSize.toLong() | ||||||
|             ) |             ) | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package kr.co.vividnext.sodalive.content.main | package kr.co.vividnext.sodalive.content.main | ||||||
|  |  | ||||||
| import kr.co.vividnext.sodalive.content.AudioContentRepository | import kr.co.vividnext.sodalive.content.AudioContentRepository | ||||||
|  | import kr.co.vividnext.sodalive.content.ContentType | ||||||
| import kr.co.vividnext.sodalive.content.main.banner.AudioContentBannerType | import kr.co.vividnext.sodalive.content.main.banner.AudioContentBannerType | ||||||
| import kr.co.vividnext.sodalive.content.main.banner.GetAudioContentBannerResponse | import kr.co.vividnext.sodalive.content.main.banner.GetAudioContentBannerResponse | ||||||
| import kr.co.vividnext.sodalive.content.main.curation.GetAudioContentCurationResponse | import kr.co.vividnext.sodalive.content.main.curation.GetAudioContentCurationResponse | ||||||
| @@ -30,35 +31,49 @@ class AudioContentMainService( | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Transactional(readOnly = true) |     @Transactional(readOnly = true) | ||||||
|     fun getNewContentByTheme(theme: String, member: Member, pageable: Pageable): List<GetAudioContentMainItem> { |     fun getNewContentByTheme( | ||||||
|  |         theme: String, | ||||||
|  |         isAdultContentVisible: Boolean, | ||||||
|  |         contentType: ContentType, | ||||||
|  |         member: Member, | ||||||
|  |         pageable: Pageable | ||||||
|  |     ): List<GetAudioContentMainItem> { | ||||||
|         return repository.findByTheme( |         return repository.findByTheme( | ||||||
|             cloudfrontHost = imageHost, |             cloudfrontHost = imageHost, | ||||||
|             memberId = member.id!!, |             memberId = member.id!!, | ||||||
|             theme = theme, |             theme = theme, | ||||||
|             isAdult = member.auth != null, |             isAdult = member.auth != null && isAdultContentVisible, | ||||||
|  |             contentType = contentType, | ||||||
|             offset = pageable.offset, |             offset = pageable.offset, | ||||||
|             limit = pageable.pageSize.toLong() |             limit = pageable.pageSize.toLong() | ||||||
|         ) |         ) | ||||||
|             .asSequence() |  | ||||||
|             .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creatorId) } |             .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creatorId) } | ||||||
|             .toList() |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Transactional(readOnly = true) |     @Transactional(readOnly = true) | ||||||
|     fun getNewContentFor2WeeksByTheme(theme: String, member: Member, pageable: Pageable): GetNewContentAllResponse { |     fun getNewContentFor2WeeksByTheme( | ||||||
|         val totalCount = |         theme: String, | ||||||
|             repository.totalCountNewContentFor2Weeks(theme, memberId = member.id!!, isAdult = member.auth != null) |         isAdultContentVisible: Boolean, | ||||||
|  |         contentType: ContentType, | ||||||
|  |         member: Member, | ||||||
|  |         pageable: Pageable | ||||||
|  |     ): GetNewContentAllResponse { | ||||||
|  |         val totalCount = repository.totalCountNewContentFor2Weeks( | ||||||
|  |             theme, | ||||||
|  |             memberId = member.id!!, | ||||||
|  |             isAdult = member.auth != null && isAdultContentVisible, | ||||||
|  |             contentType = contentType | ||||||
|  |         ) | ||||||
|         val items = repository.findByThemeFor2Weeks( |         val items = repository.findByThemeFor2Weeks( | ||||||
|             cloudfrontHost = imageHost, |             cloudfrontHost = imageHost, | ||||||
|             memberId = member.id!!, |             memberId = member.id!!, | ||||||
|             theme = theme, |             theme = theme, | ||||||
|             isAdult = member.auth != null, |             isAdult = member.auth != null && isAdultContentVisible, | ||||||
|  |             contentType = contentType, | ||||||
|             offset = pageable.offset, |             offset = pageable.offset, | ||||||
|             limit = pageable.pageSize.toLong() |             limit = pageable.pageSize.toLong() | ||||||
|         ) |         ) | ||||||
|             .asSequence() |  | ||||||
|             .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creatorId) } |             .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creatorId) } | ||||||
|             .toList() |  | ||||||
|  |  | ||||||
|         return GetNewContentAllResponse(totalCount, items) |         return GetNewContentAllResponse(totalCount, items) | ||||||
|     } |     } | ||||||
| @@ -130,26 +145,28 @@ class AudioContentMainService( | |||||||
|         cacheNames = ["default"], |         cacheNames = ["default"], | ||||||
|         key = "'getAudioContentCurationListWithPaging:' + #memberId + ':' + #isAdult + ':' + #offset + ':' + #limit" |         key = "'getAudioContentCurationListWithPaging:' + #memberId + ':' + #isAdult + ':' + #offset + ':' + #limit" | ||||||
|     ) |     ) | ||||||
|     fun getAudioContentCurationListWithPaging(memberId: Long, isAdult: Boolean, offset: Long, limit: Long) = |     fun getAudioContentCurationListWithPaging( | ||||||
|         repository.getAudioContentCurationList(isAdult = isAdult, offset = offset, limit = limit) |         memberId: Long, | ||||||
|             .asSequence() |         isAdult: Boolean, | ||||||
|             .map { |         contentType: ContentType, | ||||||
|                 GetAudioContentCurationResponse( |         offset: Long, | ||||||
|  |         limit: Long | ||||||
|  |     ) = repository.getAudioContentCurationList(isAdult = isAdult, offset = offset, limit = limit) | ||||||
|  |         .map { | ||||||
|  |             GetAudioContentCurationResponse( | ||||||
|  |                 curationId = it.id!!, | ||||||
|  |                 title = it.title, | ||||||
|  |                 description = it.description, | ||||||
|  |                 contents = repository.findAudioContentByCurationId( | ||||||
|                     curationId = it.id!!, |                     curationId = it.id!!, | ||||||
|                     title = it.title, |                     cloudfrontHost = imageHost, | ||||||
|                     description = it.description, |                     isAdult = isAdult, | ||||||
|                     contents = repository.findAudioContentByCurationId( |                     contentType = contentType | ||||||
|                         curationId = it.id!!, |  | ||||||
|                         cloudfrontHost = imageHost, |  | ||||||
|                         isAdult = isAdult |  | ||||||
|                     ) |  | ||||||
|                         .asSequence() |  | ||||||
|                         .filter { content -> |  | ||||||
|                             !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = content.creatorId) |  | ||||||
|                         } |  | ||||||
|                         .toList() |  | ||||||
|                 ) |                 ) | ||||||
|             } |                     .filter { content -> | ||||||
|             .filter { it.contents.isNotEmpty() } |                         !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = content.creatorId) | ||||||
|             .toList() |                     } | ||||||
|  |             ) | ||||||
|  |         } | ||||||
|  |         .filter { it.contents.isNotEmpty() } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -33,12 +33,22 @@ class LiveRoomController( | |||||||
|         @RequestParam timezone: String, |         @RequestParam timezone: String, | ||||||
|         @RequestParam dateString: String? = null, |         @RequestParam dateString: String? = null, | ||||||
|         @RequestParam status: LiveRoomStatus, |         @RequestParam status: LiveRoomStatus, | ||||||
|  |         @RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null, | ||||||
|         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, |         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, | ||||||
|         pageable: Pageable |         pageable: Pageable | ||||||
|     ) = run { |     ) = run { | ||||||
|         if (member == null) throw SodaException("로그인 정보를 확인해주세요.") |         if (member == null) throw SodaException("로그인 정보를 확인해주세요.") | ||||||
|  |  | ||||||
|         ApiResponse.ok(service.getRoomList(dateString, status, pageable, member, timezone)) |         ApiResponse.ok( | ||||||
|  |             service.getRoomList( | ||||||
|  |                 dateString, | ||||||
|  |                 status, | ||||||
|  |                 isAdultContentVisible ?: true, | ||||||
|  |                 pageable, | ||||||
|  |                 member, | ||||||
|  |                 timezone | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @PostMapping |     @PostMapping | ||||||
|   | |||||||
| @@ -113,6 +113,7 @@ class LiveRoomService( | |||||||
|     fun getRoomList( |     fun getRoomList( | ||||||
|         dateString: String?, |         dateString: String?, | ||||||
|         status: LiveRoomStatus, |         status: LiveRoomStatus, | ||||||
|  |         isAdultContentVisible: Boolean, | ||||||
|         pageable: Pageable, |         pageable: Pageable, | ||||||
|         member: Member, |         member: Member, | ||||||
|         timezone: String |         timezone: String | ||||||
| @@ -123,7 +124,7 @@ class LiveRoomService( | |||||||
|                 timezone, |                 timezone, | ||||||
|                 memberId = member.id!!, |                 memberId = member.id!!, | ||||||
|                 isCreator = member.role == MemberRole.CREATOR, |                 isCreator = member.role == MemberRole.CREATOR, | ||||||
|                 isAdult = member.auth != null |                 isAdult = member.auth != null && isAdultContentVisible | ||||||
|             ) |             ) | ||||||
|         } else if (dateString != null) { |         } else if (dateString != null) { | ||||||
|             getLiveRoomListReservationWithDate( |             getLiveRoomListReservationWithDate( | ||||||
| @@ -132,14 +133,14 @@ class LiveRoomService( | |||||||
|                 timezone, |                 timezone, | ||||||
|                 memberId = member.id!!, |                 memberId = member.id!!, | ||||||
|                 isCreator = member.role == MemberRole.CREATOR, |                 isCreator = member.role == MemberRole.CREATOR, | ||||||
|                 isAdult = member.auth != null |                 isAdult = member.auth != null && isAdultContentVisible | ||||||
|             ) |             ) | ||||||
|         } else { |         } else { | ||||||
|             getLiveRoomListReservationWithoutDate( |             getLiveRoomListReservationWithoutDate( | ||||||
|                 timezone, |                 timezone, | ||||||
|                 isCreator = member.role == MemberRole.CREATOR, |                 isCreator = member.role == MemberRole.CREATOR, | ||||||
|                 memberId = member.id!!, |                 memberId = member.id!!, | ||||||
|                 isAdult = member.auth != null |                 isAdult = member.auth != null && isAdultContentVisible | ||||||
|             ) |             ) | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,15 +6,17 @@ import kr.co.vividnext.sodalive.member.Member | |||||||
| import org.springframework.security.access.prepost.PreAuthorize | import org.springframework.security.access.prepost.PreAuthorize | ||||||
| import org.springframework.security.core.annotation.AuthenticationPrincipal | import org.springframework.security.core.annotation.AuthenticationPrincipal | ||||||
| import org.springframework.web.bind.annotation.GetMapping | import org.springframework.web.bind.annotation.GetMapping | ||||||
|  | import org.springframework.web.bind.annotation.PostMapping | ||||||
|  | import org.springframework.web.bind.annotation.RequestBody | ||||||
| import org.springframework.web.bind.annotation.RequestMapping | import org.springframework.web.bind.annotation.RequestMapping | ||||||
| import org.springframework.web.bind.annotation.RequestParam | import org.springframework.web.bind.annotation.RequestParam | ||||||
| import org.springframework.web.bind.annotation.RestController | import org.springframework.web.bind.annotation.RestController | ||||||
|  |  | ||||||
| @RestController | @RestController | ||||||
|  | @PreAuthorize("hasRole('CREATOR')") | ||||||
| @RequestMapping("/live/room/menu") | @RequestMapping("/live/room/menu") | ||||||
| class LiveRoomMenuController(private val service: LiveRoomMenuService) { | class LiveRoomMenuController(private val service: LiveRoomMenuService) { | ||||||
|     @GetMapping("/all") |     @GetMapping("/all") | ||||||
|     @PreAuthorize("hasRole('CREATOR')") |  | ||||||
|     fun getAllLiveMenu( |     fun getAllLiveMenu( | ||||||
|         @RequestParam creatorId: Long, |         @RequestParam creatorId: Long, | ||||||
|         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? |         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? | ||||||
| @@ -23,4 +25,23 @@ class LiveRoomMenuController(private val service: LiveRoomMenuService) { | |||||||
|  |  | ||||||
|         ApiResponse.ok(service.getAllLiveMenu(creatorId = creatorId, memberId = member.id!!)) |         ApiResponse.ok(service.getAllLiveMenu(creatorId = creatorId, memberId = member.id!!)) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @PostMapping | ||||||
|  |     fun createOrUpdateLiveMenu( | ||||||
|  |         @RequestBody request: UpdateLiveMenuRequest, | ||||||
|  |         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? | ||||||
|  |     ) = run { | ||||||
|  |         if (member == null) throw SodaException("로그인 정보를 확인해주세요.") | ||||||
|  |  | ||||||
|  |         ApiResponse.ok( | ||||||
|  |             if (request.id > 0) { | ||||||
|  |                 service.updateLiveMenu(memberId = member.id!!, request = request) | ||||||
|  |             } else { | ||||||
|  |                 service.createLiveMenu( | ||||||
|  |                     memberId = member.id!!, | ||||||
|  |                     request = CreateLiveMenuRequest(menu = request.menu, isActive = false) | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|  |         ) | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user