LocalAbilityReader.kt

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

import io.github.lishangbu.avalon.dataset.api.model.AbilityInfo
import io.github.lishangbu.avalon.dataset.api.service.AbilityReader
import io.github.lishangbu.avalon.dataset.entity.dto.AbilitySpecification
import io.github.lishangbu.avalon.dataset.entity.dto.AbilityView
import io.github.lishangbu.avalon.dataset.repository.AbilityRepository
import org.springframework.stereotype.Service

@Service
class LocalAbilityReader(
    private val abilityRepository: AbilityRepository,
) : AbilityReader {
    override fun findAbilityByInternalName(internalName: String): AbilityInfo? =
        abilityRepository
            .listViews(AbilitySpecification(internalName = internalName))
            .firstOrNull { ability -> ability.internalName == internalName }
            ?.toAbilityInfo()

    private fun AbilityView.toAbilityInfo(): AbilityInfo =
        AbilityInfo(
            id = id.toLong(),
            internalName = requireNotNull(internalName) { "Ability id=$id is missing internalName." },
            name = name ?: requireNotNull(internalName),
            effect = effect,
            introduction = introduction,
        )
}