feat: 動的にクエリを構築するように

This commit is contained in:
usbharu 2023-09-29 19:19:05 +09:00
parent 8b93e929dc
commit 4f411dddbf
1 changed files with 28 additions and 10 deletions

View File

@ -1,17 +1,19 @@
package dev.usbharu.hideout.service.post
import dev.usbharu.hideout.domain.mastodon.model.generated.Status
import dev.usbharu.hideout.domain.model.hideout.entity.Timeline
import dev.usbharu.hideout.query.mastodon.StatusQueryService
import dev.usbharu.hideout.repository.MongoTimelineRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.springframework.data.domain.Pageable
import org.springframework.data.mongodb.core.MongoTemplate
import org.springframework.data.mongodb.core.query.Criteria
import org.springframework.data.mongodb.core.query.Query
import org.springframework.stereotype.Service
@Service
class MongoGenerateTimelineService(
private val mongoTimelineRepository: MongoTimelineRepository,
private val statusQueryService: StatusQueryService
private val statusQueryService: StatusQueryService,
private val mongoTemplate: MongoTemplate
) :
GenerateTimelineService {
override suspend fun getTimeline(
@ -23,12 +25,28 @@ class MongoGenerateTimelineService(
sinceId: Long?,
limit: Int
): List<Status> {
val timelines =
withContext(Dispatchers.IO) {
mongoTimelineRepository.findByUserIdAndTimelineIdAndPostIdBetweenAndIsLocal(
forUserId, 0, maxId, minId, localOnly, Pageable.ofSize(limit)
)
}
val query = Query()
if (forUserId != null) {
val criteria = Criteria.where("userId").`is`(forUserId)
query.addCriteria(criteria)
}
if (localOnly) {
val criteria = Criteria.where("isLocal").`is`(true)
query.addCriteria(criteria)
}
if (maxId != null) {
val criteria = Criteria.where("postId").lt(maxId)
query.addCriteria(criteria)
}
if (minId != null) {
val criteria = Criteria.where("postId").gt(minId)
query.addCriteria(criteria)
}
val timelines = mongoTemplate.find(query.limit(limit), Timeline::class.java)
return statusQueryService.findByPostIds(timelines.flatMap { setOfNotNull(it.postId, it.replyId, it.repostId) })
}
}