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,
        )
}