LocationServiceImpl.kt

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

import io.github.lishangbu.avalon.dataset.entity.Location
import io.github.lishangbu.avalon.dataset.entity.dto.LocationSpecification
import io.github.lishangbu.avalon.dataset.entity.dto.LocationView
import io.github.lishangbu.avalon.dataset.entity.dto.SaveLocationInput
import io.github.lishangbu.avalon.dataset.entity.dto.UpdateLocationInput
import io.github.lishangbu.avalon.dataset.repository.LocationRepository
import io.github.lishangbu.avalon.dataset.service.LocationService
import org.babyfish.jimmer.Page
import org.babyfish.jimmer.sql.ast.mutation.SaveMode
import org.springframework.data.domain.Pageable
import org.springframework.stereotype.Service

@Service
class LocationServiceImpl(
    private val locationRepository: LocationRepository,
) : LocationService {
    override fun getPageByCondition(
        specification: LocationSpecification,
        pageable: Pageable,
    ): Page<LocationView> = locationRepository.pageViews(specification, pageable)

    override fun save(command: SaveLocationInput): LocationView = locationRepository.save(command.toEntity(), SaveMode.INSERT_ONLY).let(::reloadView)

    override fun update(command: UpdateLocationInput): LocationView = locationRepository.save(command.toEntity(), SaveMode.UPDATE_ONLY).let(::reloadView)

    override fun removeById(id: Long) {
        locationRepository.deleteById(id)
    }

    override fun listByCondition(specification: LocationSpecification): List<LocationView> = locationRepository.listViews(specification)

    private fun reloadView(location: Location): LocationView = requireNotNull(locationRepository.loadViewById(location.id)) { "未找到 ID=${location.id} 对应的地点" }
}