From bd8db6d748b15150b270479470dad3d6e1d3a4c8 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Tue, 30 Apr 2024 20:19:55 +0700 Subject: [PATCH 01/12] Launch image picker and display image --- .../addmeal/AddMealBottomSheet.kt | 64 +++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/addmeal/AddMealBottomSheet.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/addmeal/AddMealBottomSheet.kt index f7f5a07f..1db13ce0 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/addmeal/AddMealBottomSheet.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/addmeal/AddMealBottomSheet.kt @@ -2,23 +2,32 @@ package com.hieuwu.groceriesstore.presentation.mealplanning.addmeal +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells import androidx.compose.foundation.lazy.staggeredgrid.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.AddCircleOutline import androidx.compose.material.icons.filled.Cookie import androidx.compose.material.icons.rounded.AddCircle import androidx.compose.material.icons.rounded.Backspace import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.SheetState @@ -27,16 +36,21 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.colorResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi +import com.bumptech.glide.integration.compose.GlideImage import com.hieuwu.groceriesstore.R import com.hieuwu.groceriesstore.presentation.authentication.composables.IconTextInput import com.hieuwu.groceriesstore.presentation.mealplanning.overview.MealAddingState import com.hieuwu.groceriesstore.presentation.mealplanning.overview.composable.IngredientChip +@OptIn(ExperimentalGlideComposeApi::class) @Composable fun AddMealBottomSheet( modifier: Modifier = Modifier, @@ -45,6 +59,15 @@ fun AddMealBottomSheet( onDismissRequest: () -> Unit, onAddMealClick: () -> Unit, ) { + val pickMedia = + rememberLauncherForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> + if (uri != null) { + mealAddState.value.imageUri.value = uri + + } else { + // no-op + } + } ModalBottomSheet( onDismissRequest = onDismissRequest, sheetState = sheetState @@ -56,11 +79,42 @@ fun AddMealBottomSheet( .height(350.dp) .clip(RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp)) ) { - Text( - text = "Add a meal", - style = MaterialTheme.typography.headlineMedium, - fontWeight = FontWeight.Bold - ) + Row( + modifier = modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Add a meal", + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold + ) + Spacer(modifier = modifier.width(24.dp)) + if (mealAddState.value.imageUri.value == null) { + Icon( + imageVector = Icons.Default.AddCircleOutline, contentDescription = null, + tint = colorResource( + id = R.color.colorPrimary, + ), + modifier = modifier + .size(24.dp) + .clickable { + pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + }, + ) + } else { + GlideImage( + contentScale = ContentScale.Crop, + model = mealAddState.value.imageUri.value, + contentDescription = null, + modifier = modifier + .size(64.dp) + .clip(RoundedCornerShape(6.dp)) + .clickable { + pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + ) + } + } Spacer(modifier = modifier.height(24.dp)) IconTextInput( leadingIcon = Icons.Default.Cookie, From 37eb40a2f694bb6d8841439bc2ab86a2ecf99e27 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Tue, 30 Apr 2024 20:20:33 +0700 Subject: [PATCH 02/12] Add image bytearray and more dependency --- app/build.gradle | 4 +--- .../domain/usecases/AddMealToPlanUseCase.kt | 9 +++++++-- .../domain/usecases/impl/AddMealToPlanUseCaseImpl.kt | 3 ++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ff107d35..16bf7402 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,9 +106,6 @@ dependencies { implementation platform(libs.firebase.bom) implementation libs.bundles.firebase -// implementation 'io.supabase:postgrest-kt:0.9.0-alpha-4' - -// implementation("io.github.jan-tennert.supabase:postgrest-kt:0.2.0") implementation(libs.ktor.client.cio) implementation(libs.postgrest.kt.android) implementation libs.ktor.client.android @@ -116,6 +113,7 @@ dependencies { implementation libs.ktor.client.logging.jvm implementation(libs.ktor.client.core) + implementation("io.github.jan-tennert.supabase:storage-kt:2.0.0") def composeBom = platform('androidx.compose:compose-bom:2023.09.02') implementation(composeBom) androidTestImplementation(composeBom) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/AddMealToPlanUseCase.kt b/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/AddMealToPlanUseCase.kt index bff49405..d77ebcf5 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/AddMealToPlanUseCase.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/AddMealToPlanUseCase.kt @@ -4,8 +4,13 @@ import com.hieuwu.groceriesstore.presentation.mealplanning.overview.state.MealTy interface AddMealToPlanUseCase : SuspendUseCase { - class Input(val name: String, val weekDay: String, val ingredients: List, - val mealType: MealType + class Input( + val name: String, + val weekDay: String, + val ingredients: List, + val mealType: MealType, + val mealImageUri: ByteArray, ) + object Output } \ No newline at end of file diff --git a/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/impl/AddMealToPlanUseCaseImpl.kt b/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/impl/AddMealToPlanUseCaseImpl.kt index 1c3bb178..889f96c3 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/impl/AddMealToPlanUseCaseImpl.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/domain/usecases/impl/AddMealToPlanUseCaseImpl.kt @@ -12,7 +12,8 @@ class AddMealToPlanUseCaseImpl @Inject constructor( weekDay = input.weekDay, name = input.name, ingredients = input.ingredients, - mealType = input.mealType.value + mealType = input.mealType.value, + mealImageUri = input.mealImageUri ) return AddMealToPlanUseCase.Output } From 96975052c7d99e1bb4a4d695b5fab92155735acb Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Tue, 30 Apr 2024 20:20:49 +0700 Subject: [PATCH 03/12] Implement upload image --- .../data/repository/MealPlanRepository.kt | 3 ++- .../repository/impl/MealPlanRepositoryImpl.kt | 22 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/MealPlanRepository.kt b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/MealPlanRepository.kt index de448cb2..9f1b09b7 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/MealPlanRepository.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/MealPlanRepository.kt @@ -7,7 +7,8 @@ interface MealPlanRepository { weekDay: String, name: String, ingredients: List, - mealType: String + mealType: String, + mealImageUri: ByteArray ) suspend fun retrieveMealByType(type: String, weekDayValue: String): List diff --git a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/MealPlanRepositoryImpl.kt b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/MealPlanRepositoryImpl.kt index 1fdc64ee..d4f83fd3 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/MealPlanRepositoryImpl.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/MealPlanRepositoryImpl.kt @@ -1,11 +1,11 @@ package com.hieuwu.groceriesstore.data.repository.impl import com.hieuwu.groceriesstore.data.network.dto.Meal -import com.hieuwu.groceriesstore.data.network.dto.ProductDto import com.hieuwu.groceriesstore.data.repository.MealPlanRepository import com.hieuwu.groceriesstore.data.repository.UserRepository import com.hieuwu.groceriesstore.domain.models.MealModel import io.github.jan.supabase.postgrest.Postgrest +import io.github.jan.supabase.storage.Storage import java.util.UUID import kotlinx.coroutines.flow.first import timber.log.Timber @@ -13,18 +13,21 @@ import javax.inject.Inject class MealPlanRepositoryImpl @Inject constructor( private val postgrest: Postgrest, - private val userRepository: UserRepository + private val userRepository: UserRepository, + private val storage: Storage ) : MealPlanRepository { override suspend fun addMealToPlan( weekDay: String, name: String, ingredients: List, - mealType: String + mealType: String, + mealImageUri: ByteArray ) { + val mealId = UUID.randomUUID().toString() val userId = userRepository.getCurrentUser().first()?.id ?: "" postgrest["meal_plans"].insert( Meal( - id = UUID.randomUUID().toString(), + id = mealId, name = name, ingredients = ingredients, creatorId = userId, @@ -32,6 +35,17 @@ class MealPlanRepositoryImpl @Inject constructor( mealType = mealType, ) ) + + val imageKey = + storage.from("meals").upload(path = "$mealId.png", data = mealImageUri, upsert = true) + + postgrest["meal_plans"].update({ + set("image", imageKey) + }) { + filter { + eq("id", mealId) + } + } } override suspend fun retrieveMealByType(type: String, weekDayValue: String): List { From 3a5ccb51debb9afa0c4e5f3b816a6f005de08cee Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Tue, 30 Apr 2024 20:21:12 +0700 Subject: [PATCH 04/12] Provide storage --- .../com/hieuwu/groceriesstore/di/SupabaseModule.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/di/SupabaseModule.kt b/app/src/main/java/com/hieuwu/groceriesstore/di/SupabaseModule.kt index c0e13101..a8033619 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/di/SupabaseModule.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/di/SupabaseModule.kt @@ -12,7 +12,8 @@ import io.github.jan.supabase.gotrue.auth import io.github.jan.supabase.postgrest.Postgrest import io.github.jan.supabase.postgrest.postgrest import io.github.jan.supabase.serializer.KotlinXSerializer -import io.ktor.client.plugins.* +import io.github.jan.supabase.storage.Storage +import io.github.jan.supabase.storage.storage import kotlinx.serialization.json.Json import javax.inject.Singleton @@ -30,6 +31,7 @@ object SupabaseModule { defaultSerializer = KotlinXSerializer(Json { ignoreUnknownKeys = true }) install(Postgrest) install(Auth) + install(Storage) } } @@ -45,4 +47,10 @@ object SupabaseModule { return client.auth } + @Provides + @Singleton + fun provideSupabaseStorage(client: SupabaseClient): Storage { + return client.storage + } + } From c514bf86074cbcdda84f8cdd27f7c1e69107e150 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Tue, 30 Apr 2024 20:21:30 +0700 Subject: [PATCH 05/12] Update callback to create meal --- .../mealplanning/overview/OverviewScreen.kt | 38 ++++++++++++++++++- .../overview/OverviewViewModel.kt | 28 +++++++++----- 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewScreen.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewScreen.kt index e7a16559..7a804b26 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewScreen.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewScreen.kt @@ -1,5 +1,7 @@ package com.hieuwu.groceriesstore.presentation.mealplanning.overview +import android.content.ContentResolver +import android.net.Uri import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -28,6 +30,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -40,6 +43,8 @@ import com.hieuwu.groceriesstore.presentation.mealplanning.overview.composable.M import com.hieuwu.groceriesstore.presentation.mealplanning.overview.composable.SwipeToDeleteContainer import com.hieuwu.groceriesstore.presentation.mealplanning.overview.composable.WeekDayItem import com.hieuwu.groceriesstore.presentation.mealplanning.overview.state.MealType +import java.io.ByteArrayOutputStream +import java.io.InputStream import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @@ -82,6 +87,7 @@ fun OverViewScreen( val scope = rememberCoroutineScope() val mealAddState = remember { mutableStateOf(MealAddingState()) } if (showBottomSheet.value) { + val contentResolver = LocalContext.current.contentResolver AddMealBottomSheet( onDismissRequest = { showBottomSheet.value = false @@ -89,10 +95,12 @@ fun OverViewScreen( sheetState = sheetState, mealAddState = mealAddState, onAddMealClick = { + val image = uriToByteArray(contentResolver, mealAddState.value.imageUri.value ?: Uri.parse("")) viewModel.onAddMeal( mealType = mealType.value, name = mealAddState.value.name.value, - ingredients = mealAddState.value.ingredients.value + ingredients = mealAddState.value.ingredients.value, + mealImageUri = image ) mealAddState.value.name.value = "" mealAddState.value.ingredients.value = listOf() @@ -216,11 +224,37 @@ fun OverViewScreen( data class MealAddingState( val name: MutableState = mutableStateOf(""), - val ingredients: MutableState> = mutableStateOf(listOf()) + val ingredients: MutableState> = mutableStateOf(listOf()), + val imageUri: MutableState = mutableStateOf(null) ) @Composable @Preview fun OverViewScreenPreview(modifier: Modifier = Modifier) { OverViewScreen(modifier, onNavigateUpClick = {}) +} + + + +private fun getBytes(inputStream: InputStream): ByteArray { + val byteBuffer = ByteArrayOutputStream() + val bufferSize = 1024 + val buffer = ByteArray(bufferSize) + var len = 0 + while (inputStream.read(buffer).also { len = it } != -1) { + byteBuffer.write(buffer, 0, len) + } + return byteBuffer.toByteArray() +} + + +private fun uriToByteArray(contentResolver: ContentResolver, uri: Uri): ByteArray { + if (uri == Uri.EMPTY) { + return byteArrayOf() + } + val inputStream = contentResolver.openInputStream(uri) + if (inputStream != null) { + return getBytes(inputStream) + } + return byteArrayOf() } \ No newline at end of file diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewViewModel.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewViewModel.kt index feb7c27e..3593744b 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewViewModel.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewViewModel.kt @@ -134,22 +134,28 @@ class OverviewViewModel @Inject constructor( } } - fun onAddMeal(mealType: MealType, name: String, ingredients: List) { + fun onAddMeal( + mealType: MealType, + name: String, + ingredients: List, + mealImageUri: ByteArray + ) { when (mealType) { - MealType.BREAKFAST -> onAddBreakfast(name, ingredients) - MealType.DINNER -> onAddDinner(name, ingredients) - MealType.LUNCH -> onAddLunch(name, ingredients) + MealType.BREAKFAST -> onAddBreakfast(name, ingredients, mealImageUri) + MealType.DINNER -> onAddDinner(name, ingredients, mealImageUri) + MealType.LUNCH -> onAddLunch(name, ingredients, mealImageUri) } } - private fun onAddBreakfast(name: String, ingredients: List) { + private fun onAddBreakfast(name: String, ingredients: List, mealImageUri: ByteArray) { viewModelScope.launch { addMealToPlanUseCase.execute( AddMealToPlanUseCase.Input( name = name, weekDay = _days.value[selectedDayIndex].name, ingredients = ingredients, - mealType = MealType.BREAKFAST + mealType = MealType.BREAKFAST, + mealImageUri = mealImageUri ) ) _breakfastMeals.value = addMealToList( @@ -159,14 +165,15 @@ class OverviewViewModel @Inject constructor( } } - private fun onAddLunch(name: String, ingredients: List) { + private fun onAddLunch(name: String, ingredients: List, mealImageUri: ByteArray) { viewModelScope.launch { addMealToPlanUseCase.execute( AddMealToPlanUseCase.Input( name = name, weekDay = _days.value[selectedDayIndex].name, ingredients = ingredients, - mealType = MealType.LUNCH + mealType = MealType.LUNCH, + mealImageUri = mealImageUri, ) ) _lunchMeals.value = addMealToList( @@ -176,14 +183,15 @@ class OverviewViewModel @Inject constructor( } } - private fun onAddDinner(name: String, ingredients: List) { + private fun onAddDinner(name: String, ingredients: List, mealImageUri: ByteArray) { viewModelScope.launch { addMealToPlanUseCase.execute( AddMealToPlanUseCase.Input( name = name, weekDay = _days.value[selectedDayIndex].name, ingredients = ingredients, - mealType = MealType.DINNER + mealType = MealType.DINNER, + mealImageUri = mealImageUri, ) ) _dinnerMeals.value = addMealToList( From 126c3be28d6cc5902eacfc3086e19245d00d7fd7 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Fri, 3 May 2024 15:16:15 +0700 Subject: [PATCH 06/12] Add image url field --- .../com/hieuwu/groceriesstore/data/network/dto/Meal.kt | 4 ++++ .../com/hieuwu/groceriesstore/domain/models/MealModel.kt | 1 + .../mealplanning/overview/composable/MealItem.kt | 8 ++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/data/network/dto/Meal.kt b/app/src/main/java/com/hieuwu/groceriesstore/data/network/dto/Meal.kt index 67d16c47..69304be9 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/data/network/dto/Meal.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/data/network/dto/Meal.kt @@ -22,4 +22,8 @@ data class Meal( @SerialName("meal_type") val mealType: String, + + @SerialName("image") + val image: String?, + ) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/domain/models/MealModel.kt b/app/src/main/java/com/hieuwu/groceriesstore/domain/models/MealModel.kt index 7050eaa0..6034c6a8 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/domain/models/MealModel.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/domain/models/MealModel.kt @@ -7,4 +7,5 @@ data class MealModel( val weekDay: String, val creatorId: String, val mealType: String, + val imageUrl: String, ) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/composable/MealItem.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/composable/MealItem.kt index 634b1aa6..a520e156 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/composable/MealItem.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/composable/MealItem.kt @@ -13,12 +13,14 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Text import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp @@ -45,12 +47,14 @@ fun MealItem( .fillMaxHeight() ) { item { - Row() { + Row { WebImage( model = meal.imageUrl, contentDescription = "", contentScale = ContentScale.FillBounds, - modifier = modifier.size(124.dp) + modifier = modifier + .size(124.dp) + .clip(RoundedCornerShape(12.dp)) ) } } From e72ac048eb354766a9b506d1ed0b5902d7825ee8 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Fri, 3 May 2024 15:16:31 +0700 Subject: [PATCH 07/12] Get image url --- .../data/repository/impl/MealPlanRepositoryImpl.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/MealPlanRepositoryImpl.kt b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/MealPlanRepositoryImpl.kt index d4f83fd3..d42ad78b 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/MealPlanRepositoryImpl.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/MealPlanRepositoryImpl.kt @@ -4,6 +4,7 @@ import com.hieuwu.groceriesstore.data.network.dto.Meal import com.hieuwu.groceriesstore.data.repository.MealPlanRepository import com.hieuwu.groceriesstore.data.repository.UserRepository import com.hieuwu.groceriesstore.domain.models.MealModel +import com.hieuwu.groceriesstore.utilities.SupabaseHelper import io.github.jan.supabase.postgrest.Postgrest import io.github.jan.supabase.storage.Storage import java.util.UUID @@ -33,14 +34,14 @@ class MealPlanRepositoryImpl @Inject constructor( creatorId = userId, weekDay = weekDay, mealType = mealType, + image = null, ) ) - val imageKey = storage.from("meals").upload(path = "$mealId.png", data = mealImageUri, upsert = true) - + val imageUrl = SupabaseHelper.buildImageUrl(imageKey) postgrest["meal_plans"].update({ - set("image", imageKey) + set("image", imageUrl) }) { filter { eq("id", mealId) @@ -48,6 +49,7 @@ class MealPlanRepositoryImpl @Inject constructor( } } + override suspend fun retrieveMealByType(type: String, weekDayValue: String): List { val userId = userRepository.getCurrentUser().first()?.id ?: "" val result = postgrest["meal_plans"].select { @@ -64,7 +66,8 @@ class MealPlanRepositoryImpl @Inject constructor( ingredients = it.ingredients, weekDay = it.weekDay, creatorId = it.creatorId, - mealType = it.mealType + mealType = it.mealType, + imageUrl = it.image ?: "" ) } return result From 04176b2c2b5bf033f32670d364342f969a86d848 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Fri, 3 May 2024 15:16:39 +0700 Subject: [PATCH 08/12] Set image url --- .../presentation/mealplanning/overview/OverviewViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewViewModel.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewViewModel.kt index 3593744b..8a36afec 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewViewModel.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/mealplanning/overview/OverviewViewModel.kt @@ -96,7 +96,7 @@ class OverviewViewModel @Inject constructor( private fun MealModel.asDomain(): Meal = Meal( id = id, name = name, - imageUrl = "", + imageUrl = imageUrl, ingredients = ingredients.toList() ) From ddd42532a537d5f1458d3a6ec3d51b1e2eec3d56 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Fri, 3 May 2024 15:16:48 +0700 Subject: [PATCH 09/12] Extract helper --- .../groceriesstore/utilities/SupabaseHelper.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 app/src/main/java/com/hieuwu/groceriesstore/utilities/SupabaseHelper.kt diff --git a/app/src/main/java/com/hieuwu/groceriesstore/utilities/SupabaseHelper.kt b/app/src/main/java/com/hieuwu/groceriesstore/utilities/SupabaseHelper.kt new file mode 100644 index 00000000..aa2a3522 --- /dev/null +++ b/app/src/main/java/com/hieuwu/groceriesstore/utilities/SupabaseHelper.kt @@ -0,0 +1,12 @@ +package com.hieuwu.groceriesstore.utilities + +import com.hieuwu.groceriesstore.BuildConfig + +object SupabaseHelper { + + fun buildImageUrl(imageKey: String): String { + val storageUrl = "${BuildConfig.SUPABASE_URL}/storage/v1/object/public" + return "$storageUrl/$imageKey" + } + +} \ No newline at end of file From f563d35fd373892ad06946b512862c5fdac22759 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Fri, 3 May 2024 15:23:49 +0700 Subject: [PATCH 10/12] Remove commented code --- .../groceriesstore/presentation/orderhistory/OrderListScreen.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/hieuwu/groceriesstore/presentation/orderhistory/OrderListScreen.kt b/app/src/main/java/com/hieuwu/groceriesstore/presentation/orderhistory/OrderListScreen.kt index 014a7f54..6b170102 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/presentation/orderhistory/OrderListScreen.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/presentation/orderhistory/OrderListScreen.kt @@ -29,7 +29,6 @@ import com.hieuwu.groceriesstore.R @Composable fun OrderHistoryScreen( -// navController: NavController, modifier: Modifier = Modifier, viewModel: OrderListViewModel = hiltViewModel() ) { From 9e690e6df1fcadf2d70312ab9d1549c9cfbfbba4 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Fri, 3 May 2024 15:23:58 +0700 Subject: [PATCH 11/12] Remove unused package --- .../utilities/navigation/Destination.kt | 19 --------- .../utilities/navigation/NavControllerExt.kt | 9 ----- .../utilities/navigation/NavRegister.kt | 40 ------------------- 3 files changed, 68 deletions(-) delete mode 100644 app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/Destination.kt delete mode 100644 app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/NavControllerExt.kt delete mode 100644 app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/NavRegister.kt diff --git a/app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/Destination.kt b/app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/Destination.kt deleted file mode 100644 index 5f263bdd..00000000 --- a/app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/Destination.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.hieuwu.groceriesstore.utilities.navigation - -import androidx.compose.ui.graphics.vector.ImageVector - - -interface Destination { - val route: String - val title: String -} - -interface BottomTabDestination : Destination { - val activeIcon: ImageVector - val inActiveIcon: ImageVector -} - -object OrderHistoryDestination : Destination { - override val route = "order_history" - override val title = "Order History" -} diff --git a/app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/NavControllerExt.kt b/app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/NavControllerExt.kt deleted file mode 100644 index 104cffcb..00000000 --- a/app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/NavControllerExt.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.hieuwu.groceriesstore.utilities - -import androidx.navigation.NavController - -fun NavController.navigateSingleTopTo(route: String) { - this.navigate(route) { - launchSingleTop = true - } -} \ No newline at end of file diff --git a/app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/NavRegister.kt b/app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/NavRegister.kt deleted file mode 100644 index 6923d2c0..00000000 --- a/app/src/main/java/com/hieuwu/groceriesstore/utilities/navigation/NavRegister.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.hieuwu.groceriesstore.utilities.navigation - -import androidx.navigation.NavController -import androidx.navigation.NavGraphBuilder -import androidx.navigation.compose.composable -import com.hieuwu.groceriesstore.presentation.orderhistory.OrderHistoryScreen - -fun NavGraphBuilder.navRegistration(navController: NavController) { - composable(OrderHistoryDestination.route) { - OrderHistoryScreen( -// navController = navController, - ) - } -} -// } -// composable(TimerReportDestination.route) { -// ReportsScreen( -// navController = navController -// ) -// } -// composable(TimerSettingsDestination.route) { -// TimerSettingsScreen( -// navController = navController -// ) -// } -// -// composable(TagsManagementDestination.route) { -// TagsManagementScreen( -// navController = navController -// ) -// } -// -// composable(route = "${TimerPeriodDetailsDestination.route}/{${TimerPeriodDetailsDestination.timerPeriodArg}}", -// arguments = TimerPeriodDetailsDestination.arguments) { navBackStackEntry -> -// val timerPeriodId = -// navBackStackEntry.arguments?.getString(TimerPeriodDetailsDestination.timerPeriodArg) -// -// TimerPeriodDetailsScreen(timerPeriodId = timerPeriodId ?: "", navController = navController) -// } - From a6c1a034c07cf47f5249abe9129f94f2945226d4 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Fri, 3 May 2024 19:56:37 +0700 Subject: [PATCH 12/12] Move mapping method to private place, update code and remove unused class --- .../data/network/RemoteTable.kt | 9 ++ .../repository/impl/CategoryRepositoryImpl.kt | 14 ++- .../repository/impl/OrderRepositoryImpl.kt | 55 +++++++++-- .../repository/impl/ProductRepositoryImpl.kt | 18 +++- .../repository/impl/UserRepositoryImpl.kt | 27 +++-- .../utilities/FirebaseStoreConstant.kt | 45 --------- .../utilities/SupabaseMapper.kt | 99 ------------------- .../groceriesstore/utilities/Utilities.kt | 3 - 8 files changed, 98 insertions(+), 172 deletions(-) create mode 100644 app/src/main/java/com/hieuwu/groceriesstore/data/network/RemoteTable.kt delete mode 100644 app/src/main/java/com/hieuwu/groceriesstore/utilities/FirebaseStoreConstant.kt delete mode 100644 app/src/main/java/com/hieuwu/groceriesstore/utilities/SupabaseMapper.kt diff --git a/app/src/main/java/com/hieuwu/groceriesstore/data/network/RemoteTable.kt b/app/src/main/java/com/hieuwu/groceriesstore/data/network/RemoteTable.kt new file mode 100644 index 00000000..75b7b9eb --- /dev/null +++ b/app/src/main/java/com/hieuwu/groceriesstore/data/network/RemoteTable.kt @@ -0,0 +1,9 @@ +package com.hieuwu.groceriesstore.data.network + +enum class RemoteTable(val tableName: String) { + Product("products"), + Categories("categories"), + Orders("orders"), + Users("users"), + LineItems("line_items"), +} \ No newline at end of file diff --git a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/CategoryRepositoryImpl.kt b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/CategoryRepositoryImpl.kt index 17501ff7..56bacbbe 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/CategoryRepositoryImpl.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/CategoryRepositoryImpl.kt @@ -1,11 +1,11 @@ package com.hieuwu.groceriesstore.data.repository.impl import com.hieuwu.groceriesstore.data.database.dao.CategoryDao +import com.hieuwu.groceriesstore.data.database.entities.Category import com.hieuwu.groceriesstore.data.database.entities.asDomainModel +import com.hieuwu.groceriesstore.data.network.RemoteTable import com.hieuwu.groceriesstore.data.network.dto.CategoriesDto import com.hieuwu.groceriesstore.data.repository.CategoryRepository -import com.hieuwu.groceriesstore.utilities.CollectionNames -import com.hieuwu.groceriesstore.utilities.SupabaseMapper import io.github.jan.supabase.postgrest.Postgrest import kotlinx.coroutines.flow.map import timber.log.Timber @@ -19,10 +19,10 @@ class CategoryRepositoryImpl @Inject constructor( override suspend fun refreshDatabase() { try { - val result = supabasePostgrest[CollectionNames.categories] + val result = supabasePostgrest[RemoteTable.Categories.tableName] .select() val res = result.decodeList() - val categories = res.map { SupabaseMapper.mapToEntity(it) } + val categories = res.map { it.asEntity() } categoryDao.insertAll(categories) } catch (e: Exception) { Timber.e(e.message) @@ -31,4 +31,10 @@ class CategoryRepositoryImpl @Inject constructor( override fun getFromLocal() = categoryDao.getAll().map { it.asDomainModel() } + private fun CategoriesDto.asEntity(): Category = Category( + id = id, + name = name, + image = image, + ) + } diff --git a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/OrderRepositoryImpl.kt b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/OrderRepositoryImpl.kt index e3f8041d..973eaa9b 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/OrderRepositoryImpl.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/OrderRepositoryImpl.kt @@ -8,10 +8,12 @@ import com.hieuwu.groceriesstore.data.database.entities.asDomainModel import com.hieuwu.groceriesstore.data.network.dto.OrderDto import com.hieuwu.groceriesstore.data.repository.OrderRepository import com.hieuwu.groceriesstore.domain.models.OrderModel -import com.hieuwu.groceriesstore.utilities.CollectionNames import com.hieuwu.groceriesstore.utilities.OrderStatus -import com.hieuwu.groceriesstore.utilities.SupabaseMapper +import com.hieuwu.groceriesstore.data.network.RemoteTable +import com.hieuwu.groceriesstore.data.network.dto.LineItemDto +import com.hieuwu.groceriesstore.domain.models.LineItemModel import io.github.jan.supabase.postgrest.Postgrest +import java.util.Date import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map @@ -52,11 +54,11 @@ class OrderRepositoryImpl @Inject constructor( } override suspend fun sendOrderToServer(order: OrderModel): Boolean { - val orderDto = SupabaseMapper.mapModelToDto(order) - val lineItems = SupabaseMapper.mapModelListToDto(order) + val orderDto = mapModelToDto(order) + val lineItems = mapModelListToDto(order) return try { - postgrest[CollectionNames.orders].insert(orderDto) - postgrest[CollectionNames.lineItems].insert(lineItems) + postgrest[RemoteTable.Orders.tableName].insert(orderDto) + postgrest[RemoteTable.LineItems.tableName].insert(lineItems) orderDao.clear() true } catch (e: Exception) { @@ -67,10 +69,47 @@ class OrderRepositoryImpl @Inject constructor( override suspend fun getOrders(): List { return try { - val result = postgrest[CollectionNames.orders].select().decodeList() - result.map { SupabaseMapper.mapToModel(it) } + val result = postgrest[RemoteTable.Orders.tableName].select().decodeList() + result.map { mapToModel(it) } } catch (e: Exception) { listOf() } } + + private fun mapToModel(order: OrderDto): OrderModel { + return OrderModel( + id = order.orderId, + status = order.status, + address = order.address, + lineItemList = mutableListOf(), + createdAt = order.createdAt + ).apply { + totalPrice = order.total + } + } + + private fun mapModelToDto(order: OrderModel): OrderDto { + return OrderDto( + orderId = order.id, + address = order.address, + status = order.status ?: "", + createdAt = Date().toString(), + total = order.total + ) + } + + private fun mapModelToDto(lineItemModel: LineItemModel, orderId: String): LineItemDto { + return LineItemDto( + id = lineItemModel.id ?: 0, + productId = lineItemModel.productId ?: "", + orderId = orderId, + quantity = lineItemModel.quantity ?: 0, + subtotal = lineItemModel.subtotal ?: 0.0, + lineItemId = lineItemModel.id ?: 0 + ) + } + + private fun mapModelListToDto(order: OrderModel): List { + return order.lineItemList.map { mapModelToDto(it, order.id) } + } } diff --git a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/ProductRepositoryImpl.kt b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/ProductRepositoryImpl.kt index d1f0e8fb..04b0cb3a 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/ProductRepositoryImpl.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/ProductRepositoryImpl.kt @@ -2,12 +2,12 @@ package com.hieuwu.groceriesstore.data.repository.impl import com.hieuwu.groceriesstore.data.database.dao.LineItemDao import com.hieuwu.groceriesstore.data.database.dao.ProductDao +import com.hieuwu.groceriesstore.data.database.entities.Product import com.hieuwu.groceriesstore.data.database.entities.asDomainModel +import com.hieuwu.groceriesstore.data.network.RemoteTable import com.hieuwu.groceriesstore.data.network.dto.ProductDto import com.hieuwu.groceriesstore.data.repository.ProductRepository import com.hieuwu.groceriesstore.domain.models.ProductModel -import com.hieuwu.groceriesstore.utilities.CollectionNames -import com.hieuwu.groceriesstore.utilities.SupabaseMapper import io.github.jan.supabase.postgrest.Postgrest import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow @@ -28,9 +28,9 @@ class ProductRepositoryImpl @Inject constructor( override suspend fun refreshDatabase() { try { - val result = supabasePostgrest[CollectionNames.products] + val result = supabasePostgrest[RemoteTable.Product.tableName] .select().decodeList() - val products = result.map { SupabaseMapper.mapToEntity(it) } + val products = result.map { it.asEntity() } productDao.insertAll(products) } catch (e: Exception) { Timber.e(e.message) @@ -79,4 +79,14 @@ class ProductRepositoryImpl @Inject constructor( return flow {} } + private fun ProductDto.asEntity(): Product = Product( + id = productId, + name = name, + nutrition = nutrition, + description = description, + image = image, + price = price, + category = category, + ) + } diff --git a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/UserRepositoryImpl.kt b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/UserRepositoryImpl.kt index 4111f5f2..a3bcf666 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/UserRepositoryImpl.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/data/repository/impl/UserRepositoryImpl.kt @@ -5,12 +5,11 @@ import com.hieuwu.groceriesstore.data.database.entities.User import com.hieuwu.groceriesstore.data.database.entities.asDomainModel import com.hieuwu.groceriesstore.data.network.dto.UserDto import com.hieuwu.groceriesstore.data.repository.UserRepository -import com.hieuwu.groceriesstore.utilities.CollectionNames -import com.hieuwu.groceriesstore.utilities.SupabaseMapper +import com.hieuwu.groceriesstore.data.network.RemoteTable import io.github.jan.supabase.gotrue.Auth import io.github.jan.supabase.gotrue.providers.builtin.Email import io.github.jan.supabase.postgrest.Postgrest -import java.util.* +import java.util.UUID import kotlinx.coroutines.flow.map import timber.log.Timber import javax.inject.Inject @@ -37,8 +36,8 @@ class UserRepositoryImpl @Inject constructor( isPromotionNotiEnabled = false, isDataRefreshedNotiEnabled = false ) - postgrest[CollectionNames.users].upsert(value = userDto) - val user = SupabaseMapper.mapDtoToEntity(userDto) + postgrest[RemoteTable.Users.tableName].upsert(value = userDto) + val user = userDto.asEntity() userDao.insert(user) true } catch (e: Exception) { @@ -54,14 +53,14 @@ class UserRepositoryImpl @Inject constructor( this.password = password } - val userDto = postgrest[CollectionNames.users].select() + val userDto = postgrest[RemoteTable.Users.tableName].select() { filter { UserDto::email eq email } } .decodeSingle() - val user = SupabaseMapper.mapDtoToEntity(userDto) + val user = userDto.asEntity() userDao.insert(user) true } catch (e: Exception) { @@ -84,7 +83,7 @@ class UserRepositoryImpl @Inject constructor( isDataRefreshedNotiEnabled = false ) try { - postgrest[CollectionNames.users].update( + postgrest[RemoteTable.Users.tableName].update( { UserDto::phone setTo phone UserDto::email setTo email @@ -110,7 +109,7 @@ class UserRepositoryImpl @Inject constructor( isPromotionEnabled: Boolean ) { try { - postgrest[CollectionNames.users].update( + postgrest[RemoteTable.Users.tableName].update( { UserDto::isOrderCreatedNotiEnabled setTo isOrderCreatedEnabled UserDto::isDataRefreshedNotiEnabled setTo isDatabaseRefreshedEnabled @@ -136,4 +135,14 @@ class UserRepositoryImpl @Inject constructor( it?.asDomainModel() } + private fun UserDto.asEntity(): User = User( + id = id, + name = name, + email = email, + address = address, + phone = phone, + isDataRefreshedNotiEnabled = isDataRefreshedNotiEnabled, + isOrderCreatedNotiEnabled = isOrderCreatedNotiEnabled, + isPromotionNotiEnabled = isPromotionNotiEnabled, + ) } diff --git a/app/src/main/java/com/hieuwu/groceriesstore/utilities/FirebaseStoreConstant.kt b/app/src/main/java/com/hieuwu/groceriesstore/utilities/FirebaseStoreConstant.kt deleted file mode 100644 index 30bb5f61..00000000 --- a/app/src/main/java/com/hieuwu/groceriesstore/utilities/FirebaseStoreConstant.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.hieuwu.groceriesstore.utilities - -object CollectionNames { - const val products = "products" - const val categories = "categories" - const val orders = "orders" - const val users = "users" - const val lineItems = "line_items" -} - -object UserDocumentProperties { - const val name = "name" - const val phone = "phone" - const val address = "address" - const val email = "email" - const val isPromotionNotiEnabled = "isPromotionNotiEnabled" - const val isOrderNotiEnabled = "isOrderNotiEnabled" - const val isDatabaseNotiEnabled = "isDatabaseNotiEnabled" -} - -object ProductDocumentProperties { - const val name = "name" - const val description = "description" - const val price = "price" - const val image = "image" - const val nutrition = "nutrition" - const val category = "category" -} - -object CategoryDocumentProperties { - const val name = "name" - const val image = "image" -} - -object OrderDocumentProperties { - const val address = "address" - const val lineItems = "lineItems" - const val total = "total" -} - -object LineItemDocumentProperties { - const val quantity = "quantity" - const val subtotal = "subtotal" - const val product = "product" -} diff --git a/app/src/main/java/com/hieuwu/groceriesstore/utilities/SupabaseMapper.kt b/app/src/main/java/com/hieuwu/groceriesstore/utilities/SupabaseMapper.kt deleted file mode 100644 index e649b249..00000000 --- a/app/src/main/java/com/hieuwu/groceriesstore/utilities/SupabaseMapper.kt +++ /dev/null @@ -1,99 +0,0 @@ -package com.hieuwu.groceriesstore.utilities - -import com.hieuwu.groceriesstore.data.database.entities.Category -import com.hieuwu.groceriesstore.data.database.entities.Product -import com.hieuwu.groceriesstore.data.database.entities.User -import com.hieuwu.groceriesstore.data.network.dto.CategoriesDto -import com.hieuwu.groceriesstore.data.network.dto.LineItemDto -import com.hieuwu.groceriesstore.data.network.dto.OrderDto -import com.hieuwu.groceriesstore.data.network.dto.ProductDto -import com.hieuwu.groceriesstore.data.network.dto.UserDto -import com.hieuwu.groceriesstore.domain.models.LineItemModel -import com.hieuwu.groceriesstore.domain.models.OrderModel -import java.util.* - -object SupabaseMapper { - fun mapToEntity(category: CategoriesDto): Category { - return Category( - id = category.id, - name = category.name, - image = category.image - ) - } - - fun mapToEntity(productDto: ProductDto): Product { - return Product( - id = productDto.productId, - name = productDto.name, - nutrition = productDto.nutrition, - description = productDto.description, - image = productDto.image, - price = productDto.price, - category = productDto.category, - ) - } - - - fun mapDtoToEntity(user: UserDto): User { - return User( - id = user.id, - name = user.name, - email = user.email, - address = user.address, - phone = user.phone, - isDataRefreshedNotiEnabled = user.isDataRefreshedNotiEnabled, - isOrderCreatedNotiEnabled = user.isOrderCreatedNotiEnabled, - isPromotionNotiEnabled = user.isPromotionNotiEnabled, - ) - } - - fun mapEntityToDto(user: User): UserDto { - return UserDto( - id = user.id, - name = user.name, - email = user.email, - address = user.address, - phone = user.phone, - isDataRefreshedNotiEnabled = user.isDataRefreshedNotiEnabled, - isOrderCreatedNotiEnabled = user.isOrderCreatedNotiEnabled, - isPromotionNotiEnabled = user.isPromotionNotiEnabled, - ) - } - - fun mapModelToDto(order: OrderModel): OrderDto { - return OrderDto( - orderId = order.id, - address = order.address, - status = order.status ?: "", - createdAt = Date().toString(), - total = order.total - ) - } - - fun mapModelListToDto(order: OrderModel): List { - return order.lineItemList.map { mapModelToDto(it, order.id) } - } - - private fun mapModelToDto(lineItemModel: LineItemModel, orderId: String): LineItemDto { - return LineItemDto( - id = lineItemModel.id ?: 0, - productId = lineItemModel.productId ?: "", - orderId = orderId, - quantity = lineItemModel.quantity ?: 0, - subtotal = lineItemModel.subtotal ?: 0.0, - lineItemId = lineItemModel.id ?: 0 - ) - } - - fun mapToModel(order: OrderDto): OrderModel { - return OrderModel( - id = order.orderId, - status = order.status, - address = order.address, - lineItemList = mutableListOf(), - createdAt = order.createdAt - ).apply { - totalPrice = order.total - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/hieuwu/groceriesstore/utilities/Utilities.kt b/app/src/main/java/com/hieuwu/groceriesstore/utilities/Utilities.kt index 76ea44b9..780c7e03 100644 --- a/app/src/main/java/com/hieuwu/groceriesstore/utilities/Utilities.kt +++ b/app/src/main/java/com/hieuwu/groceriesstore/utilities/Utilities.kt @@ -1,8 +1,6 @@ package com.hieuwu.groceriesstore.utilities enum class OrderStatus(val value: String) { IN_CART("cart"), COMPLETED("completed") } -enum class ProductListMode(val value: String) { CATEGORY("category"), DEFAULT("product") } -enum class FilterOrder(val value: String) { ASC("asc"), DESC("desc") } const val PRODUCT_TABLE = "product" const val CATEGORY_TABLE = "category" @@ -11,7 +9,6 @@ const val ORDER_TABLE = "order" const val LINE_ITEM_TABLE = "lineItem" const val RECIPE_TABLE = "recipe" -const val DATABASE_NAME = "" object KeyData { const val RESULT_KEY = "CHECKOUT_TO_DELIVERY_UPDATE"