From a6c1a034c07cf47f5249abe9129f94f2945226d4 Mon Sep 17 00:00:00 2001 From: Hieu Vu Date: Fri, 3 May 2024 19:56:37 +0700 Subject: [PATCH] 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"