diff --git a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/Nodeinfo2_0.kt b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/Nodeinfo2_0.kt index 5809ec69..db143776 100644 --- a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/Nodeinfo2_0.kt +++ b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/Nodeinfo2_0.kt @@ -1,3 +1,15 @@ package dev.usbharu.hideout.activitypub.application.nodeinfo -data class Nodeinfo2_0() \ No newline at end of file +data class Nodeinfo2_0( + val version: String = "2,0", + val software: Map, + val protocol: List, + val usage: NodeinfoUsage, + val openRegistration: Boolean, + val metadata: Map, +) + +data class NodeinfoUsage( + val users: Map, + val localPosts: Long, +) \ No newline at end of file diff --git a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/NodeinfoApplicationService.kt b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/NodeinfoApplicationService.kt new file mode 100644 index 00000000..345f660d --- /dev/null +++ b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/application/nodeinfo/NodeinfoApplicationService.kt @@ -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( + 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) + } +} diff --git a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/NodeinfoController.kt b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/NodeinfoController.kt index c2c63e27..7b6f2c95 100644 --- a/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/NodeinfoController.kt +++ b/hideout/hideout-activitypub/src/main/kotlin/dev/usbharu/hideout/activitypub/interfaces/wellknown/NodeinfoController.kt @@ -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) + } } \ No newline at end of file