LocalMoveReader.kt
package io.github.lishangbu.avalon.dataset.service.api
import io.github.lishangbu.avalon.dataset.api.model.MoveInfo
import io.github.lishangbu.avalon.dataset.api.service.MoveReader
import io.github.lishangbu.avalon.dataset.entity.dto.MoveSpecification
import io.github.lishangbu.avalon.dataset.entity.dto.MoveView
import io.github.lishangbu.avalon.dataset.repository.MoveRepository
import org.springframework.stereotype.Service
@Service
class LocalMoveReader(
private val moveRepository: MoveRepository,
) : MoveReader {
override fun findMoveByInternalName(internalName: String): MoveInfo? =
moveRepository
.listViews(MoveSpecification(internalName = internalName))
.firstOrNull { move -> move.internalName == internalName }
?.toMoveInfo()
override fun findMovesByInternalNames(internalNames: Set<String>): Map<String, MoveInfo> =
internalNames
.mapNotNull { internalName ->
findMoveByInternalName(internalName)?.let { move -> internalName to move }
}.toMap(LinkedHashMap())
private fun MoveView.toMoveInfo(): MoveInfo =
MoveInfo(
id = id.toLong(),
internalName = requireNotNull(internalName) { "Move id=$id is missing internalName." },
name = name ?: requireNotNull(internalName),
typeInternalName = type?.internalName,
damageClassInternalName = moveDamageClass?.internalName,
targetInternalName = moveTarget?.internalName,
accuracy = accuracy,
effectChance = effectChance,
pp = pp,
priority = priority,
power = power,
shortEffect = shortEffect,
effect = effect,
ailmentInternalName = moveAilment?.internalName,
ailmentChance = ailmentChance,
healing = healing,
drain = drain,
)
}