LocalNatureReader.kt

package io.github.lishangbu.avalon.dataset.service.api

import io.github.lishangbu.avalon.dataset.api.model.NatureInfo
import io.github.lishangbu.avalon.dataset.api.service.NatureReader
import io.github.lishangbu.avalon.dataset.entity.dto.NatureSpecification
import io.github.lishangbu.avalon.dataset.entity.dto.NatureView
import io.github.lishangbu.avalon.dataset.repository.NatureRepository
import org.springframework.stereotype.Service

@Service
class LocalNatureReader(
    private val natureRepository: NatureRepository,
) : NatureReader {
    override fun findNatureById(id: Long): NatureInfo? = natureRepository.loadViewById(id)?.toNatureInfo()

    override fun findNatureByInternalName(internalName: String): NatureInfo? =
        natureRepository
            .listViews(NatureSpecification(internalName = internalName))
            .firstOrNull { nature -> nature.internalName == internalName }
            ?.toNatureInfo()

    private fun NatureView.toNatureInfo(): NatureInfo =
        NatureInfo(
            id = id.toLong(),
            internalName = requireNotNull(internalName) { "Nature id=$id is missing internalName." },
            name = name ?: requireNotNull(internalName),
            increasedStatInternalName = increasedStat?.internalName,
            decreasedStatInternalName = decreasedStat?.internalName,
        )
}