LocalItemReader.kt
package io.github.lishangbu.avalon.dataset.service.api
import io.github.lishangbu.avalon.dataset.api.model.ItemInfo
import io.github.lishangbu.avalon.dataset.api.service.ItemReader
import io.github.lishangbu.avalon.dataset.entity.dto.ItemSpecification
import io.github.lishangbu.avalon.dataset.entity.dto.ItemView
import io.github.lishangbu.avalon.dataset.repository.ItemRepository
import org.springframework.stereotype.Service
@Service
class LocalItemReader(
private val itemRepository: ItemRepository,
) : ItemReader {
override fun findItemByInternalName(internalName: String): ItemInfo? =
itemRepository
.listViews(ItemSpecification(internalName = internalName))
.firstOrNull { item -> item.internalName == internalName }
?.toItemInfo()
override fun findItemsByIds(ids: Set<Long>): Map<Long, ItemInfo> =
ids
.mapNotNull { id ->
itemRepository.loadViewById(id)?.toItemInfo()?.let { item -> id to item }
}.toMap(LinkedHashMap())
private fun ItemView.toItemInfo(): ItemInfo =
ItemInfo(
id = id.toLong(),
internalName = requireNotNull(internalName) { "Item id=$id is missing internalName." },
name = name ?: requireNotNull(internalName),
shortEffect = shortEffect,
effect = effect,
text = text,
attributeInternalNames = itemAttributes.mapNotNull { attribute -> attribute.internalName }.toSet(),
flingEffectInternalName = itemFlingEffect?.internalName,
)
}