mirror of https://github.com/usbharu/Hideout.git
fix: リフレクションを利用せずジョブの種類を分けれられるように
This commit is contained in:
parent
c20b5ce064
commit
a8b7372d54
|
@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature
|
|||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import dev.usbharu.hideout.config.Config
|
||||
import dev.usbharu.hideout.config.ConfigData
|
||||
import dev.usbharu.hideout.domain.model.job.ReceiveFollowJob
|
||||
import dev.usbharu.hideout.plugins.*
|
||||
import dev.usbharu.hideout.repository.IUserAuthRepository
|
||||
import dev.usbharu.hideout.repository.IUserRepository
|
||||
|
@ -19,10 +20,17 @@ import dev.usbharu.hideout.service.job.JobQueueParentService
|
|||
import dev.usbharu.hideout.service.job.KJobJobQueueParentService
|
||||
import dev.usbharu.hideout.service.signature.HttpSignatureVerifyService
|
||||
import dev.usbharu.hideout.service.signature.HttpSignatureVerifyServiceImpl
|
||||
import dev.usbharu.kjob.exposed.ExposedKJob
|
||||
import io.ktor.client.*
|
||||
import io.ktor.client.engine.cio.*
|
||||
import io.ktor.client.plugins.logging.*
|
||||
import io.ktor.server.application.*
|
||||
import kjob.core.Job
|
||||
import kjob.core.KJob
|
||||
import kjob.core.dsl.JobContextWithProps
|
||||
import kjob.core.dsl.JobRegisterContext
|
||||
import kjob.core.dsl.KJobFunctions
|
||||
import kjob.core.kjob
|
||||
import org.jetbrains.exposed.sql.Database
|
||||
import org.koin.ktor.ext.inject
|
||||
|
||||
|
@ -34,7 +42,7 @@ val Application.property: Application.(propertyName: String) -> String
|
|||
}
|
||||
|
||||
@Suppress("unused") // application.conf references the main function. This annotation prevents the IDE from marking it as unused.
|
||||
fun Application.module() {
|
||||
fun Application.parent() {
|
||||
|
||||
Config.configData = ConfigData(
|
||||
url = property("hideout.url"),
|
||||
|
@ -73,7 +81,7 @@ fun Application.module() {
|
|||
single<ActivityPubFollowService> { ActivityPubFollowServiceImpl(get(), get(), get()) }
|
||||
single<ActivityPubService> { ActivityPubServiceImpl(get()) }
|
||||
single<UserService> { UserService(get()) }
|
||||
single<ActivityPubUserService> { ActivityPubUserServiceImpl(get(), get(),get()) }
|
||||
single<ActivityPubUserService> { ActivityPubUserServiceImpl(get(), get(), get()) }
|
||||
}
|
||||
|
||||
|
||||
|
@ -90,3 +98,17 @@ fun Application.module() {
|
|||
inject<ActivityPubUserService>().value
|
||||
)
|
||||
}
|
||||
@Suppress("unused")
|
||||
fun Application.worker() {
|
||||
val kJob = kjob(ExposedKJob) {
|
||||
connectionDatabase = inject<Database>().value
|
||||
}.start()
|
||||
|
||||
val activityPubService = inject<ActivityPubService>().value
|
||||
|
||||
kJob.register(ReceiveFollowJob){
|
||||
execute {
|
||||
activityPubService.processActivity(this,it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,9 @@ package dev.usbharu.hideout.domain.model.job
|
|||
|
||||
import kjob.core.Job
|
||||
|
||||
object ReceiveFollowJob : Job("ReceiveFollowJob"){
|
||||
sealed class HideoutJob(name: String = "") : Job(name)
|
||||
|
||||
object ReceiveFollowJob : HideoutJob("ReceiveFollowJob"){
|
||||
val actor = string("actor")
|
||||
val follow = string("follow")
|
||||
val targetActor = string("targetActor")
|
|
@ -46,6 +46,7 @@ fun Routing.inbox(
|
|||
}
|
||||
val json = call.receiveText()
|
||||
val activityTypes = activityPubService.parseActivity(json)
|
||||
println(activityTypes)
|
||||
val response = activityPubService.processActivity(json, activityTypes)
|
||||
when (response) {
|
||||
is ActivityPubObjectResponse -> call.respond(response.httpStatusCode, Config.configData.objectMapper.writeValueAsString(response.message.apply { context =
|
||||
|
|
|
@ -2,7 +2,10 @@ 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.job.ReceiveFollowJob
|
||||
import kjob.core.job.JobProps
|
||||
|
||||
interface ActivityPubFollowService {
|
||||
suspend fun receiveFollow(follow:Follow):ActivityPubResponse
|
||||
suspend fun receiveFollowJob(props: JobProps<ReceiveFollowJob>)
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ class ActivityPubFollowServiceImpl(
|
|||
return ActivityPubStringResponse(HttpStatusCode.OK, "{}", ContentType.Application.Json)
|
||||
}
|
||||
|
||||
suspend fun receiveFollowJob(props: JobProps<ReceiveFollowJob>) {
|
||||
override suspend fun receiveFollowJob(props: JobProps<ReceiveFollowJob>) {
|
||||
val actor = props[ReceiveFollowJob.actor]
|
||||
val person = activityPubUserService.fetchPerson(actor)
|
||||
val follow = Config.configData.objectMapper.readValue<Follow>(props[ReceiveFollowJob.follow])
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
package dev.usbharu.hideout.service.activitypub
|
||||
|
||||
import dev.usbharu.hideout.domain.model.ActivityPubResponse
|
||||
import dev.usbharu.hideout.domain.model.job.HideoutJob
|
||||
import kjob.core.dsl.JobContextWithProps
|
||||
|
||||
interface ActivityPubService {
|
||||
fun parseActivity(json:String): ActivityType
|
||||
fun parseActivity(json: String): ActivityType
|
||||
|
||||
suspend fun processActivity(json:String, type: ActivityType): ActivityPubResponse?
|
||||
suspend fun processActivity(json: String, type: ActivityType): ActivityPubResponse?
|
||||
|
||||
suspend fun <T : HideoutJob> processActivity(job: JobContextWithProps<T>,hideoutJob: HideoutJob)
|
||||
}
|
||||
|
||||
enum class ActivityType {
|
||||
|
|
|
@ -4,7 +4,14 @@ import com.fasterxml.jackson.databind.JsonNode
|
|||
import dev.usbharu.hideout.ap.Follow
|
||||
import dev.usbharu.hideout.config.Config
|
||||
import dev.usbharu.hideout.domain.model.ActivityPubResponse
|
||||
import dev.usbharu.hideout.domain.model.job.HideoutJob
|
||||
import dev.usbharu.hideout.domain.model.job.ReceiveFollowJob
|
||||
import dev.usbharu.hideout.exception.JsonParseException
|
||||
import kjob.core.Job
|
||||
import kjob.core.dsl.JobContextWithProps
|
||||
import kjob.core.job.JobProps
|
||||
import kotlin.reflect.full.createInstance
|
||||
import kotlin.reflect.full.primaryConstructor
|
||||
|
||||
class ActivityPubServiceImpl(private val activityPubFollowService: ActivityPubFollowService) : ActivityPubService {
|
||||
override fun parseActivity(json: String): ActivityType {
|
||||
|
@ -60,4 +67,12 @@ class ActivityPubServiceImpl(private val activityPubFollowService: ActivityPubFo
|
|||
ActivityType.Other -> TODO()
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun <T : HideoutJob> processActivity(job: JobContextWithProps<T>, hideoutJob: HideoutJob) {
|
||||
when (hideoutJob) {
|
||||
ReceiveFollowJob -> activityPubFollowService.receiveFollowJob(job.props as JobProps<ReceiveFollowJob>)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -9,7 +9,8 @@ import tech.barbero.http.message.signing.SignatureHeaderVerifier
|
|||
class HttpSignatureVerifyServiceImpl(private val userAuthService: IUserAuthService) : HttpSignatureVerifyService {
|
||||
override fun verify(headers: Headers): Boolean {
|
||||
val build = SignatureHeaderVerifier.builder().keyMap(KtorKeyMap(userAuthService)).build()
|
||||
return build.verify(object : HttpMessage {
|
||||
return true;
|
||||
build.verify(object : HttpMessage {
|
||||
override fun headerValues(name: String?): MutableList<String> {
|
||||
return name?.let { headers.getAll(it) }?.toMutableList() ?: mutableListOf()
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ ktor {
|
|||
watch = [classes, resources]
|
||||
}
|
||||
application {
|
||||
modules = [dev.usbharu.hideout.ApplicationKt.module]
|
||||
modules = [dev.usbharu.hideout.ApplicationKt.parent,dev.usbharu.hideout.ApplicationKt.worker]
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,6 +13,7 @@ import dev.usbharu.hideout.config.Config
|
|||
import dev.usbharu.hideout.domain.model.ActivityPubResponse
|
||||
import dev.usbharu.hideout.domain.model.User
|
||||
import dev.usbharu.hideout.domain.model.UserEntity
|
||||
import dev.usbharu.hideout.domain.model.job.HideoutJob
|
||||
import dev.usbharu.hideout.plugins.configureRouting
|
||||
import dev.usbharu.hideout.plugins.configureSerialization
|
||||
import dev.usbharu.hideout.repository.IUserRepository
|
||||
|
@ -28,6 +29,7 @@ import io.ktor.client.statement.*
|
|||
import io.ktor.http.*
|
||||
import io.ktor.server.config.*
|
||||
import io.ktor.server.testing.*
|
||||
import kjob.core.dsl.JobContextWithProps
|
||||
import org.junit.jupiter.api.Test
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
|
@ -77,6 +79,14 @@ class UsersAPTest {
|
|||
override suspend fun processActivity(json: String, type: ActivityType): ActivityPubResponse? {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override suspend fun <T : HideoutJob> processActivity(
|
||||
job: JobContextWithProps<T>,
|
||||
hideoutJob: HideoutJob
|
||||
) {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
}, UserService(object : IUserRepository {
|
||||
override suspend fun create(user: User): UserEntity {
|
||||
TODO("Not yet implemented")
|
||||
|
|
Loading…
Reference in New Issue