feat(creator-channel): 커뮤니티 탭 조회 계약을 추가한다
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
package kr.co.vividnext.sodalive.v2.creator.channel.community.domain
|
||||
|
||||
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelPage
|
||||
import org.springframework.stereotype.Component
|
||||
|
||||
@Component
|
||||
class CreatorChannelCommunityQueryPolicy {
|
||||
fun createPage(page: Int?, size: Int?): CreatorChannelPage {
|
||||
return CreatorChannelPage(
|
||||
page = page?.coerceAtLeast(MIN_PAGE) ?: DEFAULT_PAGE,
|
||||
size = size?.coerceIn(MIN_PAGE_SIZE, MAX_PAGE_SIZE) ?: DEFAULT_PAGE_SIZE
|
||||
)
|
||||
}
|
||||
|
||||
fun <T> limitItems(fetched: List<T>, page: CreatorChannelPage): List<T> {
|
||||
return fetched.take(page.size)
|
||||
}
|
||||
|
||||
fun hasNext(fetched: List<*>, page: CreatorChannelPage): Boolean {
|
||||
return fetched.size > page.size
|
||||
}
|
||||
|
||||
fun maskPaidContent(
|
||||
content: String,
|
||||
price: Int,
|
||||
isCreatorSelf: Boolean,
|
||||
existOrdered: Boolean
|
||||
): String {
|
||||
if (price <= 0 || isCreatorSelf || existOrdered) {
|
||||
return content
|
||||
}
|
||||
|
||||
val codePointCount = content.codePointCount(0, content.length)
|
||||
val visibleCodePointCount = if (codePointCount > PAID_CONTENT_PREVIEW_CODE_POINTS) {
|
||||
PAID_CONTENT_PREVIEW_CODE_POINTS
|
||||
} else {
|
||||
codePointCount / 2
|
||||
}
|
||||
val endIndex = content.offsetByCodePoints(0, visibleCodePointCount)
|
||||
return content.substring(0, endIndex) + PAID_CONTENT_MASK_SUFFIX
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val DEFAULT_PAGE = 0
|
||||
private const val DEFAULT_PAGE_SIZE = 20
|
||||
private const val MIN_PAGE = 0
|
||||
private const val MIN_PAGE_SIZE = 20
|
||||
private const val MAX_PAGE_SIZE = 50
|
||||
private const val PAID_CONTENT_PREVIEW_CODE_POINTS = 15
|
||||
private const val PAID_CONTENT_MASK_SUFFIX = "..."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package kr.co.vividnext.sodalive.v2.creator.channel.community.domain
|
||||
|
||||
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelPage
|
||||
import java.time.LocalDateTime
|
||||
|
||||
data class CreatorChannelCommunityTab(
|
||||
val communityPostCount: Int,
|
||||
val communityPosts: List<CreatorChannelCommunityPost>,
|
||||
val page: CreatorChannelPage,
|
||||
val hasNext: Boolean
|
||||
)
|
||||
|
||||
data class CreatorChannelCommunityPost(
|
||||
val postId: Long,
|
||||
val creatorId: Long,
|
||||
val creatorNickname: String,
|
||||
val creatorProfileUrl: String,
|
||||
val imageUrl: String?,
|
||||
val audioUrl: String?,
|
||||
val content: String,
|
||||
val price: Int,
|
||||
val createdAt: LocalDateTime,
|
||||
val existOrdered: Boolean,
|
||||
val isCommentAvailable: Boolean,
|
||||
val likeCount: Int,
|
||||
val commentCount: Int,
|
||||
val isPinned: Boolean
|
||||
)
|
||||
@@ -0,0 +1,55 @@
|
||||
package kr.co.vividnext.sodalive.v2.creator.channel.community.port.out
|
||||
|
||||
import kr.co.vividnext.sodalive.member.MemberRole
|
||||
import java.time.LocalDateTime
|
||||
|
||||
interface CreatorChannelCommunityQueryPort {
|
||||
fun findCreator(creatorId: Long, viewerId: Long?): CreatorChannelCommunityCreatorRecord?
|
||||
|
||||
fun existsBlockedBetween(viewerId: Long, creatorId: Long): Boolean
|
||||
|
||||
fun countCommunityPosts(
|
||||
creatorId: Long,
|
||||
viewerId: Long,
|
||||
canViewAdultContent: Boolean
|
||||
): Int
|
||||
|
||||
fun findCommunityPosts(
|
||||
creatorId: Long,
|
||||
viewerId: Long,
|
||||
canViewAdultContent: Boolean,
|
||||
offset: Long,
|
||||
limit: Int
|
||||
): List<CreatorChannelCommunityPostRecord>
|
||||
|
||||
fun findHomeCommunityPosts(
|
||||
creatorId: Long,
|
||||
viewerId: Long,
|
||||
isPinned: Boolean,
|
||||
canViewAdultContent: Boolean,
|
||||
limit: Int
|
||||
): List<CreatorChannelCommunityPostRecord>
|
||||
}
|
||||
|
||||
data class CreatorChannelCommunityCreatorRecord(
|
||||
val creatorId: Long,
|
||||
val role: MemberRole,
|
||||
val nickname: String
|
||||
)
|
||||
|
||||
data class CreatorChannelCommunityPostRecord(
|
||||
val postId: Long,
|
||||
val creatorId: Long,
|
||||
val creatorNickname: String,
|
||||
val creatorProfilePath: String?,
|
||||
val imagePath: String?,
|
||||
val audioPath: String?,
|
||||
val content: String,
|
||||
val price: Int,
|
||||
val createdAt: LocalDateTime,
|
||||
val existOrdered: Boolean,
|
||||
val isCommentAvailable: Boolean,
|
||||
val likeCount: Int,
|
||||
val commentCount: Int,
|
||||
val isPinned: Boolean
|
||||
)
|
||||
Reference in New Issue
Block a user