feat: /users/:usernameにアクセスすることでActivityを得られるように

This commit is contained in:
usbharu 2025-02-14 17:48:39 +09:00
parent 98964cc656
commit d4157a3b38
Signed by: usbharu
GPG Key ID: 8CB1087135660B8D
6 changed files with 90 additions and 9 deletions

View File

@ -1,19 +1,30 @@
package dev.usbharu.hideout.activitypub.application.actor
import dev.usbharu.activitystreamsserialization.other.JsonLd
import dev.usbharu.hideout.activitypub.external.activitystreams.ActorTranslator
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
import dev.usbharu.hideout.core.application.shared.Transaction
import dev.usbharu.hideout.core.domain.model.actor.Actor
import dev.usbharu.hideout.core.config.ApplicationConfig
import dev.usbharu.hideout.core.domain.model.actor.ActorRepository
import dev.usbharu.hideout.core.domain.model.support.domain.apHost
import dev.usbharu.hideout.core.domain.model.support.principal.Principal
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@Service
class GetActorApplicationService(transaction: Transaction) : AbstractApplicationService<String, Actor>(
class GetActorApplicationService(
private val actorRepository: ActorRepository,
private val applicationConfig: ApplicationConfig,
private val actorTranslator: ActorTranslator,
transaction: Transaction,
) : AbstractApplicationService<String, JsonLd>(
transaction,
logger
logger,
) {
override suspend fun internalExecute(command: String, principal: Principal): Actor {
TODO()
override suspend fun internalExecute(command: String, principal: Principal): JsonLd {
val actor = actorRepository.findByNameAndDomain(command, applicationConfig.url.apHost)
?: throw IllegalArgumentException("Actor $command not found")
return actorTranslator.translate(actor, null, null)
}
companion object {

View File

@ -0,0 +1,16 @@
package dev.usbharu.hideout.activitypub.config
import dev.usbharu.hideout.activitypub.external.activitystreams.ActivityStreamHttpMessageConverter
import org.springframework.context.annotation.Configuration
import org.springframework.core.annotation.Order
import org.springframework.http.converter.HttpMessageConverter
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
@Configuration
@Order(2)
class ActivityPubWebMvcConfigurer(private val activityStreamsHttpMessageConverter: ActivityStreamHttpMessageConverter) :
WebMvcConfigurer {
override fun extendMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
converters.add(activityStreamsHttpMessageConverter)
}
}

View File

@ -0,0 +1,45 @@
package dev.usbharu.hideout.activitypub.external.activitystreams
import com.github.jsonldjava.core.JsonLdOptions
import com.github.jsonldjava.core.JsonLdProcessor
import com.github.jsonldjava.utils.JsonUtils
import dev.usbharu.activitystreamsserialization.json.impl.JacksonSerializationConverter
import dev.usbharu.activitystreamsserialization.other.JsonLd
import org.springframework.http.HttpInputMessage
import org.springframework.http.HttpOutputMessage
import org.springframework.http.MediaType
import org.springframework.http.converter.HttpMessageConverter
import org.springframework.stereotype.Component
@Component
class ActivityStreamHttpMessageConverter : HttpMessageConverter<JsonLd> {
override fun canRead(clazz: Class<*>, mediaType: MediaType?): Boolean {
return false
}
override fun canWrite(clazz: Class<*>, mediaType: MediaType?): Boolean {
return JsonLd::class.java.isAssignableFrom(clazz)
}
override fun getSupportedMediaTypes(): MutableList<MediaType> {
return mutableListOf()
}
override fun write(t: JsonLd, contentType: MediaType?, outputMessage: HttpOutputMessage) {
outputMessage.headers.contentType = MediaType.APPLICATION_JSON
outputMessage.body.bufferedWriter()
.use {
it.write(JsonUtils.toString(
JsonLdProcessor.compact(
JsonUtils.fromString(JacksonSerializationConverter.convert(t.json).toString()), "https://www.w3.org/ns/activitystreams",
JsonLdOptions()
)
))
}
}
override fun read(clazz: Class<out JsonLd>, inputMessage: HttpInputMessage): JsonLd {
TODO("Not yet implemented")
}
}

View File

@ -1,8 +1,9 @@
package dev.usbharu.hideout.activitypub.`interface`.api
import dev.usbharu.activitystreamsserialization.other.JsonLd
import dev.usbharu.hideout.activitypub.application.actor.GetActorApplicationService
import dev.usbharu.hideout.core.domain.model.actor.Actor
import dev.usbharu.hideout.core.domain.model.support.principal.Anonymous
import org.springframework.http.ResponseEntity
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
@ -14,7 +15,7 @@ class APActorController(private val getActorApplicationService: GetActorApplicat
consumes = ["application/activity+json"],
produces = ["application/activity+json"]
)
suspend fun user(@PathVariable username: String): Actor {
return getActorApplicationService.execute(username, Anonymous)
suspend fun user(@PathVariable username: String): ResponseEntity<JsonLd> {
return ResponseEntity.ok(getActorApplicationService.execute(username, Anonymous))
}
}

View File

@ -23,6 +23,7 @@ import dev.usbharu.hideout.generate.JsonOrFormModelMethodProcessor
import org.springframework.boot.web.servlet.FilterRegistrationBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.core.annotation.Order
import org.springframework.http.converter.HttpMessageConverter
import org.springframework.web.method.support.HandlerMethodArgumentResolver
import org.springframework.web.servlet.config.annotation.InterceptorRegistry
@ -31,10 +32,11 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBody
import org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor
@Configuration
@Order(2)
class MvcConfigurer(
private val jsonOrFormModelMethodProcessor: JsonOrFormModelMethodProcessor,
private val spaInterceptor: SPAInterceptor,
private val applicationRequestLogInterceptor: ApplicationRequestLogInterceptor
private val applicationRequestLogInterceptor: ApplicationRequestLogInterceptor,
) : WebMvcConfigurer {
override fun addArgumentResolvers(resolvers: MutableList<HandlerMethodArgumentResolver>) {
resolvers.add(jsonOrFormModelMethodProcessor)

View File

@ -0,0 +1,6 @@
package dev.usbharu.hideout.core.domain.model.support.principal
import dev.usbharu.hideout.core.domain.model.actor.ActorId
import dev.usbharu.hideout.core.domain.model.support.acct.Acct
class RemoteUser(actorId: ActorId, acct: Acct?) : Principal(actorId, null, acct)