diff --git a/Core/build.gradle b/Core/build.gradle index e773b9c..fd24c35 100644 --- a/Core/build.gradle +++ b/Core/build.gradle @@ -8,6 +8,13 @@ java { targetCompatibility = JavaVersion.VERSION_1_7 } +compileKotlin { + kotlinOptions { + freeCompilerArgs = ["-Xallow-result-return-type"] + } +} + dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1" } \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/data/datasource/GroceryDataSource.kt b/Core/src/main/java/com/mychefassistant/core/data/datasource/GroceryDataSource.kt new file mode 100644 index 0000000..1ce659c --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/data/datasource/GroceryDataSource.kt @@ -0,0 +1,15 @@ +package com.mychefassistant.core.data.datasource + +import com.mychefassistant.core.domain.Grocery +import com.mychefassistant.core.domain.Kitchen +import kotlinx.coroutines.flow.Flow + +interface GroceryDataSource { + suspend fun add(kitchen: Kitchen, grocery: Grocery) + + fun getAll(kitchen: Kitchen): Flow> + + suspend fun remove(kitchen: Kitchen, grocery: Grocery) + + suspend fun update(kitchen: Kitchen, grocery: Grocery) +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/data/datasource/IngredientDataSource.kt b/Core/src/main/java/com/mychefassistant/core/data/datasource/IngredientDataSource.kt deleted file mode 100644 index cbb543f..0000000 --- a/Core/src/main/java/com/mychefassistant/core/data/datasource/IngredientDataSource.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.mychefassistant.core.data.datasource - -import com.mychefassistant.core.domain.Kitchen -import com.mychefassistant.core.domain.Ingredient - -interface IngredientDataSource { - suspend fun add(kitchen: Kitchen, ingredient: Ingredient) - - suspend fun list(kitchen: Kitchen): List - - suspend fun remove(kitchen: Kitchen, ingredient: Ingredient) - - suspend fun update(kitchen: Kitchen, ingredient: Ingredient) -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/data/datasource/KitchenDataSource.kt b/Core/src/main/java/com/mychefassistant/core/data/datasource/KitchenDataSource.kt index 07d0ffd..0ec0ee9 100644 --- a/Core/src/main/java/com/mychefassistant/core/data/datasource/KitchenDataSource.kt +++ b/Core/src/main/java/com/mychefassistant/core/data/datasource/KitchenDataSource.kt @@ -1,6 +1,7 @@ package com.mychefassistant.core.data.datasource import com.mychefassistant.core.domain.Kitchen +import kotlinx.coroutines.flow.Flow interface KitchenDataSource { suspend fun add(kitchen: Kitchen) @@ -9,7 +10,9 @@ interface KitchenDataSource { suspend fun update(kitchen: Kitchen) - suspend fun getAll(): List + fun getAll(): Flow> suspend fun getById(id: Int): Kitchen + + suspend fun find(kitchen: Kitchen): List } \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/data/repository/GroceryRepository.kt b/Core/src/main/java/com/mychefassistant/core/data/repository/GroceryRepository.kt new file mode 100644 index 0000000..00b120c --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/data/repository/GroceryRepository.kt @@ -0,0 +1,17 @@ +package com.mychefassistant.core.data.repository + +import com.mychefassistant.core.data.datasource.GroceryDataSource +import com.mychefassistant.core.domain.Grocery +import com.mychefassistant.core.domain.Kitchen + +class GroceryRepository(private val dataSource: GroceryDataSource) { + suspend fun addGrocery(kitchen: Kitchen, grocery: Grocery) = dataSource.add(kitchen, grocery) + + fun getGroceries(kitchen: Kitchen) = dataSource.getAll(kitchen) + + suspend fun removeGrocery(kitchen: Kitchen, grocery: Grocery) = + dataSource.remove(kitchen, grocery) + + suspend fun updateGrocery(kitchen: Kitchen, grocery: Grocery) = + dataSource.update(kitchen, grocery) +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/data/repository/IngredientRepository.kt b/Core/src/main/java/com/mychefassistant/core/data/repository/IngredientRepository.kt deleted file mode 100644 index 85e577c..0000000 --- a/Core/src/main/java/com/mychefassistant/core/data/repository/IngredientRepository.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.mychefassistant.core.data.repository - -import com.mychefassistant.core.data.datasource.IngredientDataSource -import com.mychefassistant.core.domain.Kitchen -import com.mychefassistant.core.domain.Ingredient - -class IngredientRepository(private val dataSource: IngredientDataSource) { - suspend fun addIngredient(kitchen: Kitchen, ingredient: Ingredient) = dataSource.add(kitchen, ingredient) - - suspend fun getIngredients(kitchen: Kitchen) = dataSource.list(kitchen) - - suspend fun removeIngredient(kitchen: Kitchen, ingredient: Ingredient) = dataSource.remove(kitchen, ingredient) - - suspend fun updateIngredient(kitchen: Kitchen, ingredient: Ingredient) = dataSource.update(kitchen, ingredient) -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/data/repository/KitchenRepository.kt b/Core/src/main/java/com/mychefassistant/core/data/repository/KitchenRepository.kt index 347a089..2e0de2c 100644 --- a/Core/src/main/java/com/mychefassistant/core/data/repository/KitchenRepository.kt +++ b/Core/src/main/java/com/mychefassistant/core/data/repository/KitchenRepository.kt @@ -10,7 +10,9 @@ class KitchenRepository(private val dataSource: KitchenDataSource) { suspend fun updateKitchen(kitchen: Kitchen) = dataSource.update(kitchen) - suspend fun getKitchens() = dataSource.getAll() + fun getKitchens() = dataSource.getAll() suspend fun getKitchenById(id: Int) = dataSource.getById(id) + + suspend fun findKitchen(kitchen: Kitchen) = dataSource.find(kitchen) } \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/domain/Grocery.kt b/Core/src/main/java/com/mychefassistant/core/domain/Grocery.kt new file mode 100644 index 0000000..2a16b30 --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/domain/Grocery.kt @@ -0,0 +1,9 @@ +package com.mychefassistant.core.domain + +data class Grocery( + val id: Int = 0, + val kitchen: Int, + val title: String, + val value: String = "", + val status: Boolean = false +) \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/domain/Ingredient.kt b/Core/src/main/java/com/mychefassistant/core/domain/Ingredient.kt deleted file mode 100644 index 2e52529..0000000 --- a/Core/src/main/java/com/mychefassistant/core/domain/Ingredient.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.mychefassistant.core.domain - -data class Ingredient( - val id: Int = 0, - val name: String, - val quantity: Double = 0.0 -) \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/AddGroceryUseCase.kt b/Core/src/main/java/com/mychefassistant/core/interactors/AddGroceryUseCase.kt new file mode 100644 index 0000000..e999f75 --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/interactors/AddGroceryUseCase.kt @@ -0,0 +1,13 @@ +package com.mychefassistant.core.interactors + +import com.mychefassistant.core.data.repository.GroceryRepository +import com.mychefassistant.core.domain.Grocery +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.utils.BaseSuspendUseCase + +class AddGroceryUseCase(private val groceryRepository: GroceryRepository) : + BaseSuspendUseCase, Unit>() { + override suspend fun execute(parameter: Pair): Result { + return Result.success(groceryRepository.addGrocery(parameter.first, parameter.second)) + } +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/AddIngredient.kt b/Core/src/main/java/com/mychefassistant/core/interactors/AddIngredient.kt deleted file mode 100644 index 079bc1d..0000000 --- a/Core/src/main/java/com/mychefassistant/core/interactors/AddIngredient.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.mychefassistant.core.interactors - -import com.mychefassistant.core.data.repository.IngredientRepository -import com.mychefassistant.core.domain.Kitchen -import com.mychefassistant.core.domain.Ingredient - -class AddIngredient(private val ingredientRepository: IngredientRepository) { - suspend operator fun invoke(kitchen: Kitchen, ingredient: Ingredient) = ingredientRepository.addIngredient(kitchen, ingredient) -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/AddKitchen.kt b/Core/src/main/java/com/mychefassistant/core/interactors/AddKitchen.kt deleted file mode 100644 index 2aa11f2..0000000 --- a/Core/src/main/java/com/mychefassistant/core/interactors/AddKitchen.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.mychefassistant.core.interactors - -import com.mychefassistant.core.data.repository.KitchenRepository -import com.mychefassistant.core.domain.Kitchen - -class AddKitchen(private val kitchenRepository: KitchenRepository) { - suspend operator fun invoke(kitchen: Kitchen) = kitchenRepository.addKitchen(kitchen) -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/AddKitchenUseCase.kt b/Core/src/main/java/com/mychefassistant/core/interactors/AddKitchenUseCase.kt new file mode 100644 index 0000000..b50278a --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/interactors/AddKitchenUseCase.kt @@ -0,0 +1,12 @@ +package com.mychefassistant.core.interactors + +import com.mychefassistant.core.data.repository.KitchenRepository +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.utils.BaseSuspendUseCase + +class AddKitchenUseCase(private val kitchenRepository: KitchenRepository) : + BaseSuspendUseCase() { + override suspend fun execute(parameter: Kitchen): Result { + return Result.success(kitchenRepository.addKitchen(parameter)) + } +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/FindKitchenUseCase.kt b/Core/src/main/java/com/mychefassistant/core/interactors/FindKitchenUseCase.kt new file mode 100644 index 0000000..beb926e --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/interactors/FindKitchenUseCase.kt @@ -0,0 +1,12 @@ +package com.mychefassistant.core.interactors + +import com.mychefassistant.core.data.repository.KitchenRepository +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.utils.BaseSuspendUseCase + +class FindKitchenUseCase(private val kitchenRepository: KitchenRepository) : + BaseSuspendUseCase>() { + override suspend fun execute(parameter: Kitchen): Result> { + return Result.success(kitchenRepository.findKitchen(parameter)) + } +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/GetGroceriesUseCase.kt b/Core/src/main/java/com/mychefassistant/core/interactors/GetGroceriesUseCase.kt new file mode 100644 index 0000000..82a1a02 --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/interactors/GetGroceriesUseCase.kt @@ -0,0 +1,14 @@ +package com.mychefassistant.core.interactors + +import com.mychefassistant.core.data.repository.GroceryRepository +import com.mychefassistant.core.domain.Grocery +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.utils.BaseSuspendUseCase +import kotlinx.coroutines.flow.Flow + +class GetGroceriesUseCase(private val groceryRepository: GroceryRepository) : + BaseSuspendUseCase>>() { + override suspend fun execute(parameter: Kitchen): Result>> { + return Result.success(groceryRepository.getGroceries(parameter)) + } +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/GetIngredients.kt b/Core/src/main/java/com/mychefassistant/core/interactors/GetIngredients.kt deleted file mode 100644 index bd3002c..0000000 --- a/Core/src/main/java/com/mychefassistant/core/interactors/GetIngredients.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.mychefassistant.core.interactors - -import com.mychefassistant.core.data.repository.IngredientRepository -import com.mychefassistant.core.domain.Kitchen - -class GetIngredients(private val itemRepository: IngredientRepository) { - suspend operator fun invoke(kitchen: Kitchen) = itemRepository.getIngredients(kitchen) -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchenById.kt b/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchenById.kt deleted file mode 100644 index 58bdad8..0000000 --- a/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchenById.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.mychefassistant.core.interactors - -import com.mychefassistant.core.data.repository.KitchenRepository - -class GetKitchenById(private val kitchenRepository: KitchenRepository) { - suspend operator fun invoke(id: Int) = kitchenRepository.getKitchenById(id) -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchenByIdUseCase.kt b/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchenByIdUseCase.kt new file mode 100644 index 0000000..00390cb --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchenByIdUseCase.kt @@ -0,0 +1,12 @@ +package com.mychefassistant.core.interactors + +import com.mychefassistant.core.data.repository.KitchenRepository +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.utils.BaseSuspendUseCase + +class GetKitchenByIdUseCase(private val kitchenRepository: KitchenRepository) : + BaseSuspendUseCase() { + override suspend fun execute(parameter: Int): Result { + return Result.success(kitchenRepository.getKitchenById(parameter)) + } +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchens.kt b/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchens.kt deleted file mode 100644 index 15f28fe..0000000 --- a/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchens.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.mychefassistant.core.interactors - -import com.mychefassistant.core.data.repository.KitchenRepository - -class GetKitchens(private val kitchenRepository: KitchenRepository) { - suspend operator fun invoke() = kitchenRepository.getKitchens() -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchensUseCase.kt b/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchensUseCase.kt new file mode 100644 index 0000000..c67d653 --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/interactors/GetKitchensUseCase.kt @@ -0,0 +1,13 @@ +package com.mychefassistant.core.interactors + +import com.mychefassistant.core.data.repository.KitchenRepository +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.utils.BaseUseCase +import kotlinx.coroutines.flow.Flow + +class GetKitchensUseCase(private val kitchenRepository: KitchenRepository) : + BaseUseCase>>() { + override fun execute(parameter: Boolean): Result>> { + return Result.success(kitchenRepository.getKitchens()) + } +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/RemoveGroceryUseCase.kt b/Core/src/main/java/com/mychefassistant/core/interactors/RemoveGroceryUseCase.kt new file mode 100644 index 0000000..800ca0c --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/interactors/RemoveGroceryUseCase.kt @@ -0,0 +1,13 @@ +package com.mychefassistant.core.interactors + +import com.mychefassistant.core.data.repository.GroceryRepository +import com.mychefassistant.core.domain.Grocery +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.utils.BaseSuspendUseCase + +class RemoveGroceryUseCase(private val groceryRepository: GroceryRepository) : + BaseSuspendUseCase, Unit>() { + override suspend fun execute(parameter: Pair): Result { + return Result.success(groceryRepository.removeGrocery(parameter.first, parameter.second)) + } +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/RemoveIngredient.kt b/Core/src/main/java/com/mychefassistant/core/interactors/RemoveIngredient.kt deleted file mode 100644 index 5d2e53e..0000000 --- a/Core/src/main/java/com/mychefassistant/core/interactors/RemoveIngredient.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.mychefassistant.core.interactors - -import com.mychefassistant.core.data.repository.IngredientRepository -import com.mychefassistant.core.domain.Kitchen -import com.mychefassistant.core.domain.Ingredient - -class RemoveIngredient(private val ingredientRepository: IngredientRepository) { - suspend operator fun invoke(kitchen: Kitchen, ingredient: Ingredient) = ingredientRepository.removeIngredient(kitchen, ingredient) -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/RemoveKitchen.kt b/Core/src/main/java/com/mychefassistant/core/interactors/RemoveKitchen.kt deleted file mode 100644 index 06c2e88..0000000 --- a/Core/src/main/java/com/mychefassistant/core/interactors/RemoveKitchen.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.mychefassistant.core.interactors - -import com.mychefassistant.core.data.repository.KitchenRepository -import com.mychefassistant.core.domain.Kitchen - -class RemoveKitchen(private val kitchenRepository: KitchenRepository) { - suspend operator fun invoke(kitchen: Kitchen) = kitchenRepository.removeKitchen(kitchen) -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/RemoveKitchenUseCase.kt b/Core/src/main/java/com/mychefassistant/core/interactors/RemoveKitchenUseCase.kt new file mode 100644 index 0000000..ce63a63 --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/interactors/RemoveKitchenUseCase.kt @@ -0,0 +1,12 @@ +package com.mychefassistant.core.interactors + +import com.mychefassistant.core.data.repository.KitchenRepository +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.utils.BaseSuspendUseCase + +class RemoveKitchenUseCase(private val kitchenRepository: KitchenRepository) : + BaseSuspendUseCase() { + override suspend fun execute(parameter: Kitchen): Result { + return Result.success(kitchenRepository.removeKitchen(parameter)) + } +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/UpdateGroceryUseCase.kt b/Core/src/main/java/com/mychefassistant/core/interactors/UpdateGroceryUseCase.kt new file mode 100644 index 0000000..20a38d8 --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/interactors/UpdateGroceryUseCase.kt @@ -0,0 +1,13 @@ +package com.mychefassistant.core.interactors + +import com.mychefassistant.core.data.repository.GroceryRepository +import com.mychefassistant.core.domain.Grocery +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.utils.BaseSuspendUseCase + +class UpdateGroceryUseCase(private val groceryRepository: GroceryRepository) : + BaseSuspendUseCase, Unit>() { + override suspend fun execute(parameter: Pair): Result { + return Result.success(groceryRepository.updateGrocery(parameter.first, parameter.second)) + } +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/UpdateIngredient.kt b/Core/src/main/java/com/mychefassistant/core/interactors/UpdateIngredient.kt deleted file mode 100644 index 20c77eb..0000000 --- a/Core/src/main/java/com/mychefassistant/core/interactors/UpdateIngredient.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.mychefassistant.core.interactors - -import com.mychefassistant.core.data.repository.IngredientRepository -import com.mychefassistant.core.domain.Kitchen -import com.mychefassistant.core.domain.Ingredient - -class UpdateIngredient(private val ingredientRepository: IngredientRepository) { - suspend operator fun invoke(kitchen: Kitchen, ingredient: Ingredient) = ingredientRepository.updateIngredient(kitchen, ingredient) -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/UpdateKitchen.kt b/Core/src/main/java/com/mychefassistant/core/interactors/UpdateKitchen.kt deleted file mode 100644 index e0c7325..0000000 --- a/Core/src/main/java/com/mychefassistant/core/interactors/UpdateKitchen.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.mychefassistant.core.interactors - -import com.mychefassistant.core.data.repository.KitchenRepository -import com.mychefassistant.core.domain.Kitchen - -class UpdateKitchen(private val kitchenRepository: KitchenRepository) { - suspend operator fun invoke(kitchen: Kitchen) = kitchenRepository.updateKitchen(kitchen) -} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/interactors/UpdateKitchenUseCase.kt b/Core/src/main/java/com/mychefassistant/core/interactors/UpdateKitchenUseCase.kt new file mode 100644 index 0000000..2d6909a --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/interactors/UpdateKitchenUseCase.kt @@ -0,0 +1,12 @@ +package com.mychefassistant.core.interactors + +import com.mychefassistant.core.data.repository.KitchenRepository +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.utils.BaseSuspendUseCase + +class UpdateKitchenUseCase(private val kitchenRepository: KitchenRepository) : + BaseSuspendUseCase() { + override suspend fun execute(parameter: Kitchen): Result { + return Result.success(kitchenRepository.updateKitchen(parameter)) + } +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/utils/BaseSuspendUseCase.kt b/Core/src/main/java/com/mychefassistant/core/utils/BaseSuspendUseCase.kt new file mode 100644 index 0000000..8768cd5 --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/utils/BaseSuspendUseCase.kt @@ -0,0 +1,12 @@ +package com.mychefassistant.core.utils + +abstract class BaseSuspendUseCase { + suspend operator fun invoke(parameter: Request): Result = try { + execute(parameter) + } catch (e: Exception) { + Result.failure(e) + } + + @Throws(RuntimeException::class) + protected abstract suspend fun execute(parameter: Request): Result +} \ No newline at end of file diff --git a/Core/src/main/java/com/mychefassistant/core/utils/BaseUseCase.kt b/Core/src/main/java/com/mychefassistant/core/utils/BaseUseCase.kt new file mode 100644 index 0000000..61ca965 --- /dev/null +++ b/Core/src/main/java/com/mychefassistant/core/utils/BaseUseCase.kt @@ -0,0 +1,12 @@ +package com.mychefassistant.core.utils + +abstract class BaseUseCase { + open operator fun invoke(parameter: Request): Result = try { + execute(parameter) + } catch (e: Exception) { + Result.failure(e) + } + + @Throws(RuntimeException::class) + protected abstract fun execute(parameter: Request): Result +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7ee80b6..a9cfe96 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,6 +30,7 @@ android { } kotlinOptions { jvmTarget = '1.8' + freeCompilerArgs = ["-Xallow-result-return-type"] } } diff --git a/app/src/main/java/com/mychefassistant/framework/ChefAssistantApplication.kt b/app/src/main/java/com/mychefassistant/framework/ChefAssistantApplication.kt index 642eff4..ddff2b8 100644 --- a/app/src/main/java/com/mychefassistant/framework/ChefAssistantApplication.kt +++ b/app/src/main/java/com/mychefassistant/framework/ChefAssistantApplication.kt @@ -1,6 +1,11 @@ package com.mychefassistant.framework import android.app.Application +import com.mychefassistant.framework.modules.databaseModule +import com.mychefassistant.framework.modules.roomsModule +import com.mychefassistant.framework.modules.usecase.groceryUseCaseModule +import com.mychefassistant.framework.modules.usecase.kitchenUseCaseModule +import com.mychefassistant.framework.modules.viewModelModule import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidLogger import org.koin.core.context.startKoin @@ -11,7 +16,13 @@ class ChefAssistantApplication : Application() { startKoin { androidLogger() androidContext(this@ChefAssistantApplication) - modules(databaseModule, roomsModule, fragmentModule) + modules( + databaseModule, + roomsModule, + kitchenUseCaseModule, + groceryUseCaseModule, + viewModelModule + ) } } } \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/ChefAssistantViewModel.kt b/app/src/main/java/com/mychefassistant/framework/ChefAssistantViewModel.kt index f4cea5b..aa06c9b 100644 --- a/app/src/main/java/com/mychefassistant/framework/ChefAssistantViewModel.kt +++ b/app/src/main/java/com/mychefassistant/framework/ChefAssistantViewModel.kt @@ -1,14 +1,51 @@ package com.mychefassistant.framework -import android.app.Application -import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModel +import com.mychefassistant.utils.Event -open class ChefAssistantViewModel( - application: Application, - protected val interactors: Interactors -) : - AndroidViewModel(application) { +abstract class ChefAssistantViewModel : ViewModel() { + private val event: MutableLiveData = MutableLiveData() + private var onErrorListener: (Event.Error) -> Unit = fun(_) {} + private var onInfoListener: (Event.Info) -> Unit = fun(_) {} - protected val application: ChefAssistantApplication = getApplication() + protected fun setEvent(x: Event) = event.postValue(x) + open fun onFragmentEventListener(event: Event.Info) {} + + fun eventListener(lifecycleOwner: LifecycleOwner): ChefAssistantViewModel { + event.observe(lifecycleOwner, Observer { + when (it) { + is Event.Error -> onErrorListener(it) + is Event.Info -> when(it.type) { + onFragmentEvent -> onFragmentEventListener(it.data as Event.Info) + else -> onInfoListener(it) + } + } + }) + return this + } + + fun onError(handle: (Event.Error) -> Unit): ChefAssistantViewModel { + onErrorListener = handle + return this + } + + fun onInfo(handle: (Event.Info) -> Unit): ChefAssistantViewModel { + onInfoListener = handle + return this + } + + fun resetEvents() = event.postValue(Event.Info(onResetEvents)) + + fun setFragmentEvent(event: Event.Info) { + setEvent(Event.Info(onFragmentEvent, event)) + } + + companion object { + const val onResetEvents = "onResetEvents" + const val onFragmentEvent = "onFragmentEvent" + } } \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/Interactors.kt b/app/src/main/java/com/mychefassistant/framework/Interactors.kt deleted file mode 100644 index b5fc0e2..0000000 --- a/app/src/main/java/com/mychefassistant/framework/Interactors.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.mychefassistant.framework - -import com.mychefassistant.core.interactors.*; - -data class Interactors( - val addKitchen: AddKitchen, - val getKitchens: GetKitchens, - val getKitchenById: GetKitchenById, - val removeKitchen: RemoveKitchen, - val updateKitchen: UpdateKitchen, - val addIngredient: AddIngredient, - val getIngredients: GetIngredients, - val removeIngredient: RemoveIngredient, - val updateIngredient: UpdateIngredient -) \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/Modules.kt b/app/src/main/java/com/mychefassistant/framework/Modules.kt deleted file mode 100644 index 191f3db..0000000 --- a/app/src/main/java/com/mychefassistant/framework/Modules.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.mychefassistant.framework - -import androidx.room.Room -import com.mychefassistant.core.data.datasource.IngredientDataSource -import com.mychefassistant.core.data.repository.IngredientRepository -import com.mychefassistant.core.data.datasource.KitchenDataSource -import com.mychefassistant.core.data.repository.KitchenRepository -import com.mychefassistant.core.interactors.* -import com.mychefassistant.framework.db.ChefAssistantDatabase -import com.mychefassistant.presentation.ingredient.IngredientViewModel -import com.mychefassistant.presentation.kitchen.insert.KitchenInsertViewModel -import com.mychefassistant.presentation.kitchen.manage.KitchenManageViewModel -import org.koin.android.ext.koin.androidApplication -import org.koin.androidx.viewmodel.dsl.viewModel -import org.koin.dsl.module - -val databaseModule = module { - single { - Room.databaseBuilder( - androidApplication(), - ChefAssistantDatabase::class.java, - "ca_v1.db" - ) - .fallbackToDestructiveMigration() - .build() - } - single { get().kitchenDao() } - single { get().ingredientDao() } -} - -val roomsModule = module { - single { RoomKitchenDataSource(get()) as KitchenDataSource } - single { RoomIngredientDataSource(get()) as IngredientDataSource } - single { KitchenRepository(get()) } - single { IngredientRepository(get()) } - - factory { - Interactors( - AddKitchen(get()), - GetKitchens(get()), - GetKitchenById(get()), - RemoveKitchen(get()), - UpdateKitchen(get()), - AddIngredient(get()), - GetIngredients(get()), - RemoveIngredient(get()), - UpdateIngredient(get()) - ) - } -} - -val fragmentModule = module { - viewModel { KitchenManageViewModel(androidApplication(), get()) } - viewModel { KitchenInsertViewModel(androidApplication(), get()) } - viewModel { IngredientViewModel(androidApplication(), get()) } -} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/RoomIngredientDataSource.kt b/app/src/main/java/com/mychefassistant/framework/RoomIngredientDataSource.kt deleted file mode 100644 index d8f1ef6..0000000 --- a/app/src/main/java/com/mychefassistant/framework/RoomIngredientDataSource.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.mychefassistant.framework - -import com.mychefassistant.core.data.datasource.IngredientDataSource -import com.mychefassistant.core.domain.Kitchen -import com.mychefassistant.core.domain.Ingredient -import com.mychefassistant.framework.db.IngredientDao -import com.mychefassistant.framework.db.IngredientEntity - -class RoomIngredientDataSource(private val ingredientDao: IngredientDao) : - IngredientDataSource { - override suspend fun add(kitchen: Kitchen, ingredient: Ingredient) = ingredientDao.addIngredient( - IngredientEntity(kitchen = kitchen.id, title = ingredient.name, quantity = ingredient.quantity) - ) - - override suspend fun list(kitchen: Kitchen): List = - ingredientDao.getIngredientByKitchen(kitchen.id).map { - Ingredient(it.id, it.title, it.quantity) - } - - override suspend fun remove(kitchen: Kitchen, ingredient: Ingredient) = ingredientDao.removeIngredient( - IngredientEntity(ingredient.id, kitchen.id, ingredient.name, ingredient.quantity) - ) - - override suspend fun update(kitchen: Kitchen, ingredient: Ingredient) = ingredientDao.updateIngredient( - IngredientEntity(ingredient.id, kitchen.id, ingredient.name, ingredient.quantity) - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/RoomKitchenDataSource.kt b/app/src/main/java/com/mychefassistant/framework/RoomKitchenDataSource.kt deleted file mode 100644 index 566d7d5..0000000 --- a/app/src/main/java/com/mychefassistant/framework/RoomKitchenDataSource.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.mychefassistant.framework - -import com.mychefassistant.core.data.datasource.KitchenDataSource -import com.mychefassistant.core.domain.Kitchen -import com.mychefassistant.framework.db.KitchenDao -import com.mychefassistant.framework.db.KitchenEntity - -class RoomKitchenDataSource(private val kitchenDao: KitchenDao) : - KitchenDataSource { - override suspend fun add(kitchen: Kitchen) = kitchenDao.addKitchen( - KitchenEntity(title = kitchen.title) - ) - - override suspend fun getAll(): List = kitchenDao.getAll().map { - Kitchen(it.id, it.title) - } - - override suspend fun getById(id: Int): Kitchen = kitchenDao.getById(id)[0] - - override suspend fun remove(kitchen: Kitchen) = kitchenDao.removeKitchen( - KitchenEntity(kitchen.id, kitchen.title) - ) - - override suspend fun update(kitchen: Kitchen) = kitchenDao.updateKitchen( - KitchenEntity(kitchen.id, kitchen.title) - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/db/ChefAssistantDatabase.kt b/app/src/main/java/com/mychefassistant/framework/db/ChefAssistantDatabase.kt index 41344cb..a592401 100644 --- a/app/src/main/java/com/mychefassistant/framework/db/ChefAssistantDatabase.kt +++ b/app/src/main/java/com/mychefassistant/framework/db/ChefAssistantDatabase.kt @@ -2,13 +2,17 @@ package com.mychefassistant.framework.db import androidx.room.Database import androidx.room.RoomDatabase +import com.mychefassistant.framework.db.dao.GroceryDao +import com.mychefassistant.framework.db.dao.KitchenDao +import com.mychefassistant.framework.db.entity.GroceryEntity +import com.mychefassistant.framework.db.entity.KitchenEntity @Database( - entities = [KitchenEntity::class, IngredientEntity::class], + entities = [KitchenEntity::class, GroceryEntity::class], version = 1, exportSchema = false ) abstract class ChefAssistantDatabase : RoomDatabase() { abstract fun kitchenDao(): KitchenDao - abstract fun ingredientDao(): IngredientDao + abstract fun groceryDao(): GroceryDao } \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/db/IngredientDao.kt b/app/src/main/java/com/mychefassistant/framework/db/IngredientDao.kt deleted file mode 100644 index 73a69dd..0000000 --- a/app/src/main/java/com/mychefassistant/framework/db/IngredientDao.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.mychefassistant.framework.db - -import androidx.room.* -import androidx.room.OnConflictStrategy.REPLACE - -@Dao -interface IngredientDao { - @Insert(onConflict = REPLACE) - suspend fun addIngredient(item: IngredientEntity) - - @Query("select * from ingredients where kitchen = :kitchen") - suspend fun getIngredientByKitchen(kitchen: Int): List - - @Delete - suspend fun removeIngredient(item: IngredientEntity) - - @Update - suspend fun updateIngredient(item: IngredientEntity) -} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/db/IngredientEntity.kt b/app/src/main/java/com/mychefassistant/framework/db/IngredientEntity.kt deleted file mode 100644 index 5e3adf3..0000000 --- a/app/src/main/java/com/mychefassistant/framework/db/IngredientEntity.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.mychefassistant.framework.db - -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.PrimaryKey - -@Entity(tableName = "ingredients") -data class IngredientEntity( - @PrimaryKey(autoGenerate = true) - val id: Int = 0, - - @ColumnInfo(name = "kitchen") - val kitchen: Int, - - @ColumnInfo(name = "title") - val title: String, - - @ColumnInfo(name = "quantity") - val quantity: Double -) \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/db/KitchenDao.kt b/app/src/main/java/com/mychefassistant/framework/db/KitchenDao.kt deleted file mode 100644 index a931e16..0000000 --- a/app/src/main/java/com/mychefassistant/framework/db/KitchenDao.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.mychefassistant.framework.db - -import androidx.room.* -import androidx.room.OnConflictStrategy.REPLACE -import com.mychefassistant.core.domain.Kitchen - -@Dao -interface KitchenDao { - @Insert(onConflict = REPLACE) - suspend fun addKitchen(kitchen: KitchenEntity) - - @Query("select * from kitchens") - suspend fun getAll(): List - - @Query("select * from kitchens where id = :id") - suspend fun getById(id: Int): List - - @Delete - suspend fun removeKitchen(kitchen: KitchenEntity) - - @Update - suspend fun updateKitchen(kitchen: KitchenEntity) -} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/db/dao/GroceryDao.kt b/app/src/main/java/com/mychefassistant/framework/db/dao/GroceryDao.kt new file mode 100644 index 0000000..cf70c71 --- /dev/null +++ b/app/src/main/java/com/mychefassistant/framework/db/dao/GroceryDao.kt @@ -0,0 +1,21 @@ +package com.mychefassistant.framework.db.dao + +import androidx.room.* +import androidx.room.OnConflictStrategy.REPLACE +import com.mychefassistant.framework.db.entity.GroceryEntity +import kotlinx.coroutines.flow.Flow + +@Dao +interface GroceryDao { + @Insert(onConflict = REPLACE) + suspend fun addGrocery(grocery: GroceryEntity) + + @Query("SELECT * FROM groceries where kitchen = :kitchenId") + fun getAll(kitchenId: Int): Flow> + + @Delete + suspend fun removeGrocery(grocery: GroceryEntity) + + @Update + suspend fun updateGrocery(grocery: GroceryEntity) +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/db/dao/KitchenDao.kt b/app/src/main/java/com/mychefassistant/framework/db/dao/KitchenDao.kt new file mode 100644 index 0000000..b9ec9bf --- /dev/null +++ b/app/src/main/java/com/mychefassistant/framework/db/dao/KitchenDao.kt @@ -0,0 +1,32 @@ +package com.mychefassistant.framework.db.dao + +import androidx.room.* +import androidx.room.OnConflictStrategy.REPLACE +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.framework.db.entity.KitchenEntity +import kotlinx.coroutines.flow.Flow + +@Dao +interface KitchenDao { + @Insert + suspend fun addKitchen(kitchen: KitchenEntity) + + @Query("select * from kitchens") + fun getAll(): Flow> + + @Query("select * from kitchens where id = :id") + suspend fun getById(id: Int): List + + @Query("select * from kitchens where title = :title and icon is :icon and location is :location") + suspend fun findByArgs(title: String, icon: Int?, location: Int?): List + + suspend fun find(kitchen: Kitchen): List { + return findByArgs(kitchen.title, kitchen.icon, kitchen.location) + } + + @Delete + suspend fun removeKitchen(kitchen: KitchenEntity) + + @Update + suspend fun updateKitchen(kitchen: KitchenEntity) +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/db/datasource/RoomGroceryDataSource.kt b/app/src/main/java/com/mychefassistant/framework/db/datasource/RoomGroceryDataSource.kt new file mode 100644 index 0000000..0a7fe03 --- /dev/null +++ b/app/src/main/java/com/mychefassistant/framework/db/datasource/RoomGroceryDataSource.kt @@ -0,0 +1,44 @@ +package com.mychefassistant.framework.db.datasource + +import com.mychefassistant.core.data.datasource.GroceryDataSource +import com.mychefassistant.core.domain.Grocery +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.framework.db.dao.GroceryDao +import com.mychefassistant.framework.db.entity.GroceryEntity +import kotlinx.coroutines.flow.map + +class RoomGroceryDataSource(private val groceryDao: GroceryDao) : GroceryDataSource { + override suspend fun add(kitchen: Kitchen, grocery: Grocery) = groceryDao.addGrocery( + toEntity(kitchen, grocery) + ) + + override fun getAll(kitchen: Kitchen) = groceryDao.getAll(kitchen.id).map { list -> + list.map { toDomain(kitchen, it) } + } + + override suspend fun remove(kitchen: Kitchen, grocery: Grocery) = groceryDao.removeGrocery( + toEntity(kitchen, grocery) + ) + + override suspend fun update(kitchen: Kitchen, grocery: Grocery) = groceryDao.updateGrocery( + toEntity(kitchen, grocery) + ) + + companion object { + fun toDomain(kitchen: Kitchen, groceryEntity: GroceryEntity) = Grocery( + groceryEntity.id, + kitchen.id, + groceryEntity.title, + groceryEntity.value, + groceryEntity.status + ) + + fun toEntity(kitchen: Kitchen, grocery: Grocery) = GroceryEntity( + grocery.id, + kitchen.id, + grocery.title, + grocery.value, + grocery.status + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/db/datasource/RoomKitchenDataSource.kt b/app/src/main/java/com/mychefassistant/framework/db/datasource/RoomKitchenDataSource.kt new file mode 100644 index 0000000..d1eda28 --- /dev/null +++ b/app/src/main/java/com/mychefassistant/framework/db/datasource/RoomKitchenDataSource.kt @@ -0,0 +1,37 @@ +package com.mychefassistant.framework.db.datasource + +import com.mychefassistant.core.data.datasource.KitchenDataSource +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.framework.db.dao.KitchenDao +import com.mychefassistant.framework.db.entity.KitchenEntity +import kotlinx.coroutines.flow.map + +class RoomKitchenDataSource(private val kitchenDao: KitchenDao) : KitchenDataSource { + override suspend fun add(kitchen: Kitchen) = kitchenDao.addKitchen(toEntity(kitchen)) + + override fun getAll() = kitchenDao.getAll().map { list -> list.map { toDomain(it) } } + + override suspend fun getById(id: Int): Kitchen = toDomain(kitchenDao.getById(id)[0]) + + override suspend fun find(kitchen: Kitchen) = kitchenDao.find(kitchen).map { toDomain(it) } + + override suspend fun remove(kitchen: Kitchen) = kitchenDao.removeKitchen(toEntity(kitchen)) + + override suspend fun update(kitchen: Kitchen) = kitchenDao.updateKitchen(toEntity(kitchen)) + + companion object { + fun toDomain(kitchenEntity: KitchenEntity) = Kitchen( + kitchenEntity.id, + kitchenEntity.title, + kitchenEntity.icon, + kitchenEntity.location + ) + + fun toEntity(kitchen: Kitchen): KitchenEntity = KitchenEntity( + kitchen.id, + kitchen.title, + kitchen.icon, + kitchen.location + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/db/entity/GroceryEntity.kt b/app/src/main/java/com/mychefassistant/framework/db/entity/GroceryEntity.kt new file mode 100644 index 0000000..2b8a42e --- /dev/null +++ b/app/src/main/java/com/mychefassistant/framework/db/entity/GroceryEntity.kt @@ -0,0 +1,18 @@ +package com.mychefassistant.framework.db.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "Groceries") +data class GroceryEntity( + @PrimaryKey(autoGenerate = true) + val id: Int = 0, + + val kitchen: Int, + + val title: String, + + val value: String = "", + + val status: Boolean = false +) \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/db/KitchenEntity.kt b/app/src/main/java/com/mychefassistant/framework/db/entity/KitchenEntity.kt similarity index 57% rename from app/src/main/java/com/mychefassistant/framework/db/KitchenEntity.kt rename to app/src/main/java/com/mychefassistant/framework/db/entity/KitchenEntity.kt index 1d372a3..a755e74 100644 --- a/app/src/main/java/com/mychefassistant/framework/db/KitchenEntity.kt +++ b/app/src/main/java/com/mychefassistant/framework/db/entity/KitchenEntity.kt @@ -1,6 +1,5 @@ -package com.mychefassistant.framework.db +package com.mychefassistant.framework.db.entity -import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey @@ -9,12 +8,9 @@ data class KitchenEntity( @PrimaryKey(autoGenerate = true) val id: Int = 0, - @ColumnInfo(name = "title") val title: String, - @ColumnInfo(name = "icon") val icon: Int? = null, - @ColumnInfo(name = "location") val location: Int? = null ) \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/modules/DatabaseModule.kt b/app/src/main/java/com/mychefassistant/framework/modules/DatabaseModule.kt new file mode 100644 index 0000000..4f279c4 --- /dev/null +++ b/app/src/main/java/com/mychefassistant/framework/modules/DatabaseModule.kt @@ -0,0 +1,20 @@ +package com.mychefassistant.framework.modules + +import androidx.room.Room +import com.mychefassistant.framework.db.ChefAssistantDatabase +import org.koin.android.ext.koin.androidApplication +import org.koin.dsl.module + +val databaseModule = module { + single { + Room.databaseBuilder( + androidApplication(), + ChefAssistantDatabase::class.java, + "ca_v4.db" + ) + .fallbackToDestructiveMigration() + .build() + } + single { get().kitchenDao() } + single { get().groceryDao() } +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/modules/RoomModule.kt b/app/src/main/java/com/mychefassistant/framework/modules/RoomModule.kt new file mode 100644 index 0000000..9bae781 --- /dev/null +++ b/app/src/main/java/com/mychefassistant/framework/modules/RoomModule.kt @@ -0,0 +1,16 @@ +package com.mychefassistant.framework.modules + +import com.mychefassistant.core.data.datasource.GroceryDataSource +import com.mychefassistant.core.data.datasource.KitchenDataSource +import com.mychefassistant.core.data.repository.GroceryRepository +import com.mychefassistant.core.data.repository.KitchenRepository +import com.mychefassistant.framework.db.datasource.RoomGroceryDataSource +import com.mychefassistant.framework.db.datasource.RoomKitchenDataSource +import org.koin.dsl.module + +val roomsModule = module { + single { RoomKitchenDataSource(get()) as KitchenDataSource } + single { RoomGroceryDataSource(get()) as GroceryDataSource } + single { KitchenRepository(get()) } + single { GroceryRepository(get()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/modules/ViewModelModule.kt b/app/src/main/java/com/mychefassistant/framework/modules/ViewModelModule.kt new file mode 100644 index 0000000..1bd08f1 --- /dev/null +++ b/app/src/main/java/com/mychefassistant/framework/modules/ViewModelModule.kt @@ -0,0 +1,14 @@ +package com.mychefassistant.framework.modules + +import com.mychefassistant.presentation.grocery.manage.GroceryManageViewModel +import com.mychefassistant.presentation.kitchen.insert.KitchenInsertViewModel +import com.mychefassistant.presentation.kitchen.manage.KitchenManageViewModel +import org.koin.android.ext.koin.androidApplication +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.dsl.module + +val viewModelModule = module { + viewModel { KitchenManageViewModel(androidApplication(), get(), get()) } + viewModel { KitchenInsertViewModel(androidApplication(), get(), get()) } + viewModel { GroceryManageViewModel(get()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/modules/usecase/GroceryUseCaseModule.kt b/app/src/main/java/com/mychefassistant/framework/modules/usecase/GroceryUseCaseModule.kt new file mode 100644 index 0000000..edd0ac5 --- /dev/null +++ b/app/src/main/java/com/mychefassistant/framework/modules/usecase/GroceryUseCaseModule.kt @@ -0,0 +1,14 @@ +package com.mychefassistant.framework.modules.usecase + +import com.mychefassistant.core.interactors.AddGroceryUseCase +import com.mychefassistant.core.interactors.GetGroceriesUseCase +import com.mychefassistant.core.interactors.RemoveGroceryUseCase +import com.mychefassistant.core.interactors.UpdateGroceryUseCase +import org.koin.dsl.module + +val groceryUseCaseModule = module { + single { AddGroceryUseCase(get()) } + single { GetGroceriesUseCase(get()) } + single { RemoveGroceryUseCase(get()) } + single { UpdateGroceryUseCase(get()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/framework/modules/usecase/KitchenUseCaseModule.kt b/app/src/main/java/com/mychefassistant/framework/modules/usecase/KitchenUseCaseModule.kt new file mode 100644 index 0000000..0c5a99f --- /dev/null +++ b/app/src/main/java/com/mychefassistant/framework/modules/usecase/KitchenUseCaseModule.kt @@ -0,0 +1,13 @@ +package com.mychefassistant.framework.modules.usecase + +import com.mychefassistant.core.interactors.* +import org.koin.dsl.module + +val kitchenUseCaseModule = module { + single { AddKitchenUseCase(get()) } + single { GetKitchensUseCase(get()) } + single { GetKitchenByIdUseCase(get()) } + single { FindKitchenUseCase(get()) } + single { RemoveKitchenUseCase(get()) } + single { UpdateKitchenUseCase(get()) } +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/presentation/grocery/manage/GroceryManageFragment.kt b/app/src/main/java/com/mychefassistant/presentation/grocery/manage/GroceryManageFragment.kt new file mode 100644 index 0000000..4581e83 --- /dev/null +++ b/app/src/main/java/com/mychefassistant/presentation/grocery/manage/GroceryManageFragment.kt @@ -0,0 +1,50 @@ +package com.mychefassistant.presentation.grocery.manage + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.fragment.app.Fragment +import com.mychefassistant.R +import org.koin.androidx.viewmodel.ext.android.viewModel + +class GroceryManageFragment : Fragment() { + private val viewModel: GroceryManageViewModel by viewModel() + private var kitchenId = 0 + private lateinit var title: TextView + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? = inflater.inflate(R.layout.fragment_grocery, container, false) + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + getArgs() + title = view.findViewById(R.id.title) + + viewModel.eventListener(viewLifecycleOwner) + .onInfo { + when (it.type) { + GroceryManageViewModel.onKitchenLoad -> onKitchenLoad() + } + } + + viewModel.start(kitchenId) + } + + override fun onPause() { + super.onPause() + viewModel.resetEvents() + } + + private fun getArgs() = arguments?.apply { + kitchenId = getInt("id") + } + + private fun onKitchenLoad() { + title.text = viewModel.kitchen.title + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/presentation/grocery/manage/GroceryManageViewModel.kt b/app/src/main/java/com/mychefassistant/presentation/grocery/manage/GroceryManageViewModel.kt new file mode 100644 index 0000000..219ddbe --- /dev/null +++ b/app/src/main/java/com/mychefassistant/presentation/grocery/manage/GroceryManageViewModel.kt @@ -0,0 +1,31 @@ +package com.mychefassistant.presentation.grocery.manage + +import androidx.lifecycle.viewModelScope +import com.mychefassistant.core.domain.Kitchen +import com.mychefassistant.core.interactors.GetKitchenByIdUseCase +import com.mychefassistant.framework.ChefAssistantViewModel +import com.mychefassistant.utils.Event +import kotlinx.coroutines.launch + +class GroceryManageViewModel(private val getKitchenByIdUseCase: GetKitchenByIdUseCase) : + ChefAssistantViewModel() { + private var kitchenId = 0 + lateinit var kitchen: Kitchen + + private suspend fun loadKitchen() = getKitchenByIdUseCase(kitchenId).onSuccess { + kitchen = it + setEvent(Event.Info(onKitchenLoad)) + } + + + fun start(id: Int) { + kitchenId = id + viewModelScope.launch { + loadKitchen() + } + } + + companion object { + const val onKitchenLoad = "onKitchenLoad" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/presentation/ingredient/IngredientFragment.kt b/app/src/main/java/com/mychefassistant/presentation/ingredient/IngredientFragment.kt deleted file mode 100644 index f07563d..0000000 --- a/app/src/main/java/com/mychefassistant/presentation/ingredient/IngredientFragment.kt +++ /dev/null @@ -1,53 +0,0 @@ -package com.mychefassistant.presentation.ingredient - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.fragment.app.Fragment -import androidx.lifecycle.Observer -import com.mychefassistant.R -import com.mychefassistant.core.domain.Kitchen -import org.koin.androidx.viewmodel.ext.android.viewModel - -class IngredientFragment : Fragment() { - private val ingredientViewModel: IngredientViewModel by viewModel() - private var kitchenId = 0 - private lateinit var kitchen: Kitchen - private lateinit var title: TextView - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - activity?.applicationContext - - return inflater.inflate(R.layout.fragment_ingredient, container, false) - } - - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - getArgs() - title = view.findViewById(R.id.title) - - ingredientViewModel.kitchen.observe(viewLifecycleOwner, Observer { - kitchen = it - loadedKitchen() - }) - ingredientViewModel.loadKitchen(kitchenId) - } - - private fun getArgs() { - arguments?.apply { - kitchenId = getInt("id") - } - } - - private fun loadedKitchen(){ - title.text = kitchen.title - } -} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/presentation/ingredient/IngredientViewModel.kt b/app/src/main/java/com/mychefassistant/presentation/ingredient/IngredientViewModel.kt deleted file mode 100644 index c50269f..0000000 --- a/app/src/main/java/com/mychefassistant/presentation/ingredient/IngredientViewModel.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.mychefassistant.presentation.ingredient - -import android.app.Application -import androidx.lifecycle.MutableLiveData -import com.mychefassistant.core.domain.Kitchen -import com.mychefassistant.framework.ChefAssistantViewModel -import com.mychefassistant.framework.Interactors -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch - -class IngredientViewModel(application: Application, interactors: Interactors) : - ChefAssistantViewModel(application, interactors) { - - val kitchen: MutableLiveData = MutableLiveData() - - fun loadKitchen(id: Int) { - GlobalScope.launch { - kitchen.postValue(interactors.getKitchenById(id)) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/mychefassistant/presentation/kitchen/insert/KitchenInsertFragment.kt b/app/src/main/java/com/mychefassistant/presentation/kitchen/insert/KitchenInsertFragment.kt index 4694ee0..ce19216 100644 --- a/app/src/main/java/com/mychefassistant/presentation/kitchen/insert/KitchenInsertFragment.kt +++ b/app/src/main/java/com/mychefassistant/presentation/kitchen/insert/KitchenInsertFragment.kt @@ -5,16 +5,17 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button +import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController +import com.google.android.material.snackbar.Snackbar import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.mychefassistant.R import org.koin.androidx.viewmodel.ext.android.viewModel - class KitchenInsertFragment : Fragment() { - private val kitchenInsertViewModel: KitchenInsertViewModel by viewModel() + private val viewModel: KitchenInsertViewModel by viewModel() private lateinit var titleInput: TextInputEditText private lateinit var titleInputLayout: TextInputLayout private lateinit var locationInput: TextInputEditText @@ -24,11 +25,7 @@ class KitchenInsertFragment : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - activity?.applicationContext - return inflater.inflate(R.layout.fragment_kitchen_insert, container, false) - } + ): View? = inflater.inflate(R.layout.fragment_kitchen_insert, container, false) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -36,25 +33,46 @@ class KitchenInsertFragment : Fragment() { titleInputLayout = view.findViewById(R.id.title_layout) locationInput = view.findViewById(R.id.location_input) - titleInput.setOnKeyListener { _, _, _ -> - titleInputLayout.error = if (titleInput.text.isNullOrBlank()) getString(R.string.cant_empty) else null - true - } - view.findViewById