feat: Instanceの取得に失敗したら仮の情報で保存するように

This commit is contained in:
usbharu 2024-02-27 11:16:59 +09:00
parent 32faf70116
commit 4f084a375b
1 changed files with 60 additions and 43 deletions

View File

@ -37,7 +37,7 @@ interface InstanceService {
class InstanceServiceImpl( class InstanceServiceImpl(
private val instanceRepository: InstanceRepository, private val instanceRepository: InstanceRepository,
private val resourceResolveService: ResourceResolveService, private val resourceResolveService: ResourceResolveService,
@Qualifier("activitypub") private val objectMapper: ObjectMapper @Qualifier("activitypub") private val objectMapper: ObjectMapper,
) : InstanceService { ) : InstanceService {
override suspend fun fetchInstance(url: String, sharedInbox: String?): Instance { override suspend fun fetchInstance(url: String, sharedInbox: String?): Instance {
val u = URL(url) val u = URL(url)
@ -51,56 +51,73 @@ class InstanceServiceImpl(
logger.info("Instance not found. try fetch instance info. url: {}", resolveInstanceUrl) logger.info("Instance not found. try fetch instance info. url: {}", resolveInstanceUrl)
val nodeinfoJson = resourceResolveService.resolve("$resolveInstanceUrl/.well-known/nodeinfo").bodyAsText() try {
val nodeinfo = objectMapper.readValue(nodeinfoJson, Nodeinfo::class.java)
val nodeinfoPathMap = nodeinfo.links.associate { it.rel to it.href }
for ((key, value) in nodeinfoPathMap) {
when (key) {
"http://nodeinfo.diaspora.software/ns/schema/2.0" -> {
val nodeinfo20 = objectMapper.readValue(
resourceResolveService.resolve(value!!).bodyAsText(),
Nodeinfo2_0::class.java
)
val instanceCreateDto = InstanceCreateDto( val nodeinfoJson = resourceResolveService.resolve("$resolveInstanceUrl/.well-known/nodeinfo").bodyAsText()
name = nodeinfo20.metadata?.nodeName, val nodeinfo = objectMapper.readValue(nodeinfoJson, Nodeinfo::class.java)
description = nodeinfo20.metadata?.nodeDescription, val nodeinfoPathMap = nodeinfo.links.associate { it.rel to it.href }
url = resolveInstanceUrl,
iconUrl = "$resolveInstanceUrl/favicon.ico",
sharedInbox = sharedInbox,
software = nodeinfo20.software?.name,
version = nodeinfo20.software?.version
)
return createNewInstance(instanceCreateDto)
}
// TODO: 多分2.0と2.1で互換性有るのでそのまま使うけどなおす for ((key, value) in nodeinfoPathMap) {
"http://nodeinfo.diaspora.software/ns/schema/2.1" -> { when (key) {
val nodeinfo20 = objectMapper.readValue( "http://nodeinfo.diaspora.software/ns/schema/2.0" -> {
resourceResolveService.resolve(value!!).bodyAsText(), val nodeinfo20 = objectMapper.readValue(
Nodeinfo2_0::class.java resourceResolveService.resolve(value!!).bodyAsText(),
) Nodeinfo2_0::class.java
)
val instanceCreateDto = InstanceCreateDto( val instanceCreateDto = InstanceCreateDto(
name = nodeinfo20.metadata?.nodeName, name = nodeinfo20.metadata?.nodeName,
description = nodeinfo20.metadata?.nodeDescription, description = nodeinfo20.metadata?.nodeDescription,
url = resolveInstanceUrl, url = resolveInstanceUrl,
iconUrl = "$resolveInstanceUrl/favicon.ico", iconUrl = "$resolveInstanceUrl/favicon.ico",
sharedInbox = sharedInbox, sharedInbox = sharedInbox,
software = nodeinfo20.software?.name, software = nodeinfo20.software?.name,
version = nodeinfo20.software?.version version = nodeinfo20.software?.version
) )
return createNewInstance(instanceCreateDto) return createNewInstance(instanceCreateDto)
} }
else -> { // TODO: 多分2.0と2.1で互換性有るのでそのまま使うけどなおす
throw IllegalStateException("Unknown nodeinfo versions: $key url: $value") "http://nodeinfo.diaspora.software/ns/schema/2.1" -> {
val nodeinfo20 = objectMapper.readValue(
resourceResolveService.resolve(value!!).bodyAsText(),
Nodeinfo2_0::class.java
)
val instanceCreateDto = InstanceCreateDto(
name = nodeinfo20.metadata?.nodeName,
description = nodeinfo20.metadata?.nodeDescription,
url = resolveInstanceUrl,
iconUrl = "$resolveInstanceUrl/favicon.ico",
sharedInbox = sharedInbox,
software = nodeinfo20.software?.name,
version = nodeinfo20.software?.version
)
return createNewInstance(instanceCreateDto)
}
else -> {
throw IllegalStateException("Unknown nodeinfo versions: $key url: $value")
}
} }
} }
}
throw IllegalStateException("Nodeinfo aren't found.")
} catch (e: Exception) {
logger.warn("FAILED Fetch Instance", e)
}
return createNewInstance(
InstanceCreateDto(
name = null,
description = null,
url = resolveInstanceUrl,
iconUrl = "$resolveInstanceUrl/favicon.ico",
sharedInbox = null,
software = null,
version = null
)
)
} }
override suspend fun createNewInstance(instanceCreateDto: InstanceCreateDto): Instance { override suspend fun createNewInstance(instanceCreateDto: InstanceCreateDto): Instance {