mirror of https://github.com/usbharu/Hideout.git
feat: Instanceの取得に失敗したら仮の情報で保存するように
This commit is contained in:
parent
32faf70116
commit
4f084a375b
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue