Есть PagingSource, который в зависимости от параметра query получает разные данные от API.
class MoviePagingSource(
private val service: MovieService,
private val query: String
) : PagingSource<Int, Movie>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Movie> {
val page = params.key ?: 1
val response = service.getMovies(query, page)
return try {
val movies = response.result.map { it.toMovie() }
val prevKey = if (page != 0) page - 1 else null
val nextKey = if (page < response.total_pages) page + 1 else null
LoadResult.Page(movies, prevKey, nextKey)
} catch (e: Exception) {
LoadResult.Error(e)
}
}
}
Затем есть репозиторий, который возвращает PagingData
class MovieRepositoryImpl(
private val service: MovieService
): MovieRepository {
override fun getMovies(query: String): Flow<PagingData<Movie>> =
Pager(
config = PagingConfig(pageSize = 20),
pagingSourceFactory = { MoviePagingSource(service, query) }
).flow
}
И есть UseCase, который вызывает метод репозитория
class GetMovies(
private val repository: MovieRepository
) {
operator fun invoke() = Movies(
popular = repository.getMovies("popular")
)
}
Насколько я понимаю, передача параметра query в юзкейсе нарушает чистую архитектуру, так как запросы у разных апи свои, и это не должно делаться в domain слое. Как этого избежать? Вижу вариант создания множества методов в репозитории под каждый query, но вряд-ли это то, что нужно