Skip to content

Commit afda62d

Browse files
committed
Add posts
1 parent f7fadfd commit afda62d

File tree

9 files changed

+99
-2
lines changed

9 files changed

+99
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.hoc.pagination_mvi.data
2+
3+
import com.hoc.pagination_mvi.data.remote.ApiService
4+
import com.hoc.pagination_mvi.di.ApplicationScope
5+
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.CoroutinesDispatchersProvider
6+
import com.hoc.pagination_mvi.domain.entity.Photo
7+
import com.hoc.pagination_mvi.domain.entity.Post
8+
import com.hoc.pagination_mvi.domain.repository.PhotoRepository
9+
import com.hoc.pagination_mvi.domain.repository.PostRepository
10+
import kotlinx.coroutines.withContext
11+
import javax.inject.Inject
12+
13+
@ApplicationScope
14+
class PostRepositoryImpl @Inject constructor(
15+
private val apiService: ApiService,
16+
private val dispatchersProvider: CoroutinesDispatchersProvider
17+
) : PostRepository {
18+
override suspend fun getPosts(start: Int, limit: Int): List<Post> {
19+
return withContext(dispatchersProvider.io) {
20+
apiService.getPosts(start = start, limit = limit).map {
21+
Post(
22+
body = it.body,
23+
title = it.title,
24+
id = it.id,
25+
userId = it.userId
26+
)
27+
}
28+
}
29+
}
30+
31+
}

app/src/main/java/com/hoc/pagination_mvi/data/remote/ApiService.kt

+6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ interface ApiService {
1414
@Query("_limit") limit: Int
1515
): List<PhotoResponse>
1616

17+
@GET("posts")
18+
suspend fun getPosts(
19+
@Query("_start") start: Int,
20+
@Query("_limit") limit: Int
21+
): List<PostResponse>
22+
1723
companion object {
1824
operator fun invoke(retrofit: Retrofit) = retrofit.create<ApiService>()
1925
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.hoc.pagination_mvi.data.remote
2+
3+
import com.squareup.moshi.Json
4+
5+
data class PostResponse(
6+
@Json(name = "body")
7+
val body: String, // cupiditate quo est a modi nesciunt solutaipsa voluptas error itaque dicta inautem qui minus magnam et distinctio eumaccusamus ratione error aut
8+
@Json(name = "id")
9+
val id: Int, // 100
10+
@Json(name = "title")
11+
val title: String, // at nam consequatur ea labore ea harum
12+
@Json(name = "userId")
13+
val userId: Int // 10
14+
)

app/src/main/java/com/hoc/pagination_mvi/di/modules/DomainModule.kt

+5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.hoc.pagination_mvi.di.modules
22

33
import com.hoc.pagination_mvi.data.PhotoRepositoryImpl
4+
import com.hoc.pagination_mvi.data.PostRepositoryImpl
45
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.CoroutinesDispatchersProvider
56
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.CoroutinesDispatchersProviderImpl
67
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.RxSchedulerProvider
78
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.RxSchedulerProviderImpl
89
import com.hoc.pagination_mvi.domain.repository.PhotoRepository
10+
import com.hoc.pagination_mvi.domain.repository.PostRepository
911
import dagger.Binds
1012
import dagger.Module
1113

@@ -20,4 +22,7 @@ interface DomainModule {
2022

2123
@Binds
2224
fun providePhotoRepository(photoRepositoryImpl: PhotoRepositoryImpl): PhotoRepository
25+
26+
@Binds
27+
fun providePostRepository(postRepositoryImpl: PostRepositoryImpl): PostRepository
2328
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.hoc.pagination_mvi.domain.entity
2+
3+
data class Post(
4+
val body: String, // cupiditate quo est a modi nesciunt solutaipsa voluptas error itaque dicta inautem qui minus magnam et distinctio eumaccusamus ratione error aut
5+
val id: Int, // 100
6+
val title: String, // at nam consequatur ea labore ea harum
7+
val userId: Int // 10
8+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.hoc.pagination_mvi.domain.repository
2+
3+
import com.hoc.pagination_mvi.domain.entity.Post
4+
5+
interface PostRepository {
6+
suspend fun getPosts(
7+
start: Int,
8+
limit: Int
9+
): List<Post>
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.hoc.pagination_mvi.domain.usecase
2+
3+
import com.hoc.pagination_mvi.di.ApplicationScope
4+
import com.hoc.pagination_mvi.domain.entity.Photo
5+
import com.hoc.pagination_mvi.domain.entity.Post
6+
import com.hoc.pagination_mvi.domain.repository.PhotoRepository
7+
import com.hoc.pagination_mvi.domain.repository.PostRepository
8+
import javax.inject.Inject
9+
10+
@ApplicationScope
11+
class GetPostsUseCase @Inject constructor(
12+
private val postRepository: PostRepository
13+
) {
14+
suspend operator fun invoke(start: Int, limit: Int): List<Post> {
15+
return postRepository.getPosts(start = start, limit = limit)
16+
}
17+
}

app/src/main/java/com/hoc/pagination_mvi/ui/main/MainInteractorImpl.kt

+4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package com.hoc.pagination_mvi.ui.main
22

3+
import com.hoc.pagination_mvi.di.ApplicationScope
34
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.CoroutinesDispatchersProvider
45
import com.hoc.pagination_mvi.domain.usecase.GetPhotosUseCase
6+
import com.hoc.pagination_mvi.domain.usecase.GetPostsUseCase
57
import com.hoc.pagination_mvi.ui.main.MainContract.PhotoVS
68
import io.reactivex.Observable
79
import kotlinx.coroutines.ExperimentalCoroutinesApi
810
import kotlinx.coroutines.delay
911
import kotlinx.coroutines.rx2.rxObservable
1012
import javax.inject.Inject
1113

14+
@ApplicationScope
1215
@ExperimentalCoroutinesApi
1316
class MainInteractorImpl @Inject constructor(
1417
private val getPhotosUseCase: GetPhotosUseCase,
18+
private val getPostsUseCase: GetPostsUseCase,
1519
private val dispatchers: CoroutinesDispatchersProvider
1620
) : MainContract.Interactor {
1721
override fun photoNextPageChanges(

app/src/main/java/com/hoc/pagination_mvi/ui/main/MainVM.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.lifecycle.ViewModel
66
import androidx.lifecycle.distinctUntilChanged
77
import com.hoc.pagination_mvi.asObservable
88
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.CoroutinesDispatchersProvider
9+
import com.hoc.pagination_mvi.domain.dispatchers_schedulers.RxSchedulerProvider
910
import com.hoc.pagination_mvi.domain.usecase.GetPhotosUseCase
1011
import com.hoc.pagination_mvi.exhaustMap
1112
import com.hoc.pagination_mvi.ui.main.MainContract.*
@@ -26,7 +27,8 @@ import javax.inject.Inject
2627

2728
@ExperimentalCoroutinesApi
2829
class MainVM @Inject constructor(
29-
private val interactor: Interactor
30+
private val interactor: Interactor,
31+
private val rxSchedulerProvider: RxSchedulerProvider
3032
) : ViewModel() {
3133
private val initial = ViewState.initial()
3234
private val _stateD = MutableLiveData<ViewState>().apply { value = initial }
@@ -85,7 +87,7 @@ class MainVM @Inject constructor(
8587
intentS
8688
.compose(intentFilter)
8789
.compose(toPartialStateChange)
88-
.observeOn(AndroidSchedulers.mainThread())
90+
.observeOn(rxSchedulerProvider.main)
8991
.scan(initial) { vs, change -> change.reduce(vs) }
9092
.subscribe(stateS::onNext)
9193
.addTo(compositeDisposable)

0 commit comments

Comments
 (0)