feat: Followを受け取ったときの処理を追加

This commit is contained in:
usbharu 2023-04-09 23:05:06 +09:00
parent 7eed0e270d
commit 4b0484df64
9 changed files with 70 additions and 17 deletions

View File

@ -12,12 +12,11 @@ import dev.usbharu.hideout.repository.UserAuthRepository
import dev.usbharu.hideout.repository.UserRepository import dev.usbharu.hideout.repository.UserRepository
import dev.usbharu.hideout.routing.register import dev.usbharu.hideout.routing.register
import dev.usbharu.hideout.service.IUserAuthService import dev.usbharu.hideout.service.IUserAuthService
import dev.usbharu.hideout.service.activitypub.ActivityPubService import dev.usbharu.hideout.service.activitypub.*
import dev.usbharu.hideout.service.activitypub.ActivityPubServiceImpl
import dev.usbharu.hideout.service.activitypub.ActivityPubUserService
import dev.usbharu.hideout.service.activitypub.ActivityPubUserServiceImpl
import dev.usbharu.hideout.service.impl.UserAuthService import dev.usbharu.hideout.service.impl.UserAuthService
import dev.usbharu.hideout.service.impl.UserService import dev.usbharu.hideout.service.impl.UserService
import dev.usbharu.hideout.service.job.JobQueueService
import dev.usbharu.hideout.service.job.KJobJobQueueService
import dev.usbharu.hideout.service.signature.HttpSignatureVerifyService import dev.usbharu.hideout.service.signature.HttpSignatureVerifyService
import dev.usbharu.hideout.service.signature.HttpSignatureVerifyServiceImpl import dev.usbharu.hideout.service.signature.HttpSignatureVerifyServiceImpl
import io.ktor.server.application.* import io.ktor.server.application.*
@ -55,7 +54,12 @@ fun Application.module() {
single<IUserAuthRepository> { UserAuthRepository(get()) } single<IUserAuthRepository> { UserAuthRepository(get()) }
single<IUserAuthService> { UserAuthService(get(), get()) } single<IUserAuthService> { UserAuthService(get(), get()) }
single<HttpSignatureVerifyService> { HttpSignatureVerifyServiceImpl(get()) } single<HttpSignatureVerifyService> { HttpSignatureVerifyServiceImpl(get()) }
single<ActivityPubService> { ActivityPubServiceImpl() } single<JobQueueService> { val kJobJobQueueService = KJobJobQueueService(get())
kJobJobQueueService.init(listOf())
kJobJobQueueService
}
single<ActivityPubFollowService>{ ActivityPubFollowServiceImpl(get()) }
single<ActivityPubService> { ActivityPubServiceImpl(get()) }
single<UserService> { UserService(get()) } single<UserService> { UserService(get()) }
single<ActivityPubUserService> { ActivityPubUserServiceImpl(get(), get()) } single<ActivityPubUserService> { ActivityPubUserServiceImpl(get(), get()) }
} }

View File

@ -1,11 +1,24 @@
package dev.usbharu.hideout.domain.model package dev.usbharu.hideout.domain.model
import dev.usbharu.hideout.ap.JsonLd import dev.usbharu.hideout.ap.JsonLd
import dev.usbharu.hideout.util.HttpUtil.Activity
import io.ktor.http.* import io.ktor.http.*
sealed class ActivityPubResponse(val httpStatusCode: HttpStatusCode) sealed class ActivityPubResponse(
class ActivityPubStringResponse(httpStatusCode: HttpStatusCode, val message: String) : val httpStatusCode: HttpStatusCode,
ActivityPubResponse(httpStatusCode) val contentType: ContentType = ContentType.Application.Activity
)
class ActivityPubObjectResponse(httpStatusCode: HttpStatusCode, val message: JsonLd) : class ActivityPubStringResponse(
ActivityPubResponse(httpStatusCode) httpStatusCode: HttpStatusCode,
val message: String,
contentType: ContentType = ContentType.Application.Activity
) :
ActivityPubResponse(httpStatusCode, contentType)
class ActivityPubObjectResponse(
httpStatusCode: HttpStatusCode,
val message: JsonLd,
contentType: ContentType = ContentType.Application.Activity
) :
ActivityPubResponse(httpStatusCode, contentType)

View File

@ -0,0 +1,5 @@
package dev.usbharu.hideout.domain.model.job
import kjob.core.Job
object AcceptFollowJob : Job("AcceptFollowJob")

View File

@ -0,0 +1,8 @@
package dev.usbharu.hideout.service.activitypub
import dev.usbharu.hideout.ap.Follow
import dev.usbharu.hideout.domain.model.ActivityPubResponse
interface ActivityPubFollowService {
suspend fun receiveFollow(follow:Follow):ActivityPubResponse
}

View File

@ -0,0 +1,16 @@
package dev.usbharu.hideout.service.activitypub
import dev.usbharu.hideout.ap.Follow
import dev.usbharu.hideout.domain.model.ActivityPubResponse
import dev.usbharu.hideout.domain.model.ActivityPubStringResponse
import dev.usbharu.hideout.domain.model.job.AcceptFollowJob
import dev.usbharu.hideout.service.job.JobQueueService
import io.ktor.http.*
class ActivityPubFollowServiceImpl(private val jobQueueService: JobQueueService) : ActivityPubFollowService {
override suspend fun receiveFollow(follow: Follow): ActivityPubResponse {
// TODO: Verify HTTP Signature
jobQueueService.schedule(AcceptFollowJob)
return ActivityPubStringResponse(HttpStatusCode.OK,"{}",ContentType.Application.Json)
}
}

View File

@ -5,7 +5,7 @@ import dev.usbharu.hideout.domain.model.ActivityPubResponse
interface ActivityPubService { interface ActivityPubService {
fun parseActivity(json:String): ActivityType fun parseActivity(json:String): ActivityType
fun processActivity(json:String, type: ActivityType): ActivityPubResponse? suspend fun processActivity(json:String, type: ActivityType): ActivityPubResponse?
} }
enum class ActivityType { enum class ActivityType {

View File

@ -1,11 +1,12 @@
package dev.usbharu.hideout.service.activitypub package dev.usbharu.hideout.service.activitypub
import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.JsonNode
import dev.usbharu.hideout.ap.Follow
import dev.usbharu.hideout.config.Config import dev.usbharu.hideout.config.Config
import dev.usbharu.hideout.domain.model.ActivityPubResponse import dev.usbharu.hideout.domain.model.ActivityPubResponse
import dev.usbharu.hideout.exception.JsonParseException import dev.usbharu.hideout.exception.JsonParseException
class ActivityPubServiceImpl : ActivityPubService { class ActivityPubServiceImpl(private val activityPubFollowService: ActivityPubFollowService) : ActivityPubService {
override fun parseActivity(json: String): ActivityType { override fun parseActivity(json: String): ActivityType {
val readTree = Config.configData.objectMapper.readTree(json) val readTree = Config.configData.objectMapper.readTree(json)
if (readTree.isObject.not()) { if (readTree.isObject.not()) {
@ -20,8 +21,8 @@ class ActivityPubServiceImpl : ActivityPubService {
return ActivityType.values().first { it.name.equals(type.asText(), true) } return ActivityType.values().first { it.name.equals(type.asText(), true) }
} }
override fun processActivity(json: String, type: ActivityType): ActivityPubResponse? { override suspend fun processActivity(json: String, type: ActivityType): ActivityPubResponse? {
when (type) { return when (type) {
ActivityType.Accept -> TODO() ActivityType.Accept -> TODO()
ActivityType.Add -> TODO() ActivityType.Add -> TODO()
ActivityType.Announce -> TODO() ActivityType.Announce -> TODO()
@ -31,7 +32,13 @@ class ActivityPubServiceImpl : ActivityPubService {
ActivityType.Delete -> TODO() ActivityType.Delete -> TODO()
ActivityType.Dislike -> TODO() ActivityType.Dislike -> TODO()
ActivityType.Flag -> TODO() ActivityType.Flag -> TODO()
ActivityType.Follow -> TODO() ActivityType.Follow -> activityPubFollowService.receiveFollow(
Config.configData.objectMapper.readValue(
json,
Follow::class.java
)
)
ActivityType.Ignore -> TODO() ActivityType.Ignore -> TODO()
ActivityType.Invite -> TODO() ActivityType.Invite -> TODO()
ActivityType.Join -> TODO() ActivityType.Join -> TODO()

View File

@ -6,5 +6,5 @@ import kjob.core.dsl.ScheduleContext
interface JobQueueService { interface JobQueueService {
fun init(jobDefines:List<Job>) fun init(jobDefines:List<Job>)
suspend fun <J : Job> schedule(job: J, block: ScheduleContext<J>.(J) -> Unit) suspend fun <J : Job> schedule(job: J, block: ScheduleContext<J>.(J) -> Unit = {})
} }

View File

@ -74,7 +74,7 @@ class UsersAPTest {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun processActivity(json: String, type: ActivityType): ActivityPubResponse? { override suspend fun processActivity(json: String, type: ActivityType): ActivityPubResponse? {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
}, UserService(object : IUserRepository { }, UserService(object : IUserRepository {