mirror of https://github.com/usbharu/Hideout.git
feat: WebFingerを実装
This commit is contained in:
parent
ecdbf74e57
commit
c37e442dd7
|
@ -0,0 +1,51 @@
|
||||||
|
package dev.usbharu.hideout.activitypub.application.webfinger
|
||||||
|
|
||||||
|
import dev.usbharu.hideout.activitypub.interfaces.wellknown.Link
|
||||||
|
import dev.usbharu.hideout.activitypub.interfaces.wellknown.XRD
|
||||||
|
import dev.usbharu.hideout.core.application.shared.AbstractApplicationService
|
||||||
|
import dev.usbharu.hideout.core.application.shared.Transaction
|
||||||
|
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
|
||||||
|
import java.net.URI
|
||||||
|
|
||||||
|
@Service
|
||||||
|
class WebFingerApplicationService(
|
||||||
|
transaction: Transaction,
|
||||||
|
private val applicationConfig: ApplicationConfig,
|
||||||
|
private val actorRepository: ActorRepository,
|
||||||
|
) : AbstractApplicationService<String, XRD>(transaction, logger) {
|
||||||
|
|
||||||
|
|
||||||
|
override suspend fun internalExecute(resource: String, principal: Principal): XRD {
|
||||||
|
if (resource.startsWith("acct:").not()) {
|
||||||
|
throw IllegalArgumentException("Parameter (resource) is invalid.")
|
||||||
|
}
|
||||||
|
val acct = resource.substringAfter("acct:")
|
||||||
|
|
||||||
|
val host = acct.substringAfter('@', "")
|
||||||
|
if (applicationConfig.url.apHost != host) {
|
||||||
|
throw IllegalArgumentException("Parameter (resource) is invalid.")
|
||||||
|
}
|
||||||
|
val username = acct.substringBefore('@', "")
|
||||||
|
if (username.isEmpty()) {
|
||||||
|
throw IllegalArgumentException("Actor is not found.")
|
||||||
|
}
|
||||||
|
|
||||||
|
val actor = actorRepository.findByNameAndDomain(username, applicationConfig.url.apHost)
|
||||||
|
?: throw IllegalArgumentException("Actor $username not found.")
|
||||||
|
|
||||||
|
return XRD(
|
||||||
|
listOf(Link("self", null, "application/activity+json", actor.url.toString())),
|
||||||
|
URI.create("acct:${actor.name.name}@${actor.domain.domain}")
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val logger = LoggerFactory.getLogger(WebFingerApplicationService::class.java)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package dev.usbharu.hideout.activitypub.interfaces.wellknown
|
||||||
|
|
||||||
|
import dev.usbharu.hideout.activitypub.application.webfinger.WebFingerApplicationService
|
||||||
|
import dev.usbharu.hideout.core.domain.model.support.principal.Anonymous
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam
|
||||||
|
import org.springframework.web.bind.annotation.RestController
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/.well-known")
|
||||||
|
class WebFingerController(
|
||||||
|
private val webFingerApplicationService: WebFingerApplicationService,
|
||||||
|
) {
|
||||||
|
@GetMapping("/webfinger", produces = ["application/json"])
|
||||||
|
suspend fun webfinger(@RequestParam(name = "resource", required = true) resource: String): XRD =
|
||||||
|
webFingerApplicationService.execute(resource, Anonymous)
|
||||||
|
}
|
Loading…
Reference in New Issue