Skip to content

Commit 51c7397

Browse files
fix: removed requests duplication
1 parent 671546a commit 51c7397

11 files changed

Lines changed: 508 additions & 298 deletions

File tree

course/src/main/java/org/openedx/course/data/repository/CourseRepository.kt

Lines changed: 263 additions & 136 deletions
Large diffs are not rendered by default.

course/src/main/java/org/openedx/course/domain/interactor/CourseInteractor.kt

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.openedx.course.domain.interactor
22

33
import kotlinx.coroutines.flow.Flow
4+
import kotlinx.coroutines.flow.first
45
import org.openedx.core.BlockType
56
import org.openedx.core.domain.interactor.CourseInteractor
67
import org.openedx.core.domain.model.Block
@@ -13,9 +14,13 @@ class CourseInteractor(
1314
private val repository: CourseRepository
1415
) : CourseInteractor {
1516

16-
suspend fun getCourseStructureFlow(
17+
fun startCourseSession(courseId: String) {
18+
repository.startCourseSession(courseId)
19+
}
20+
21+
fun getCourseStructureFlow(
1722
courseId: String,
18-
forceRefresh: Boolean = true
23+
forceRefresh: Boolean = false
1924
): Flow<CourseStructure?> {
2025
return repository.getCourseStructureFlow(courseId, forceRefresh)
2126
}
@@ -24,15 +29,18 @@ class CourseInteractor(
2429
courseId: String,
2530
isNeedRefresh: Boolean
2631
): CourseStructure {
27-
return repository.getCourseStructure(courseId, isNeedRefresh)
32+
return repository.getCourseStructureFlow(courseId, isNeedRefresh).first()
2833
}
2934

3035
override suspend fun getCourseStructureFromCache(courseId: String): CourseStructure {
3136
return repository.getCourseStructureFromCache(courseId)
3237
}
3338

34-
suspend fun getEnrollmentDetailsFlow(courseId: String): Flow<CourseEnrollmentDetails?> {
35-
return repository.getEnrollmentDetailsFlow(courseId)
39+
fun getEnrollmentDetailsFlow(
40+
courseId: String,
41+
forceRefresh: Boolean = false
42+
): Flow<CourseEnrollmentDetails?> {
43+
return repository.getEnrollmentDetailsFlow(courseId, forceRefresh)
3644
}
3745

3846
suspend fun getEnrollmentDetails(courseId: String): CourseEnrollmentDetails {
@@ -43,7 +51,7 @@ class CourseInteractor(
4351
courseId: String,
4452
isNeedRefresh: Boolean = false
4553
): CourseStructure {
46-
val courseStructure = repository.getCourseStructure(courseId, isNeedRefresh)
54+
val courseStructure = getCourseStructure(courseId, isNeedRefresh)
4755
val blocks = courseStructure.blockData
4856
val videoBlocks = blocks.filter { it.type == BlockType.VIDEO }
4957
val resultBlocks = mutableListOf<Block>()
@@ -87,13 +95,20 @@ class CourseInteractor(
8795
}
8896
}
8997

90-
suspend fun getCourseStatusFlow(courseId: String) = repository.getCourseStatusFlow(courseId)
98+
fun getCourseStatusFlow(
99+
courseId: String,
100+
forceRefresh: Boolean = false
101+
) = repository.getCourseStatusFlow(courseId, forceRefresh)
91102

92103
suspend fun getCourseStatus(courseId: String) = repository.getCourseStatus(courseId)
93104

94-
suspend fun getCourseDatesFlow(courseId: String) = repository.getCourseDatesFlow(courseId)
105+
fun getCourseDatesFlow(
106+
courseId: String,
107+
forceRefresh: Boolean = false
108+
) = repository.getCourseDatesFlow(courseId, forceRefresh)
95109

96-
suspend fun getCourseDates(courseId: String) = repository.getCourseDates(courseId)
110+
suspend fun getCourseDates(courseId: String, forceRefresh: Boolean = false) =
111+
repository.getCourseDates(courseId, forceRefresh)
97112

98113
suspend fun resetCourseDates(courseId: String) = repository.resetCourseDates(courseId)
99114

course/src/main/java/org/openedx/course/presentation/assignments/CourseAssignmentViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class CourseAssignmentViewModel(
3939
private fun collectData() {
4040
viewModelScope.launch {
4141
val courseProgressFlow = interactor.getCourseProgress(courseId, false, true)
42-
val courseStructureFlow = interactor.getCourseStructureFlow(courseId)
42+
val courseStructureFlow = interactor.getCourseStructureFlow(courseId, false)
4343

4444
combine(
4545
courseProgressFlow,

course/src/main/java/org/openedx/course/presentation/container/CourseContainerFragment.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,6 @@ class CourseContainerFragment : Fragment(R.layout.fragment_course_container) {
143143
observe()
144144
}
145145

146-
override fun onResume() {
147-
super.onResume()
148-
if (viewModel.courseAccessStatus.value == CourseAccessError.NONE) {
149-
viewModel.updateData()
150-
}
151-
}
152-
153146
override fun onDestroyView() {
154147
snackBar?.dismiss()
155148
super.onDestroyView()

course/src/main/java/org/openedx/course/presentation/container/CourseContainerViewModel.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,18 @@ class CourseContainerViewModel(
164164

165165
_showProgress.value = true
166166

167+
interactor.startCourseSession(courseId)
168+
167169
viewModelScope.launch {
168170
val courseStructureFlow = interactor.getCourseStructureFlow(courseId)
169171
.catch { e ->
170172
handleFetchError(e)
171173
emit(null)
172174
}
173-
val courseDetailsFlow = interactor.getEnrollmentDetailsFlow(courseId)
175+
val courseDetailsFlow = interactor.getEnrollmentDetailsFlow(
176+
courseId,
177+
forceRefresh = true
178+
)
174179
.catch { emit(null) }
175180
courseStructureFlow.combine(courseDetailsFlow) { courseStructure, courseEnrollmentDetails ->
176181
courseStructure to courseEnrollmentDetails

course/src/main/java/org/openedx/course/presentation/dates/CourseDatesViewModel.kt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class CourseDatesViewModel(
6666
courseNotifier.notifier.collect { event ->
6767
when (event) {
6868
is RefreshDates -> {
69-
loadingCourseDatesInternal()
69+
loadingCourseDatesInternal(forceRefresh = true)
7070
}
7171
}
7272
}
@@ -82,15 +82,23 @@ class CourseDatesViewModel(
8282
}
8383
}
8484

85-
loadingCourseDatesInternal()
85+
loadingCourseDatesInternal(forceRefresh = false)
8686
}
8787

88-
private fun loadingCourseDatesInternal() {
88+
private fun loadingCourseDatesInternal(forceRefresh: Boolean) {
8989
viewModelScope.launch {
9090
try {
91-
courseStructure = interactor.getCourseStructure(courseId = courseId)
91+
courseStructure = if (forceRefresh) {
92+
interactor.getCourseStructure(courseId = courseId, isNeedRefresh = true)
93+
} else {
94+
interactor.getCourseStructure(courseId = courseId)
95+
}
9296
isSelfPaced = courseStructure?.isSelfPaced ?: false
93-
val datesResponse = interactor.getCourseDates(courseId = courseId)
97+
val datesResponse = if (forceRefresh) {
98+
interactor.getCourseDates(courseId = courseId, forceRefresh = true)
99+
} else {
100+
interactor.getCourseDates(courseId = courseId)
101+
}
94102
if (datesResponse.datesSection.isEmpty()) {
95103
_uiState.value = CourseDatesUIState.Error
96104
} else {
@@ -117,7 +125,7 @@ class CourseDatesViewModel(
117125
viewModelScope.launch {
118126
try {
119127
interactor.resetCourseDates(courseId = courseId)
120-
loadingCourseDatesInternal()
128+
loadingCourseDatesInternal(forceRefresh = true)
121129
courseNotifier.send(CourseDatesShifted)
122130
onResetDates(true)
123131
} catch (e: Exception) {

course/src/main/java/org/openedx/course/presentation/progress/CourseProgressViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class CourseProgressViewModel(
3535
private fun collectData(isRefresh: Boolean) {
3636
viewModelScope.launch {
3737
val courseProgressFlow = interactor.getCourseProgress(courseId, isRefresh, false)
38-
val courseStructureFlow = interactor.getCourseStructureFlow(courseId)
38+
val courseStructureFlow = interactor.getCourseStructureFlow(courseId, false)
3939

4040
combine(
4141
courseProgressFlow,

course/src/test/java/org/openedx/course/presentation/container/CourseContainerViewModelTest.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule
55
import io.mockk.coEvery
66
import io.mockk.coVerify
77
import io.mockk.every
8+
import io.mockk.justRun
89
import io.mockk.mockk
910
import io.mockk.spyk
1011
import io.mockk.verify
@@ -81,6 +82,7 @@ class CourseContainerViewModelTest {
8182
every { corePreferences.appConfig } returns CoreMocks.mockAppConfig
8283
every { courseNotifier.notifier } returns emptyFlow()
8384
every { config.getApiHostURL() } returns "baseUrl"
85+
justRun { interactor.startCourseSession(any()) }
8486
coEvery { interactor.getEnrollmentDetails(any()) } returns CoreMocks.mockCourseEnrollmentDetails
8587
every { imageProcessor.loadImage(any(), any(), any()) } returns Unit
8688
every { imageProcessor.applyBlur(any(), any()) } returns mockBitmap
@@ -114,7 +116,7 @@ class CourseContainerViewModelTest {
114116
interactor.getCourseStructureFlow(any(), any())
115117
} returns flowOf(null)
116118
coEvery {
117-
interactor.getEnrollmentDetailsFlow(any())
119+
interactor.getEnrollmentDetailsFlow(any(), any())
118120
} returns flow { throw Exception() }
119121
every {
120122
analytics.logScreenEvent(
@@ -131,7 +133,7 @@ class CourseContainerViewModelTest {
131133
viewModel.fetchCourseDetails()
132134
advanceUntilIdle()
133135

134-
coVerify(exactly = 1) { interactor.getEnrollmentDetailsFlow(any()) }
136+
coVerify(exactly = 1) { interactor.getEnrollmentDetailsFlow(any(), any()) }
135137
verify(exactly = 1) {
136138
analytics.logScreenEvent(
137139
CourseAnalyticsEvent.DASHBOARD.eventName,
@@ -169,7 +171,7 @@ class CourseContainerViewModelTest {
169171
coEvery { interactor.getCourseStructureFlow(any(), any()) } returns flowOf(
170172
CoreMocks.mockCourseStructure
171173
)
172-
coEvery { interactor.getEnrollmentDetailsFlow(any()) } returns flowOf(
174+
coEvery { interactor.getEnrollmentDetailsFlow(any(), any()) } returns flowOf(
173175
CoreMocks.mockCourseEnrollmentDetails
174176
)
175177
every {
@@ -187,7 +189,7 @@ class CourseContainerViewModelTest {
187189
viewModel.fetchCourseDetails()
188190
advanceUntilIdle()
189191

190-
coVerify(exactly = 1) { interactor.getEnrollmentDetailsFlow(any()) }
192+
coVerify(exactly = 1) { interactor.getEnrollmentDetailsFlow(any(), any()) }
191193
verify(exactly = 1) {
192194
analytics.logScreenEvent(
193195
CourseAnalyticsEvent.DASHBOARD.eventName,
@@ -226,7 +228,7 @@ class CourseContainerViewModelTest {
226228
coEvery { interactor.getCourseStructureFlow(any(), any()) } returns flowOf(
227229
CoreMocks.mockCourseStructure
228230
)
229-
coEvery { interactor.getEnrollmentDetailsFlow(any()) } returns flowOf(
231+
coEvery { interactor.getEnrollmentDetailsFlow(any(), any()) } returns flowOf(
230232
CoreMocks.mockCourseEnrollmentDetails
231233
)
232234
every {

course/src/test/java/org/openedx/course/presentation/dates/CourseDatesViewModelTest.kt

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,15 @@ class CourseDatesViewModelTest {
112112
calendarRouter,
113113
resourceManager,
114114
)
115-
coEvery { interactor.getCourseDates(any()) } throws UnknownHostException()
115+
coEvery { interactor.getCourseDates(any(), any()) } throws UnknownHostException()
116116
val message = async {
117117
withTimeoutOrNull(5000) {
118118
viewModel.uiMessage.first() as? UIMessage.SnackBarMessage
119119
}
120120
}
121121
advanceUntilIdle()
122122

123-
coVerify(exactly = 1) { interactor.getCourseDates(any()) }
123+
coVerify(exactly = 1) { interactor.getCourseDates(any(), any()) }
124124

125125
Assert.assertEquals(noInternet, message.await()?.message)
126126
assert(viewModel.uiState.value is CourseDatesUIState.Error)
@@ -142,15 +142,15 @@ class CourseDatesViewModelTest {
142142
calendarRouter,
143143
resourceManager,
144144
)
145-
coEvery { interactor.getCourseDates(any()) } throws Exception()
145+
coEvery { interactor.getCourseDates(any(), any()) } throws Exception()
146146
val message = async {
147147
withTimeoutOrNull(5000) {
148148
viewModel.uiMessage.first() as? UIMessage.SnackBarMessage
149149
}
150150
}
151151
advanceUntilIdle()
152152

153-
coVerify(exactly = 1) { interactor.getCourseDates(any()) }
153+
coVerify(exactly = 1) { interactor.getCourseDates(any(), any()) }
154154

155155
assert(message.await()?.message.isNullOrEmpty())
156156
assert(viewModel.uiState.value is CourseDatesUIState.Error)
@@ -172,15 +172,20 @@ class CourseDatesViewModelTest {
172172
calendarRouter,
173173
resourceManager,
174174
)
175-
coEvery { interactor.getCourseDates(any()) } returns CourseMocks.courseDatesResultWithData
175+
coEvery {
176+
interactor.getCourseDates(
177+
any(),
178+
any()
179+
)
180+
} returns CourseMocks.courseDatesResultWithData
176181
val message = async {
177182
withTimeoutOrNull(5000) {
178183
viewModel.uiMessage.first() as? UIMessage.SnackBarMessage
179184
}
180185
}
181186
advanceUntilIdle()
182187

183-
coVerify(exactly = 1) { interactor.getCourseDates(any()) }
188+
coVerify(exactly = 1) { interactor.getCourseDates(any(), any()) }
184189

185190
assert(message.await()?.message.isNullOrEmpty())
186191
assert(viewModel.uiState.value is CourseDatesUIState.CourseDates)
@@ -202,7 +207,7 @@ class CourseDatesViewModelTest {
202207
calendarRouter,
203208
resourceManager,
204209
)
205-
coEvery { interactor.getCourseDates(any()) } returns CourseDatesResult(
210+
coEvery { interactor.getCourseDates(any(), any()) } returns CourseDatesResult(
206211
datesSection = linkedMapOf(),
207212
courseBanner = CoreMocks.mockCourseDatesBannerInfo,
208213
)
@@ -213,7 +218,7 @@ class CourseDatesViewModelTest {
213218
}
214219
advanceUntilIdle()
215220

216-
coVerify(exactly = 1) { interactor.getCourseDates(any()) }
221+
coVerify(exactly = 1) { interactor.getCourseDates(any(), any()) }
217222

218223
assert(message.await()?.message.isNullOrEmpty())
219224
assert(viewModel.uiState.value is CourseDatesUIState.Error)

0 commit comments

Comments
 (0)