mirror of https://github.com/usbharu/Hideout.git
feat: タイムラインを実装
This commit is contained in:
parent
5303b13b08
commit
b4c62fbd43
|
@ -22,16 +22,53 @@ class TimelineObject(
|
||||||
val postCreatedAt: Instant,
|
val postCreatedAt: Instant,
|
||||||
val replyId: PostId?,
|
val replyId: PostId?,
|
||||||
val repostId: PostId?,
|
val repostId: PostId?,
|
||||||
val visibility: Visibility,
|
visibility: Visibility,
|
||||||
val isPureRepost: Boolean,
|
isPureRepost: Boolean,
|
||||||
val mediaIds: List<MediaId>,
|
mediaIds: List<MediaId>,
|
||||||
val emojiIds: List<EmojiId>,
|
emojiIds: List<EmojiId>,
|
||||||
val visibleActors: List<ActorId>,
|
visibleActors: List<ActorId>,
|
||||||
val hasMedia: Boolean,
|
hasMediaInRepost: Boolean,
|
||||||
val hasMediaInRepost: Boolean,
|
lastUpdatedAt: Instant,
|
||||||
val lastUpdatedAt: Instant,
|
var warnFilters: List<TimelineObjectWarnFilter>,
|
||||||
val warnFilters: List<TimelineObjectWarnFilter>,
|
|
||||||
) {
|
) {
|
||||||
|
var isPureRepost = isPureRepost
|
||||||
|
private set
|
||||||
|
var visibleActors = visibleActors
|
||||||
|
private set
|
||||||
|
var hasMediaInRepost = hasMediaInRepost
|
||||||
|
private set
|
||||||
|
val hasMedia
|
||||||
|
get() = mediaIds.isNotEmpty()
|
||||||
|
|
||||||
|
var lastUpdatedAt = lastUpdatedAt
|
||||||
|
private set
|
||||||
|
var visibility = visibility
|
||||||
|
private set
|
||||||
|
var mediaIds = mediaIds
|
||||||
|
private set
|
||||||
|
var emojiIds = emojiIds
|
||||||
|
private set
|
||||||
|
|
||||||
|
fun updateWith(post: Post, filterResults: List<FilterResult>) {
|
||||||
|
visibleActors = post.visibleActors.toList()
|
||||||
|
visibility = post.visibility
|
||||||
|
mediaIds = post.mediaIds.toList()
|
||||||
|
emojiIds = post.emojiIds.toList()
|
||||||
|
lastUpdatedAt = Instant.now()
|
||||||
|
isPureRepost =
|
||||||
|
post.repostId != null && post.replyId == null && post.text.isEmpty() && post.overview?.overview.isNullOrEmpty()
|
||||||
|
warnFilters = filterResults.map { TimelineObjectWarnFilter(it.filter.id, it.matchedKeyword) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun updateWith(post: Post, repost: Post, filterResults: List<FilterResult>) {
|
||||||
|
require(repost.id == post.repostId)
|
||||||
|
require(repostId == post.repostId)
|
||||||
|
|
||||||
|
updateWith(post, filterResults)
|
||||||
|
hasMediaInRepost = repost.mediaIds.isNotEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
fun create(
|
fun create(
|
||||||
|
@ -54,7 +91,6 @@ class TimelineObject(
|
||||||
mediaIds = post.mediaIds,
|
mediaIds = post.mediaIds,
|
||||||
emojiIds = post.emojiIds,
|
emojiIds = post.emojiIds,
|
||||||
visibleActors = post.visibleActors.toList(),
|
visibleActors = post.visibleActors.toList(),
|
||||||
hasMedia = post.mediaIds.isNotEmpty(),
|
|
||||||
hasMediaInRepost = false,
|
hasMediaInRepost = false,
|
||||||
lastUpdatedAt = Instant.now(),
|
lastUpdatedAt = Instant.now(),
|
||||||
warnFilters = filterResults.map { TimelineObjectWarnFilter(it.filter.id, it.matchedKeyword) }
|
warnFilters = filterResults.map { TimelineObjectWarnFilter(it.filter.id, it.matchedKeyword) }
|
||||||
|
@ -88,7 +124,6 @@ class TimelineObject(
|
||||||
mediaIds = post.mediaIds,
|
mediaIds = post.mediaIds,
|
||||||
emojiIds = post.emojiIds,
|
emojiIds = post.emojiIds,
|
||||||
visibleActors = post.visibleActors.toList(),
|
visibleActors = post.visibleActors.toList(),
|
||||||
hasMedia = post.mediaIds.isNotEmpty(),
|
|
||||||
hasMediaInRepost = repost.mediaIds.isNotEmpty(),
|
hasMediaInRepost = repost.mediaIds.isNotEmpty(),
|
||||||
lastUpdatedAt = Instant.now(),
|
lastUpdatedAt = Instant.now(),
|
||||||
warnFilters = filterResults.map { TimelineObjectWarnFilter(it.filter.id, it.matchedKeyword) }
|
warnFilters = filterResults.map { TimelineObjectWarnFilter(it.filter.id, it.matchedKeyword) }
|
||||||
|
|
|
@ -1,7 +1,15 @@
|
||||||
package dev.usbharu.hideout.core.external.timeline
|
package dev.usbharu.hideout.core.external.timeline
|
||||||
|
|
||||||
import dev.usbharu.hideout.core.domain.model.post.Post
|
import dev.usbharu.hideout.core.domain.model.post.Post
|
||||||
|
import dev.usbharu.hideout.core.domain.model.timeline.Timeline
|
||||||
|
import dev.usbharu.hideout.core.domain.model.timelinerelationship.TimelineRelationship
|
||||||
|
|
||||||
interface TimelineStore {
|
interface TimelineStore {
|
||||||
suspend fun newPost(post: Post)
|
suspend fun addPost(post: Post)
|
||||||
|
suspend fun updatePost(post: Post)
|
||||||
|
suspend fun removePost(post: Post)
|
||||||
|
suspend fun addTimelineRelationship(timelineRelationship: TimelineRelationship)
|
||||||
|
suspend fun removeTimelineRelationship(timelineRelationship: TimelineRelationship)
|
||||||
|
suspend fun addTimeline(timeline: Timeline, timelineRelationshipList: List<TimelineRelationship>)
|
||||||
|
suspend fun removeTimeline(timeline: Timeline)
|
||||||
}
|
}
|
|
@ -8,12 +8,13 @@ import dev.usbharu.hideout.core.domain.model.post.PostId
|
||||||
import dev.usbharu.hideout.core.domain.model.timeline.Timeline
|
import dev.usbharu.hideout.core.domain.model.timeline.Timeline
|
||||||
import dev.usbharu.hideout.core.domain.model.timelineobject.TimelineObject
|
import dev.usbharu.hideout.core.domain.model.timelineobject.TimelineObject
|
||||||
import dev.usbharu.hideout.core.domain.model.timelineobject.TimelineObjectId
|
import dev.usbharu.hideout.core.domain.model.timelineobject.TimelineObjectId
|
||||||
|
import dev.usbharu.hideout.core.domain.model.timelinerelationship.TimelineRelationship
|
||||||
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
|
import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailId
|
||||||
import dev.usbharu.hideout.core.domain.shared.id.IdGenerateService
|
import dev.usbharu.hideout.core.domain.shared.id.IdGenerateService
|
||||||
import dev.usbharu.hideout.core.external.timeline.TimelineStore
|
import dev.usbharu.hideout.core.external.timeline.TimelineStore
|
||||||
|
|
||||||
abstract class AbstractTimelineStore(private val idGenerateService: IdGenerateService) : TimelineStore {
|
abstract class AbstractTimelineStore(private val idGenerateService: IdGenerateService) : TimelineStore {
|
||||||
override suspend fun newPost(post: Post) {
|
override suspend fun addPost(post: Post) {
|
||||||
val timelineList = getTimeline(post.actorId)
|
val timelineList = getTimeline(post.actorId)
|
||||||
|
|
||||||
val repost = post.repostId?.let { getPost(it) }
|
val repost = post.repostId?.let { getPost(it) }
|
||||||
|
@ -57,4 +58,44 @@ abstract class AbstractTimelineStore(private val idGenerateService: IdGenerateSe
|
||||||
protected abstract suspend fun getPost(postId: PostId): Post?
|
protected abstract suspend fun getPost(postId: PostId): Post?
|
||||||
|
|
||||||
protected abstract suspend fun insertTimelineObject(timelineObjectList: List<TimelineObject>)
|
protected abstract suspend fun insertTimelineObject(timelineObjectList: List<TimelineObject>)
|
||||||
|
|
||||||
|
protected abstract suspend fun getTimelineObjectByPostId(postId: PostId): List<TimelineObject>
|
||||||
|
|
||||||
|
protected abstract suspend fun removeTimelineObject(postId: PostId)
|
||||||
|
|
||||||
|
override suspend fun updatePost(post: Post) {
|
||||||
|
|
||||||
|
|
||||||
|
val timelineObjectByPostId = getTimelineObjectByPostId(post.id)
|
||||||
|
|
||||||
|
val repost = post.repostId?.let { getPost(it) }
|
||||||
|
|
||||||
|
if (repost != null) {
|
||||||
|
timelineObjectByPostId.map {
|
||||||
|
val filters = getFilters(it.userDetailId)
|
||||||
|
val applyFilters = applyFilters(post, filters)
|
||||||
|
it.updateWith(post, repost, applyFilters.filterResults)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun removePost(post: Post) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun addTimelineRelationship(timelineRelationship: TimelineRelationship) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun removeTimelineRelationship(timelineRelationship: TimelineRelationship) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun addTimeline(timeline: Timeline, timelineRelationshipList: List<TimelineRelationship>) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun removeTimeline(timeline: Timeline) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue