From 6dead7462e3b5ac285e753b8c001935612aa4d4d Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Sun, 10 Dec 2023 17:43:46 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=AE=E3=81=AE=E5=AE=9F=E8=A3=85?= =?UTF-8?q?=E3=82=92=E3=81=A1=E3=82=83=E3=82=93=E3=81=A8=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activitypub/domain/model/Accept.kt | 16 ++----- .../activity/accept/ApSendAcceptService.kt | 28 +++++++++-- .../activity/reject/ApSendRejectService.kt | 2 +- .../reject/ApSendRejectServiceImpl.kt | 27 +++++++++-- .../activity/undo/APSendUndoServiceImpl.kt | 47 +++++++++++++++++-- .../core/external/job/DeliverAcceptJob.kt | 36 ++++++++++++++ .../core/external/job/DeliverRejectJob.kt | 36 ++++++++++++++ .../core/external/job/DeliverUndoJob.kt | 38 +++++++++++++++ .../relationship/RelationshipServiceImpl.kt | 4 +- .../hideout/ap/ContextSerializerTest.kt | 1 - .../RelationshipServiceImplTest.kt | 14 +++--- 11 files changed, 217 insertions(+), 32 deletions(-) create mode 100644 src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverAcceptJob.kt create mode 100644 src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverRejectJob.kt create mode 100644 src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverUndoJob.kt diff --git a/src/main/kotlin/dev/usbharu/hideout/activitypub/domain/model/Accept.kt b/src/main/kotlin/dev/usbharu/hideout/activitypub/domain/model/Accept.kt index 2cd730db..13f6a31d 100644 --- a/src/main/kotlin/dev/usbharu/hideout/activitypub/domain/model/Accept.kt +++ b/src/main/kotlin/dev/usbharu/hideout/activitypub/domain/model/Accept.kt @@ -8,7 +8,6 @@ import dev.usbharu.hideout.activitypub.domain.model.objects.ObjectDeserializer open class Accept @JsonCreator constructor( type: List = emptyList(), - override val name: String, @JsonDeserialize(using = ObjectDeserializer::class) @JsonProperty("object") val apObject: Object, @@ -16,9 +15,7 @@ open class Accept @JsonCreator constructor( ) : Object( type = add(type, "Accept") ), - HasActor, - HasName { - + HasActor { override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false @@ -26,7 +23,6 @@ open class Accept @JsonCreator constructor( other as Accept - if (name != other.name) return false if (apObject != other.apObject) return false if (actor != other.actor) return false @@ -35,7 +31,6 @@ open class Accept @JsonCreator constructor( override fun hashCode(): Int { var result = super.hashCode() - result = 31 * result + name.hashCode() result = 31 * result + apObject.hashCode() result = 31 * result + actor.hashCode() return result @@ -43,10 +38,9 @@ open class Accept @JsonCreator constructor( override fun toString(): String { return "Accept(" + - "name='$name', " + - "apObject=$apObject, " + - "actor='$actor'" + - ")" + - " ${super.toString()}" + "apObject=$apObject, " + + "actor='$actor'" + + ")" + + " ${super.toString()}" } } diff --git a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/accept/ApSendAcceptService.kt b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/accept/ApSendAcceptService.kt index 59f4f4ec..573e7104 100644 --- a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/accept/ApSendAcceptService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/accept/ApSendAcceptService.kt @@ -1,16 +1,36 @@ package dev.usbharu.hideout.activitypub.service.activity.accept +import dev.usbharu.hideout.activitypub.domain.model.Accept +import dev.usbharu.hideout.activitypub.domain.model.Follow import dev.usbharu.hideout.core.domain.model.user.User +import dev.usbharu.hideout.core.external.job.DeliverAcceptJob +import dev.usbharu.hideout.core.external.job.DeliverAcceptJobParam +import dev.usbharu.hideout.core.service.job.JobQueueParentService import org.springframework.stereotype.Service interface ApSendAcceptService { - suspend fun sendAccept(user: User, target: User) + suspend fun sendAcceptFollow(user: User, target: User) } @Service -class ApSendAcceptServiceImpl : ApSendAcceptService { - override suspend fun sendAccept(user: User, target: User) { - TODO("Not yet implemented") +class ApSendAcceptServiceImpl( + private val jobQueueParentService: JobQueueParentService, + private val deliverAcceptJob: DeliverAcceptJob +) : ApSendAcceptService { + override suspend fun sendAcceptFollow(user: User, target: User) { + val deliverAcceptJobParam = DeliverAcceptJobParam( + Accept( + apObject = Follow( + apObject = target.url, + actor = user.url + ), + actor = user.url + ), + target.inbox, + user.id + ) + + jobQueueParentService.scheduleTypeSafe(deliverAcceptJob, deliverAcceptJobParam) } } diff --git a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/reject/ApSendRejectService.kt b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/reject/ApSendRejectService.kt index 29c66e28..ecb675c2 100644 --- a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/reject/ApSendRejectService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/reject/ApSendRejectService.kt @@ -3,5 +3,5 @@ package dev.usbharu.hideout.activitypub.service.activity.reject import dev.usbharu.hideout.core.domain.model.user.User interface ApSendRejectService { - suspend fun sendReject(user: User, target: User) + suspend fun sendRejectFollow(user: User, target: User) } diff --git a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/reject/ApSendRejectServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/reject/ApSendRejectServiceImpl.kt index 383d1e38..ded3c2a5 100644 --- a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/reject/ApSendRejectServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/reject/ApSendRejectServiceImpl.kt @@ -1,11 +1,32 @@ package dev.usbharu.hideout.activitypub.service.activity.reject +import dev.usbharu.hideout.activitypub.domain.model.Follow +import dev.usbharu.hideout.activitypub.domain.model.Reject +import dev.usbharu.hideout.application.config.ApplicationConfig import dev.usbharu.hideout.core.domain.model.user.User +import dev.usbharu.hideout.core.external.job.DeliverRejectJob +import dev.usbharu.hideout.core.external.job.DeliverRejectJobParam +import dev.usbharu.hideout.core.service.job.JobQueueParentService import org.springframework.stereotype.Service @Service -class ApSendRejectServiceImpl : ApSendRejectService { - override suspend fun sendReject(user: User, target: User) { - TODO("Not yet implemented") +class ApSendRejectServiceImpl( + private val applicationConfig: ApplicationConfig, + private val jobQueueParentService: JobQueueParentService, + private val deliverRejectJob: DeliverRejectJob +) : ApSendRejectService { + override suspend fun sendRejectFollow(user: User, target: User) { + + val deliverRejectJobParam = DeliverRejectJobParam( + Reject( + user.url, + "${applicationConfig.url}/reject/${user.id}/${target.id}", + Follow(apObject = user.url, actor = target.url) + ), + target.inbox, + user.id + ) + + jobQueueParentService.scheduleTypeSafe(deliverRejectJob, deliverRejectJobParam) } } diff --git a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/undo/APSendUndoServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/undo/APSendUndoServiceImpl.kt index bd48ba1b..3945cc5a 100644 --- a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/undo/APSendUndoServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/undo/APSendUndoServiceImpl.kt @@ -1,15 +1,56 @@ package dev.usbharu.hideout.activitypub.service.activity.undo +import dev.usbharu.hideout.activitypub.domain.model.Block +import dev.usbharu.hideout.activitypub.domain.model.Follow +import dev.usbharu.hideout.activitypub.domain.model.Undo +import dev.usbharu.hideout.application.config.ApplicationConfig import dev.usbharu.hideout.core.domain.model.user.User +import dev.usbharu.hideout.core.external.job.DeliverUndoJob +import dev.usbharu.hideout.core.external.job.DeliverUndoJobParam +import dev.usbharu.hideout.core.service.job.JobQueueParentService import org.springframework.stereotype.Service +import java.time.Instant @Service -class APSendUndoServiceImpl : APSendUndoService { +class APSendUndoServiceImpl( + private val jobQueueParentService: JobQueueParentService, + private val deliverUndoJob: DeliverUndoJob, + private val applicationConfig: ApplicationConfig +) : APSendUndoService { override suspend fun sendUndoFollow(user: User, target: User) { - TODO("Not yet implemented") + val deliverUndoJobParam = DeliverUndoJobParam( + Undo( + actor = user.url, + id = "${applicationConfig.url}/undo/follow/${user.id}/${target.url}", + `object` = Follow( + apObject = user.url, + actor = target.url + ), + published = Instant.now().toString() + ), + target.inbox, + user.id + ) + + jobQueueParentService.scheduleTypeSafe(deliverUndoJob, deliverUndoJobParam) } override suspend fun sendUndoBlock(user: User, target: User) { - TODO("Not yet implemented") + val deliverUndoJobParam = DeliverUndoJobParam( + Undo( + actor = user.url, + id = "${applicationConfig.url}/undo/block/${user.id}/${target.url}", + `object` = Block( + apObject = user.url, + actor = target.url, + id = "${applicationConfig.url}/block/${user.id}/${target.id}" + ), + published = Instant.now().toString() + ), + target.inbox, + user.id + ) + + jobQueueParentService.scheduleTypeSafe(deliverUndoJob, deliverUndoJobParam) } } diff --git a/src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverAcceptJob.kt b/src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverAcceptJob.kt new file mode 100644 index 00000000..ad002175 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverAcceptJob.kt @@ -0,0 +1,36 @@ +package dev.usbharu.hideout.core.external.job + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import dev.usbharu.hideout.activitypub.domain.model.Accept +import kjob.core.dsl.ScheduleContext +import kjob.core.job.JobProps +import org.springframework.stereotype.Component + +data class DeliverAcceptJobParam( + val accept: Accept, + val inbox: String, + val signer: Long +) + +@Component +class DeliverAcceptJob(private val objectMapper: ObjectMapper) : HideoutJob() { + + val accept = string("accept") + val inbox = string("inbox") + val signer = long("signer") + + override fun convert(value: DeliverAcceptJobParam): ScheduleContext.(DeliverAcceptJob) -> Unit = { + props[accept] = objectMapper.writeValueAsString(value.accept) + props[inbox] = value.inbox + props[signer] = value.signer + } + + override fun convert(props: JobProps): DeliverAcceptJobParam { + return DeliverAcceptJobParam( + objectMapper.readValue(props[accept]), + props[inbox], + props[signer] + ) + } +} diff --git a/src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverRejectJob.kt b/src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverRejectJob.kt new file mode 100644 index 00000000..9f923534 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverRejectJob.kt @@ -0,0 +1,36 @@ +package dev.usbharu.hideout.core.external.job + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import dev.usbharu.hideout.activitypub.domain.model.Reject +import kjob.core.dsl.ScheduleContext +import kjob.core.job.JobProps +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.stereotype.Component + +data class DeliverRejectJobParam( + val reject: Reject, + val inbox: String, + val signer: Long +) + +@Component +class DeliverRejectJob(@Qualifier("activitypub") private val objectMapper: ObjectMapper) : + HideoutJob() { + val reject = string("reject") + val inbox = string("inbox") + val signer = long("signer") + + override fun convert(value: DeliverRejectJobParam): ScheduleContext.(DeliverRejectJob) -> Unit = + { + props[reject] = objectMapper.writeValueAsString(value.reject) + props[inbox] = value.inbox + props[signer] = value.signer + } + + override fun convert(props: JobProps): DeliverRejectJobParam = DeliverRejectJobParam( + objectMapper.readValue(props[reject]), + props[inbox], + props[signer] + ) +} diff --git a/src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverUndoJob.kt b/src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverUndoJob.kt new file mode 100644 index 00000000..b8ad9088 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/core/external/job/DeliverUndoJob.kt @@ -0,0 +1,38 @@ +package dev.usbharu.hideout.core.external.job + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.readValue +import dev.usbharu.hideout.activitypub.domain.model.Undo +import kjob.core.dsl.ScheduleContext +import kjob.core.job.JobProps +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.stereotype.Component + +data class DeliverUndoJobParam( + val undo: Undo, + val inbox: String, + val signer: Long +) + +@Component +class DeliverUndoJob(@Qualifier("activitypub") private val objectMapper: ObjectMapper) : + HideoutJob() { + + val undo = string("undo") + val inbox = string("inbox") + val signer = long("signer") + + override fun convert(value: DeliverUndoJobParam): ScheduleContext.(DeliverUndoJob) -> Unit = { + props[undo] = objectMapper.writeValueAsString(value.undo) + props[inbox] = value.inbox + props[signer] = value.signer + } + + override fun convert(props: JobProps): DeliverUndoJobParam { + return DeliverUndoJobParam( + objectMapper.readValue(props[undo]), + props[inbox], + props[signer] + ) + } +} diff --git a/src/main/kotlin/dev/usbharu/hideout/core/service/relationship/RelationshipServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/core/service/relationship/RelationshipServiceImpl.kt index 9e3b98ce..aad49d6a 100644 --- a/src/main/kotlin/dev/usbharu/hideout/core/service/relationship/RelationshipServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/core/service/relationship/RelationshipServiceImpl.kt @@ -146,7 +146,7 @@ class RelationshipServiceImpl( if (remoteUser != null) { val user = userQueryService.findById(userId) - apSendAcceptService.sendAccept(user, remoteUser) + apSendAcceptService.sendAcceptFollow(user, remoteUser) } } @@ -171,7 +171,7 @@ class RelationshipServiceImpl( if (remoteUser != null) { val user = userQueryService.findById(userId) - apSendRejectService.sendReject(user, remoteUser) + apSendRejectService.sendRejectFollow(user, remoteUser) } } diff --git a/src/test/kotlin/dev/usbharu/hideout/ap/ContextSerializerTest.kt b/src/test/kotlin/dev/usbharu/hideout/ap/ContextSerializerTest.kt index a141c11b..1403b190 100644 --- a/src/test/kotlin/dev/usbharu/hideout/ap/ContextSerializerTest.kt +++ b/src/test/kotlin/dev/usbharu/hideout/ap/ContextSerializerTest.kt @@ -10,7 +10,6 @@ class ContextSerializerTest { @Test fun serialize() { val accept = Accept( - name = "aaa", actor = "bbb", apObject = Follow( apObject = "ddd", diff --git a/src/test/kotlin/dev/usbharu/hideout/core/service/relationship/RelationshipServiceImplTest.kt b/src/test/kotlin/dev/usbharu/hideout/core/service/relationship/RelationshipServiceImplTest.kt index 5f1d6141..cda067c5 100644 --- a/src/test/kotlin/dev/usbharu/hideout/core/service/relationship/RelationshipServiceImplTest.kt +++ b/src/test/kotlin/dev/usbharu/hideout/core/service/relationship/RelationshipServiceImplTest.kt @@ -172,7 +172,7 @@ class RelationshipServiceImplTest { ) ) - verify(apSendAcceptService, times(1)).sendAccept(eq(localUser), eq(remoteUser)) + verify(apSendAcceptService, times(1)).sendAcceptFollow(eq(localUser), eq(remoteUser)) verify(apSendFollowService, never()).sendFollow(any()) } @@ -284,7 +284,7 @@ class RelationshipServiceImplTest { ) ) - verify(apSendAcceptService, never()).sendAccept(any(), any()) + verify(apSendAcceptService, never()).sendAcceptFollow(any(), any()) } @Test @@ -322,14 +322,14 @@ class RelationshipServiceImplTest { ) ) - verify(apSendAcceptService, times(1)).sendAccept(eq(localUser), eq(remoteUser)) + verify(apSendAcceptService, times(1)).sendAcceptFollow(eq(localUser), eq(remoteUser)) } @Test fun `acceptFollowRequest Relationshipが存在しないときは何もしない`() = runTest { relationshipServiceImpl.acceptFollowRequest(1234, 5678, false) - verify(apSendAcceptService, never()).sendAccept(any(), any()) + verify(apSendAcceptService, never()).sendAcceptFollow(any(), any()) } @Test @@ -342,7 +342,7 @@ class RelationshipServiceImplTest { relationshipServiceImpl.acceptFollowRequest(1234, 5678, false) - verify(apSendAcceptService, never()).sendAccept(any(), any()) + verify(apSendAcceptService, never()).sendAcceptFollow(any(), any()) } @Test @@ -440,7 +440,7 @@ class RelationshipServiceImplTest { ) ) - verify(apSendRejectService, never()).sendReject(any(), any()) + verify(apSendRejectService, never()).sendRejectFollow(any(), any()) } @Test @@ -479,7 +479,7 @@ class RelationshipServiceImplTest { ) ) - verify(apSendRejectService, times(1)).sendReject(eq(localUser), eq(remoteUser)) + verify(apSendRejectService, times(1)).sendRejectFollow(eq(localUser), eq(remoteUser)) } @Test