Files
sodalive-backend-spring-boot/src/main/kotlin/kr/co/vividnext/sodalive/message/MessageRepository.kt
2023-08-02 14:04:31 +09:00

147 lines
5.5 KiB
Kotlin

package kr.co.vividnext.sodalive.message
import com.querydsl.core.types.dsl.BooleanExpression
import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.message.QMessage.message
import org.springframework.data.domain.Pageable
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface MessageRepository : JpaRepository<Message, Long>, MessageQueryRepository
interface MessageQueryRepository {
fun getSentTextMessageCount(memberId: Long): Int
fun getSentTextMessageList(pageable: Pageable, memberId: Long): List<Message>
fun getReceivedTextMessageCount(memberId: Long): Int
fun getReceivedTextMessageList(pageable: Pageable, memberId: Long): List<Message>
fun getKeepTextMessageCount(memberId: Long): Int
fun getKeepTextMessageList(pageable: Pageable, memberId: Long): List<Message>
fun getSentVoiceMessageCount(memberId: Long): Int
fun getSentVoiceMessageList(pageable: Pageable, memberId: Long): List<Message>
fun getReceivedVoiceMessageCount(memberId: Long): Int
fun getReceivedVoiceMessageList(pageable: Pageable, memberId: Long): List<Message>
fun getKeepVoiceMessageCount(memberId: Long): Int
fun getKeepVoiceMessageList(pageable: Pageable, memberId: Long): List<Message>
}
@Repository
class MessageQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : MessageQueryRepository {
override fun getSentTextMessageCount(memberId: Long): Int {
val where = message.messageType.eq(MessageType.TEXT)
.and(message.isSenderDelete.isFalse)
.and(message.sender.id.eq(memberId))
return totalCount(where)
}
override fun getSentTextMessageList(pageable: Pageable, memberId: Long): List<Message> {
val where = message.messageType.eq(MessageType.TEXT)
.and(message.isSenderDelete.isFalse)
.and(message.sender.id.eq(memberId))
return messageList(pageable, where)
}
override fun getReceivedTextMessageCount(memberId: Long): Int {
val where = message.messageType.eq(MessageType.TEXT)
.and(message.isRecipientDelete.isFalse)
.and(message.recipient.id.eq(memberId))
return totalCount(where)
}
override fun getReceivedTextMessageList(pageable: Pageable, memberId: Long): List<Message> {
val where = message.messageType.eq(MessageType.TEXT)
.and(message.isRecipientDelete.isFalse)
.and(message.recipient.id.eq(memberId))
return messageList(pageable, where)
}
override fun getKeepTextMessageCount(memberId: Long): Int {
val where = message.messageType.eq(MessageType.TEXT)
.and(message.isRecipientDelete.isFalse)
.and(message.isRecipientKeep.isTrue)
.and(message.recipient.id.eq(memberId))
return totalCount(where)
}
override fun getKeepTextMessageList(pageable: Pageable, memberId: Long): List<Message> {
val where = message.messageType.eq(MessageType.TEXT)
.and(message.isRecipientDelete.isFalse)
.and(message.isRecipientKeep.isTrue)
.and(message.recipient.id.eq(memberId))
return messageList(pageable, where)
}
override fun getSentVoiceMessageCount(memberId: Long): Int {
val where = message.messageType.eq(MessageType.VOICE)
.and(message.isSenderDelete.isFalse)
.and(message.sender.id.eq(memberId))
return totalCount(where)
}
override fun getSentVoiceMessageList(pageable: Pageable, memberId: Long): List<Message> {
val where = message.messageType.eq(MessageType.VOICE)
.and(message.isSenderDelete.isFalse)
.and(message.sender.id.eq(memberId))
return messageList(pageable, where)
}
override fun getReceivedVoiceMessageCount(memberId: Long): Int {
val where = message.messageType.eq(MessageType.VOICE)
.and(message.isRecipientDelete.isFalse)
.and(message.recipient.id.eq(memberId))
return totalCount(where)
}
override fun getReceivedVoiceMessageList(pageable: Pageable, memberId: Long): List<Message> {
val where = message.messageType.eq(MessageType.VOICE)
.and(message.isRecipientDelete.isFalse)
.and(message.recipient.id.eq(memberId))
return messageList(pageable, where)
}
override fun getKeepVoiceMessageCount(memberId: Long): Int {
val where = message.messageType.eq(MessageType.VOICE)
.and(message.isRecipientDelete.isFalse)
.and(message.isRecipientKeep.isTrue)
.and(message.recipient.id.eq(memberId))
return totalCount(where)
}
override fun getKeepVoiceMessageList(pageable: Pageable, memberId: Long): List<Message> {
val where = message.messageType.eq(MessageType.VOICE)
.and(message.isRecipientDelete.isFalse)
.and(message.isRecipientKeep.isTrue)
.and(message.recipient.id.eq(memberId))
return messageList(pageable, where)
}
private fun messageList(pageable: Pageable, where: BooleanExpression): List<Message> {
return queryFactory.selectFrom(message)
.offset(pageable.offset)
.limit(pageable.pageSize.toLong())
.where(where)
.orderBy(message.id.desc())
.fetch()
}
private fun totalCount(where: BooleanExpression): Int {
return queryFactory.select(message.id)
.from(message)
.where(where)
.fetch()
.size
}
}