From c92e15f2208e813b522b5796eed42b378d91380c Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 13 Dec 2023 16:45:14 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=E3=82=A2=E3=82=AB=E3=82=A6=E3=83=B3?= =?UTF-8?q?=E3=83=88=E5=89=8A=E9=99=A4=E3=82=92=E3=81=99=E3=82=8B=E3=81=93?= =?UTF-8?q?=E3=81=A8=E3=81=8C=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/delete/APSendDeleteService.kt | 22 ++++++++++++++ .../exposedquery/PostQueryServiceImpl.kt | 4 +++ .../hideout/core/query/PostQueryService.kt | 1 + .../hideout/core/service/post/PostService.kt | 1 + .../core/service/post/PostServiceImpl.kt | 4 +++ .../core/service/user/UserServiceImpl.kt | 30 +++++++++++++++++-- 6 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/delete/APSendDeleteService.kt b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/delete/APSendDeleteService.kt index 2cb0f86c..00aab8db 100644 --- a/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/delete/APSendDeleteService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/activitypub/service/activity/delete/APSendDeleteService.kt @@ -2,7 +2,9 @@ package dev.usbharu.hideout.activitypub.service.activity.delete import dev.usbharu.hideout.activitypub.domain.model.Delete import dev.usbharu.hideout.activitypub.domain.model.Tombstone +import dev.usbharu.hideout.activitypub.domain.model.objects.ObjectValue import dev.usbharu.hideout.application.config.ApplicationConfig +import dev.usbharu.hideout.core.domain.model.actor.Actor import dev.usbharu.hideout.core.domain.model.post.Post import dev.usbharu.hideout.core.external.job.DeliverDeleteJob import dev.usbharu.hideout.core.external.job.DeliverDeleteJobParam @@ -14,6 +16,7 @@ import java.time.Instant interface APSendDeleteService { suspend fun sendDeleteNote(deletedPost: Post) + suspend fun sendDeleteActor(deletedActor: Actor) } @Service @@ -47,4 +50,23 @@ class APSendDeleteServiceImpl( } } + override suspend fun sendDeleteActor(deletedActor: Actor) { + val followers = followerQueryService.findFollowersById(deletedActor.id) + + val delete = Delete( + actor = deletedActor.url, + `object` = ObjectValue(emptyList(), `object` = deletedActor.url), + id = "${applicationConfig.url}/delete/actor/${deletedActor.id}", + published = Instant.now().toString() + ) + + followers.forEach { + DeliverDeleteJobParam( + delete = delete, + it.inbox, + deletedActor.id + ) + } + } + } diff --git a/src/main/kotlin/dev/usbharu/hideout/core/infrastructure/exposedquery/PostQueryServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/core/infrastructure/exposedquery/PostQueryServiceImpl.kt index e4b45ef0..9d76ae02 100644 --- a/src/main/kotlin/dev/usbharu/hideout/core/infrastructure/exposedquery/PostQueryServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/core/infrastructure/exposedquery/PostQueryServiceImpl.kt @@ -33,4 +33,8 @@ class PostQueryServiceImpl( .select { Posts.apId eq string } .let(postQueryMapper::map) .singleOr { FailedToGetResourcesException("apId: $string is duplicate or does not exist.", it) } + + override suspend fun findByActorId(actorId: Long): List { + return Posts.leftJoin(PostsMedia).select { Posts.actorId eq actorId }.let(postQueryMapper::map) + } } diff --git a/src/main/kotlin/dev/usbharu/hideout/core/query/PostQueryService.kt b/src/main/kotlin/dev/usbharu/hideout/core/query/PostQueryService.kt index 415db265..64999e89 100644 --- a/src/main/kotlin/dev/usbharu/hideout/core/query/PostQueryService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/core/query/PostQueryService.kt @@ -8,4 +8,5 @@ interface PostQueryService { suspend fun findById(id: Long): Post suspend fun findByUrl(url: String): Post suspend fun findByApId(string: String): Post + suspend fun findByActorId(actorId: Long): List } diff --git a/src/main/kotlin/dev/usbharu/hideout/core/service/post/PostService.kt b/src/main/kotlin/dev/usbharu/hideout/core/service/post/PostService.kt index a20f0a66..2c6d5307 100644 --- a/src/main/kotlin/dev/usbharu/hideout/core/service/post/PostService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/core/service/post/PostService.kt @@ -9,4 +9,5 @@ interface PostService { suspend fun createRemote(post: Post): Post suspend fun deleteLocal(post: Post) suspend fun deleteRemote(post: Post) + suspend fun deleteByActor(actorId: Long) } diff --git a/src/main/kotlin/dev/usbharu/hideout/core/service/post/PostServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/core/service/post/PostServiceImpl.kt index 4a0a7cff..54a4ae1b 100644 --- a/src/main/kotlin/dev/usbharu/hideout/core/service/post/PostServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/core/service/post/PostServiceImpl.kt @@ -56,6 +56,10 @@ class PostServiceImpl( postRepository.save(post.delete()) } + override suspend fun deleteByActor(actorId: Long) { + postQueryService.findByActorId(actorId).filterNot { it.delted }.forEach { postRepository.save(it.delete()) } + } + private suspend fun internalCreate(post: Post, isLocal: Boolean): Post { return try { if (postRepository.save(post)) { diff --git a/src/main/kotlin/dev/usbharu/hideout/core/service/user/UserServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/core/service/user/UserServiceImpl.kt index 988cac62..a49e58b5 100644 --- a/src/main/kotlin/dev/usbharu/hideout/core/service/user/UserServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/core/service/user/UserServiceImpl.kt @@ -1,5 +1,6 @@ package dev.usbharu.hideout.core.service.user +import dev.usbharu.hideout.activitypub.service.activity.delete.APSendDeleteService import dev.usbharu.hideout.application.config.ApplicationConfig import dev.usbharu.hideout.core.domain.exception.FailedToGetResourcesException import dev.usbharu.hideout.core.domain.model.actor.Actor @@ -13,6 +14,7 @@ import dev.usbharu.hideout.core.domain.model.userdetails.UserDetailRepository import dev.usbharu.hideout.core.query.ActorQueryService import dev.usbharu.hideout.core.query.DeletedActorQueryService import dev.usbharu.hideout.core.service.instance.InstanceService +import dev.usbharu.hideout.core.service.post.PostService import org.jetbrains.exposed.exceptions.ExposedSQLException import org.slf4j.LoggerFactory import org.springframework.stereotype.Service @@ -31,7 +33,9 @@ class UserServiceImpl( private val deletedActorRepository: DeletedActorRepository, private val deletedActorQueryService: DeletedActorQueryService, private val reactionRepository: ReactionRepository, - private val relationshipRepository: RelationshipRepository + private val relationshipRepository: RelationshipRepository, + private val postService: PostService, + private val apSendDeleteService: APSendDeleteService ) : UserService { @@ -149,11 +153,33 @@ class UserServiceImpl( reactionRepository.deleteByActorId(actorId) + postService.deleteByActor(actorId) + + actorRepository.delete(actor.id) deletedActorRepository.save(deletedActor) } override suspend fun deleteLocalUser(userId: Long) { - TODO("Not yet implemented") + val actor = actorQueryService.findById(userId) + apSendDeleteService.sendDeleteActor(actor) + val deletedActor = DeletedActor( + actor.id, + actor.name, + actor.domain, + actor.publicKey, + Instant.now() + ) + relationshipRepository.deleteByActorIdOrTargetActorId(userId, userId) + + reactionRepository.deleteByActorId(actor.id) + + postService.deleteByActor(actor.id) + actorRepository.delete(actor.id) + val userDetail = + userDetailRepository.findByActorId(actor.id) ?: throw IllegalStateException("user detail not found.") + userDetailRepository.delete(userDetail) + deletedActorRepository.save(deletedActor) + } companion object {