Coverage Summary for Class: SearchService (concept.stc.domain)
Class |
Method, %
|
Branch, %
|
Line, %
|
SearchService |
100%
(5/5)
|
75%
(3/4)
|
95.2%
(20/21)
|
SearchService$getSearchHistory$$inlined$sortedByDescending$1 |
SearchService$getSearchHistory$1 |
SearchService$newSearch$1 |
SearchService$search$1 |
SearchService$updateSearch$1 |
Total |
100%
(5/5)
|
75%
(3/4)
|
95.2%
(20/21)
|
package concept.stc.domain
import concept.stc.data.ApiService
import concept.stc.data.MovieRepository
import concept.stc.data.SearchHistoryRepository
import concept.stc.domain.model.Search
import concept.stc.domain.model.SearchHistory
import kotlinx.coroutines.flow.toList
import org.springframework.stereotype.Service
import java.time.LocalDateTime
/**
* The search service.
*
* @param searchRepository the search history repository.
* @param movieRepository the movie repository.
* @param apiService the API service.
*/
@Service
class SearchService(
private val searchRepository: SearchHistoryRepository,
private val movieRepository: MovieRepository,
private val apiService: ApiService
) {
/**
* Search movies by title.
*
* @param title the movie title.
*/
suspend fun search(title: String): SearchHistory {
val search = searchRepository.getSearchByQuery(title)
return when {
search == null -> newSearch(title)
search.isExpired() -> updateSearch(search)
else -> getSearchHistory(search)
}
}
private suspend fun newSearch(title: String): SearchHistory {
val movieIds = apiService.loadMovies(title)
val newSearch = searchRepository.saveSearch(title)
searchRepository.saveMovieIdsForSearch(newSearch, movieIds)
return getSearchHistory(newSearch)
}
private suspend fun updateSearch(search: Search): SearchHistory {
val movieIds = apiService.loadMovies(search.query)
val updatedSearch = searchRepository.saveSearch(search.copy(updatedDate = LocalDateTime.now()))
searchRepository.updateMovieIdsForSearch(updatedSearch, movieIds)
return getSearchHistory(updatedSearch)
}
private suspend fun getSearchHistory(search: Search): SearchHistory {
val movieIds = searchRepository.getMovieIdsBySearch(search)
val movies = movieRepository.getMoviesByIds(movieIds).toList()
val searches = searchRepository.getAllSearches().toList().sortedByDescending { it.updatedDate }
return SearchHistory(searches, movies)
}
}