mirror of https://github.com/usbharu/Hideout.git
feat: 動的にクエリを構築するように
This commit is contained in:
parent
14022e9301
commit
cab50e61a5
|
@ -1,17 +1,19 @@
|
||||||
package dev.usbharu.hideout.service.post
|
package dev.usbharu.hideout.service.post
|
||||||
|
|
||||||
import dev.usbharu.hideout.domain.mastodon.model.generated.Status
|
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.query.mastodon.StatusQueryService
|
||||||
import dev.usbharu.hideout.repository.MongoTimelineRepository
|
import dev.usbharu.hideout.repository.MongoTimelineRepository
|
||||||
import kotlinx.coroutines.Dispatchers
|
import org.springframework.data.mongodb.core.MongoTemplate
|
||||||
import kotlinx.coroutines.withContext
|
import org.springframework.data.mongodb.core.query.Criteria
|
||||||
import org.springframework.data.domain.Pageable
|
import org.springframework.data.mongodb.core.query.Query
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
class MongoGenerateTimelineService(
|
class MongoGenerateTimelineService(
|
||||||
private val mongoTimelineRepository: MongoTimelineRepository,
|
private val mongoTimelineRepository: MongoTimelineRepository,
|
||||||
private val statusQueryService: StatusQueryService
|
private val statusQueryService: StatusQueryService,
|
||||||
|
private val mongoTemplate: MongoTemplate
|
||||||
) :
|
) :
|
||||||
GenerateTimelineService {
|
GenerateTimelineService {
|
||||||
override suspend fun getTimeline(
|
override suspend fun getTimeline(
|
||||||
|
@ -23,12 +25,28 @@ class MongoGenerateTimelineService(
|
||||||
sinceId: Long?,
|
sinceId: Long?,
|
||||||
limit: Int
|
limit: Int
|
||||||
): List<Status> {
|
): List<Status> {
|
||||||
val timelines =
|
|
||||||
withContext(Dispatchers.IO) {
|
|
||||||
mongoTimelineRepository.findByUserIdAndTimelineIdAndPostIdBetweenAndIsLocal(
|
val query = Query()
|
||||||
forUserId, 0, maxId, minId, localOnly, Pageable.ofSize(limit)
|
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) })
|
return statusQueryService.findByPostIds(timelines.flatMap { setOfNotNull(it.postId, it.replyId, it.repostId) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue