mirror of https://github.com/usbharu/Hideout.git
feat: 動的にクエリを構築するように
This commit is contained in:
parent
8b93e929dc
commit
4f411dddbf
|
@ -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) })
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue