feat: /nodeinfo/2.0,/nodeinfo/2.1を作成

This commit is contained in:
usbharu 2025-02-24 23:56:59 +09:00
parent 4be93fea86
commit 4c026fb243
Signed by: usbharu
GPG Key ID: 8CB1087135660B8D
3 changed files with 75 additions and 6 deletions

View File

@ -1,3 +1,15 @@
package dev.usbharu.hideout.activitypub.application.nodeinfo
data class Nodeinfo2_0()
data class Nodeinfo2_0(
val version: String = "2,0",
val software: Map<String, String>,
val protocol: List<String>,
val usage: NodeinfoUsage,
val openRegistration: Boolean,
val metadata: Map<String, Any>,
)
data class NodeinfoUsage(
val users: Map<String, String>,
val localPosts: Long,
)

View File

@ -0,0 +1,43 @@
package dev.usbharu.hideout.activitypub.application.nodeinfo
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.support.principal.Principal
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.info.BuildProperties
import org.springframework.stereotype.Service
@Service/*
* 今後ユーザーエージェントに応じてレスポンスを変更する可能性があるためApplicationServiceとして作成する commandは現時点ではUnitだが今後変化する可能性あり
*/
class NodeinfoApplicationService(
@Autowired(required = false) private val buildInfo: BuildProperties? = null,
private val applicationConfig: ApplicationConfig,
transaction: Transaction,
) : AbstractApplicationService<Unit, Nodeinfo2_0>(
transaction, logger
) {
override suspend fun internalExecute(command: Unit, principal: Principal): Nodeinfo2_0 {
return Nodeinfo2_0(
version = "2.0",
software = mapOf(
"name" to "hideout", "version" to (buildInfo?.version ?: "UNKNOWN")
),
protocol = listOf("activitypub"),
NodeinfoUsage(
users = mapOf(
"total" to "0", "activeMonth" to "0", "activeHalfyear" to "0"
), localPosts = 0
),
openRegistration = applicationConfig.private.not(),
metadata = mapOf()
)
}
companion object {
private val logger: Logger = LoggerFactory.getLogger(NodeinfoApplicationService::class.java)
}
}

View File

@ -1,15 +1,19 @@
package dev.usbharu.hideout.activitypub.interfaces.wellknown
import dev.usbharu.hideout.activitypub.application.nodeinfo.Nodeinfo2_0
import dev.usbharu.hideout.activitypub.application.nodeinfo.NodeinfoApplicationService
import dev.usbharu.hideout.core.config.ApplicationConfig
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.RestController
@RestController
@RequestMapping("/.well-known")
class NodeinfoController(private val applicationConfig: ApplicationConfig) {
@GetMapping("/nodeinfo", produces = ["application/json"])
suspend fun nodeinfo(): XRD = XRD(
class NodeinfoController(
private val applicationConfig: ApplicationConfig,
private val nodeinfoApplicationService: NodeinfoApplicationService,
) {
@GetMapping("/.well-known/nodeinfo", produces = ["application/json"])
fun nodeinfo(): XRD = XRD(
listOf(
Link(
"http://nodeinfo.diaspora.software/ns/schema/2.1",
@ -20,4 +24,14 @@ class NodeinfoController(private val applicationConfig: ApplicationConfig) {
)
)
)
@GetMapping("/nodeinfo/2.0", produces = ["application/json"])
suspend fun nodeinfo2_0(): Nodeinfo2_0 {
return nodeinfoApplicationService.execute(Unit, Anonymous)
}
@GetMapping("/nodeinfo/2.1", produces = ["application/json"])
suspend fun nodeinfo2_1(): Nodeinfo2_0 {
return nodeinfoApplicationService.execute(Unit, Anonymous)
}
}