From fdc14444b633575a122e6f8f43db6171876fbde3 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Sat, 21 Oct 2023 16:07:58 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8A=95=E7=A8=BF=E3=81=AEURL=E3=81=A7?= =?UTF-8?q?=E5=8F=96=E5=BE=97=E3=81=A7=E3=81=8D=E3=82=8BNote=E3=81=AE?= =?UTF-8?q?=E6=83=85=E5=A0=B1=E3=82=92=E6=AD=A3=E7=A2=BA=E3=81=AB=E8=A1=A8?= =?UTF-8?q?=E3=81=99=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/activitypub/NoteQueryServiceImpl.kt | 57 ++++++++++++++----- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/dev/usbharu/hideout/query/activitypub/NoteQueryServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/query/activitypub/NoteQueryServiceImpl.kt index 4978b9f4..93992395 100644 --- a/src/main/kotlin/dev/usbharu/hideout/query/activitypub/NoteQueryServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/query/activitypub/NoteQueryServiceImpl.kt @@ -1,38 +1,69 @@ package dev.usbharu.hideout.query.activitypub +import dev.usbharu.hideout.domain.model.ap.Document import dev.usbharu.hideout.domain.model.ap.Note import dev.usbharu.hideout.domain.model.hideout.entity.Post -import dev.usbharu.hideout.exception.FailedToGetResourcesException -import dev.usbharu.hideout.repository.Posts -import dev.usbharu.hideout.repository.Users -import dev.usbharu.hideout.repository.toPost -import dev.usbharu.hideout.util.singleOr +import dev.usbharu.hideout.domain.model.hideout.entity.Visibility +import dev.usbharu.hideout.repository.* +import dev.usbharu.hideout.service.ap.APNoteServiceImpl.Companion.public +import org.jetbrains.exposed.sql.Query import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.select import org.springframework.stereotype.Repository import java.time.Instant @Repository -class NoteQueryServiceImpl : NoteQueryService { +class NoteQueryServiceImpl(private val postRepository: PostRepository) : NoteQueryService { override suspend fun findById(id: Long): Pair { return Posts .leftJoin(Users) + .leftJoin(PostsMedia) + .leftJoin(Media) .select { Posts.id eq id } - .singleOr { FailedToGetResourcesException("id $id is duplicate or does not exist.") } - .let { it.toNote() to it.toPost() } + .let { it.toNote() to it.toPost().first() } + } - private fun ResultRow.toNote(): Note { + private suspend fun ResultRow.toNote(mediaList: List): Note { + val replyId = this[Posts.replyId] + val replyTo = if (replyId != null) { + postRepository.findById(replyId).url + } else { + null + } + + val visibility1 = + visibility( + Visibility.values().first { visibility -> visibility.ordinal == this[Posts.visibility] }, + this[Users.followers] + ) return Note( name = "Post", id = this[Posts.apId], attributedTo = this[Users.url], content = this[Posts.text], published = Instant.ofEpochMilli(this[Posts.createdAt]).toString(), - to = listOf(), - cc = listOf(), - inReplyTo = null, - sensitive = false + to = visibility1.first, + cc = visibility1.second, + inReplyTo = replyTo, + sensitive = this[Posts.sensitive], + attachment = mediaList.map { Document(url = it.url, mediaType = "image/jpeg") } ) } + + private suspend fun Query.toNote(): Note { + return this.groupBy { it[Posts.id] } + .map { it.value } + .map { it.first().toNote(it.mapNotNull { it.toMediaOrNull() }) } + .first() + } + + private fun visibility(visibility: Visibility, followers: String?): Pair, List> { + return when (visibility) { + Visibility.PUBLIC -> listOf(public) to listOf(public) + Visibility.UNLISTED -> listOfNotNull(followers) to listOf(public) + Visibility.FOLLOWERS -> listOfNotNull(followers) to listOfNotNull(followers) + Visibility.DIRECT -> TODO() + } + } }