Skip to content

Commit 82fa41d

Browse files
authored
Merge pull request #1 from Neouul/refactor/usecase
refactor/usecase: Repository 감싸는 UseCase 작성 및 적용
2 parents 1de504c + 13f5614 commit 82fa41d

12 files changed

Lines changed: 120 additions & 88 deletions

File tree

app/src/androidTest/java/com/survivalcoding/gangnam2kiandroidstudy/presentation/screen/search_recipe/SearchToIngredientIntegrationTest.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ class SearchToIngredientIntegrationTest {
7171
override fun copyText(text: String) {}
7272
}
7373
}
74-
single { GetRecipeProcedureUseCase(get()) }
7574
single { CopyLinkUseCase(get()) }
7675
viewModel { SearchRecipesViewModel(get()) }
7776
viewModel { IngredientViewModel(get(), get(), get()) }
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package com.survivalcoding.gangnam2kiandroidstudy.core.di
22

33
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.CopyLinkUseCase
4+
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.GetRecipeDetailsUseCase
45
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.GetRecipeProcedureUseCase
6+
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.GetRecipesUseCase
57
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.GetSavedRecipesUseCase
68
import org.koin.dsl.module
79

810
val useCaseModule = module {
9-
single { GetRecipeProcedureUseCase(get()) }
1011
single { GetSavedRecipesUseCase(get(), get()) }
1112
single { CopyLinkUseCase(get()) }
13+
single { GetRecipesUseCase(get()) }
14+
single { GetRecipeDetailsUseCase(get()) }
15+
single { GetRecipeProcedureUseCase(get()) }
1216
}

app/src/main/java/com/survivalcoding/gangnam2kiandroidstudy/core/di/ViewModelModule.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ import org.koin.core.module.dsl.viewModel
99
import org.koin.dsl.module
1010

1111
val viewModelModule = module {
12-
viewModel { HomeViewModel(recipeRepository = get()) }
12+
viewModel { HomeViewModel(getRecipesUseCase = get()) }
1313
viewModel {
1414
SavedRecipesViewModel(
15-
recipeRepository = get(),
1615
getSavedRecipesUseCase = get(),
16+
getRecipeDetailsUseCase = get(),
1717
)
1818
}
1919
viewModel {
2020
SearchRecipesViewModel(
21-
recipeRepository = get(),
21+
getRecipesUseCase = get(),
2222
)
2323
}
2424
viewModel {
2525
IngredientViewModel(
26-
recipeRepository = get(),
26+
getRecipeDetailsUseCase = get(),
2727
getRecipeProcedureUseCase = get(),
2828
copyLinkUseCase = get(),
2929
)
Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,13 @@
11
package com.survivalcoding.gangnam2kiandroidstudy.domain.usecase
22

33
import com.survivalcoding.gangnam2kiandroidstudy.core.Result
4-
import com.survivalcoding.gangnam2kiandroidstudy.domain.repository.ProcedureRepository
4+
import com.survivalcoding.gangnam2kiandroidstudy.domain.model.Recipe
5+
import com.survivalcoding.gangnam2kiandroidstudy.domain.repository.RecipeRepository
56

6-
class GetRecipeProcedureUseCase(
7-
private val procedureRepository: ProcedureRepository,
7+
class GetRecipeDetailsUseCase(
8+
private val recipeRepository: RecipeRepository
89
) {
9-
suspend fun execute(recipeId: Long): Result<List<String>, String> {
10-
try {
11-
val result = procedureRepository.getProcedure(recipeId)
12-
return Result.Success(
13-
listOf(
14-
"Lorem Ipsum tempor incididunt ut labore et dolore,in voluptate velit esse cillum dolore eu fugiat nulla pariatur?",
15-
"Lorem Ipsum tempor incididunt ut labore et dolore,in voluptate velit esse cillum dolore eu fugiat nulla pariatur? Tempor incididunt ut labore et dolore,in voluptate velit esse cillum dolore eu fugiat nulla pariatur?",
16-
"Lorem Ipsum tempor incididunt ut labore et dolore,in voluptate velit esse cillum dolore eu fugiat nulla pariatur?",
17-
"Lorem Ipsum tempor incididunt ut labore et dolore,in voluptate velit esse cillum dolore eu fugiat nulla pariatur?",
18-
)
19-
)
20-
} catch (e: Exception) {
21-
return Result.Error("Failed to get recipe's procedure: $e")
22-
}
10+
suspend fun execute(id: Long): Result<Recipe, String> {
11+
return recipeRepository.findRecipe(id)
2312
}
2413
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.survivalcoding.gangnam2kiandroidstudy.domain.usecase
2+
3+
import com.survivalcoding.gangnam2kiandroidstudy.core.Result
4+
import com.survivalcoding.gangnam2kiandroidstudy.domain.repository.ProcedureRepository
5+
6+
class GetRecipeProcedureUseCase(
7+
private val procedureRepository: ProcedureRepository,
8+
) {
9+
suspend fun execute(recipeId: Long): Result<List<String>, String> {
10+
try {
11+
val result = procedureRepository.getProcedure(recipeId)
12+
return Result.Success(
13+
listOf(
14+
"Lorem Ipsum tempor incididunt ut labore et dolore,in voluptate velit esse cillum dolore eu fugiat nulla pariatur?",
15+
"Lorem Ipsum tempor incididunt ut labore et dolore,in voluptate velit esse cillum dolore eu fugiat nulla pariatur? Tempor incididunt ut labore et dolore,in voluptate velit esse cillum dolore eu fugiat nulla pariatur?",
16+
"Lorem Ipsum tempor incididunt ut labore et dolore,in voluptate velit esse cillum dolore eu fugiat nulla pariatur?",
17+
"Lorem Ipsum tempor incididunt ut labore et dolore,in voluptate velit esse cillum dolore eu fugiat nulla pariatur?",
18+
)
19+
)
20+
} catch (e: Exception) {
21+
return Result.Error("Failed to get recipe's procedure: $e")
22+
}
23+
}
24+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.survivalcoding.gangnam2kiandroidstudy.domain.usecase
2+
3+
import com.survivalcoding.gangnam2kiandroidstudy.core.Result
4+
import com.survivalcoding.gangnam2kiandroidstudy.domain.model.Recipe
5+
import com.survivalcoding.gangnam2kiandroidstudy.domain.repository.RecipeRepository
6+
7+
class GetRecipesUseCase(
8+
private val recipeRepository: RecipeRepository
9+
) {
10+
suspend fun execute(): Result<List<Recipe>, String> {
11+
return recipeRepository.findRecipes()
12+
}
13+
}

app/src/main/java/com/survivalcoding/gangnam2kiandroidstudy/presentation/screen/home/HomeViewModel.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import androidx.lifecycle.viewModelScope
55
import com.survivalcoding.gangnam2kiandroidstudy.core.Result
66
import com.survivalcoding.gangnam2kiandroidstudy.domain.model.RecipeCategory
77
import com.survivalcoding.gangnam2kiandroidstudy.domain.model.toCategory
8-
import com.survivalcoding.gangnam2kiandroidstudy.domain.repository.RecipeRepository
8+
import com.survivalcoding.gangnam2kiandroidstudy.domain.model.toCategory
9+
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.GetRecipesUseCase
910
import kotlinx.coroutines.Job
1011
import kotlinx.coroutines.flow.MutableSharedFlow
1112
import kotlinx.coroutines.flow.MutableStateFlow
@@ -16,7 +17,7 @@ import kotlinx.coroutines.flow.update
1617
import kotlinx.coroutines.launch
1718

1819
class HomeViewModel(
19-
private val recipeRepository: RecipeRepository,
20+
private val getRecipesUseCase: GetRecipesUseCase,
2021
) : ViewModel() {
2122

2223
private val _state = MutableStateFlow(HomeState())
@@ -98,7 +99,7 @@ class HomeViewModel(
9899
loadJob = viewModelScope.launch {
99100
_state.update { it.copy(isLoading = true, isError = false) }
100101

101-
when (val response = recipeRepository.findRecipes()) {
102+
when (val response = getRecipesUseCase.execute()) {
102103
is Result.Success -> _state.update { currentState ->
103104
val all = response.data
104105

app/src/main/java/com/survivalcoding/gangnam2kiandroidstudy/presentation/screen/ingredient/IngredientViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package com.survivalcoding.gangnam2kiandroidstudy.presentation.screen.ingredient
33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
55
import com.survivalcoding.gangnam2kiandroidstudy.core.Result
6-
import com.survivalcoding.gangnam2kiandroidstudy.domain.repository.RecipeRepository
76
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.CopyLinkUseCase
7+
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.GetRecipeDetailsUseCase
88
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.GetRecipeProcedureUseCase
99
import kotlinx.coroutines.flow.MutableStateFlow
1010
import kotlinx.coroutines.flow.StateFlow
@@ -13,7 +13,7 @@ import kotlinx.coroutines.flow.update
1313
import kotlinx.coroutines.launch
1414

1515
class IngredientViewModel(
16-
private val recipeRepository: RecipeRepository,
16+
private val getRecipeDetailsUseCase: GetRecipeDetailsUseCase,
1717
private val getRecipeProcedureUseCase: GetRecipeProcedureUseCase,
1818
private val copyLinkUseCase: CopyLinkUseCase,
1919
) : ViewModel() {
@@ -27,7 +27,7 @@ class IngredientViewModel(
2727

2828
fun loadRecipeDetail(recipeId: Long) {
2929
viewModelScope.launch {
30-
when (val response = recipeRepository.findRecipe(recipeId)) {
30+
when (val response = getRecipeDetailsUseCase.execute(recipeId)) {
3131
is Result.Success -> _state.update { it.copy(recipe = response.data) }
3232

3333
is Result.Error -> println("에러 처리")

app/src/main/java/com/survivalcoding/gangnam2kiandroidstudy/presentation/screen/saved_recipe/SavedRecipesViewModel.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.survivalcoding.gangnam2kiandroidstudy.presentation.screen.saved_reci
33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
55
import com.survivalcoding.gangnam2kiandroidstudy.core.Result
6-
import com.survivalcoding.gangnam2kiandroidstudy.domain.repository.RecipeRepository
6+
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.GetRecipeDetailsUseCase
77
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.GetSavedRecipesUseCase
88
import kotlinx.coroutines.flow.MutableStateFlow
99
import kotlinx.coroutines.flow.StateFlow
@@ -12,8 +12,8 @@ import kotlinx.coroutines.flow.update
1212
import kotlinx.coroutines.launch
1313

1414
class SavedRecipesViewModel(
15-
private val recipeRepository: RecipeRepository,
1615
private val getSavedRecipesUseCase: GetSavedRecipesUseCase,
16+
private val getRecipeDetailsUseCase: GetRecipeDetailsUseCase,
1717
) : ViewModel() {
1818

1919
private val _state = MutableStateFlow(SavedRecipesState())
@@ -27,7 +27,7 @@ class SavedRecipesViewModel(
2727
}
2828

2929
suspend fun loadRecipes() {
30-
when (val response = recipeRepository.findRecipes()) {
30+
when (val response = getSavedRecipesUseCase.execute()) {
3131
is Result.Success -> _state.update {
3232
it.copy(savedRecipes = response.data)
3333
}
@@ -37,7 +37,7 @@ class SavedRecipesViewModel(
3737
}
3838

3939
suspend fun saveNewRecipe(id: Long) {
40-
when (val response = recipeRepository.findRecipe(id)) {
40+
when (val response = getRecipeDetailsUseCase.execute(id)) {
4141
is Result.Success -> _state.update { currentState ->
4242
// 이미 저장된 레시피면 그대로
4343
if (currentState.savedRecipes.any { it.id == id }) {

app/src/main/java/com/survivalcoding/gangnam2kiandroidstudy/presentation/screen/search_recipe/SearchRecipesViewModel.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import androidx.lifecycle.ViewModel
55
import androidx.lifecycle.viewModelScope
66
import com.survivalcoding.gangnam2kiandroidstudy.core.Result
77
import com.survivalcoding.gangnam2kiandroidstudy.domain.model.toFormatString
8-
import com.survivalcoding.gangnam2kiandroidstudy.domain.repository.RecipeRepository
8+
import com.survivalcoding.gangnam2kiandroidstudy.domain.model.toFormatString
9+
import com.survivalcoding.gangnam2kiandroidstudy.domain.usecase.GetRecipesUseCase
910
import kotlinx.coroutines.FlowPreview
1011
import kotlinx.coroutines.flow.MutableSharedFlow
1112
import kotlinx.coroutines.flow.MutableStateFlow
@@ -20,7 +21,7 @@ import kotlinx.coroutines.flow.update
2021
import kotlinx.coroutines.launch
2122

2223
open class SearchRecipesViewModel(
23-
private val recipeRepository: RecipeRepository,
24+
private val getRecipesUseCase: GetRecipesUseCase,
2425
) : ViewModel() {
2526

2627
// 상태
@@ -165,7 +166,7 @@ open class SearchRecipesViewModel(
165166
viewModelScope.launch {
166167
_state.update { it.copy(isLoading = true) }
167168

168-
when (val response = recipeRepository.findRecipes()) {
169+
when (val response = getRecipesUseCase.execute()) {
169170
is Result.Success -> {
170171
_state.update { currentState ->
171172
currentState.copy(

0 commit comments

Comments
 (0)