Skip to content

Commit

Permalink
Merge pull request #169 from hieuwu/feature/order-history-usecase-dat…
Browse files Browse the repository at this point in the history
…a-layer

Feature/order history usecase data layer
  • Loading branch information
hieuwu committed May 17, 2023
2 parents 7408548 + 9023c9c commit ca5a54b
Show file tree
Hide file tree
Showing 24 changed files with 438 additions and 44 deletions.
41 changes: 41 additions & 0 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

36 changes: 29 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import org.jlleitschuh.gradle.ktlint.reporter.ReporterType

plugins {
alias libs.plugins.kotlin.android
alias libs.plugins.kotlin.kapt
Expand Down Expand Up @@ -53,6 +51,12 @@ android {

buildFeatures {
dataBinding true
viewBinding true
compose true
}

composeOptions {
kotlinCompilerExtensionVersion "1.2.0"
}
}

Expand Down Expand Up @@ -96,6 +100,24 @@ dependencies {
implementation "io.ktor:ktor-client-logging-jvm:1.6.0"
implementation("io.ktor:ktor-client-core:2.2.4")

def composeBom = platform('androidx.compose:compose-bom:2023.05.00')
implementation(composeBom)
androidTestImplementation(composeBom)

implementation "androidx.compose.runtime:runtime"
implementation "androidx.compose.ui:ui"
implementation "androidx.compose.foundation:foundation"
implementation "androidx.compose.foundation:foundation-layout"
implementation "androidx.compose.material:material"
implementation "androidx.compose.runtime:runtime-livedata"
implementation "androidx.compose.ui:ui-tooling"
implementation "com.google.accompanist:accompanist-themeadapter-material:0.28.0"
implementation("androidx.hilt:hilt-navigation-compose:1.0.0")


def nav_version = "2.5.3"
implementation("androidx.navigation:navigation-compose:$nav_version")

implementation libs.caruilib

testImplementation libs.junit
Expand All @@ -108,9 +130,9 @@ task wrapper(type: Wrapper) {
}

ktlint {
android.set(true)
reporters {
reporter(ReporterType.PLAIN)
reporter(ReporterType.HTML)
}
// android.set(true)
// reporters {
// reporter(ReporterType.PLAIN)
// reporter(ReporterType.HTML)
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ data class OrderDto(
val status: String,
@SerialName("address")
val address: String?,


)
@SerialName("created_at")
val createdAt: String,
@SerialName("total")
val total: Double,
)
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ interface OrderRepository {
suspend fun addLineItem(lineItem: LineItem)
fun getOneOrderByStatus(status: OrderStatus): Flow<OrderModel?>
suspend fun sendOrderToServer(order: OrderModel): Boolean

suspend fun getOrders(): List<OrderModel>
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,22 @@ import com.hieuwu.groceriesstore.data.database.dao.OrderDao
import com.hieuwu.groceriesstore.data.database.entities.LineItem
import com.hieuwu.groceriesstore.data.database.entities.Order
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.CollectionNames.orders
import com.hieuwu.groceriesstore.utilities.OrderStatus
import com.hieuwu.groceriesstore.utilities.SupabaseMapper
import io.github.jan.supabase.postgrest.Postgrest
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class OrderRepositoryImpl @Inject constructor(
private val orderDao: OrderDao,
private val lineItemDao: LineItemDao,
Expand Down Expand Up @@ -65,4 +67,13 @@ class OrderRepositoryImpl @Inject constructor(
false
}
}

override suspend fun getOrders(): List<OrderModel> {
return try {
val result = postgrest[CollectionNames.orders].select().decodeList<OrderDto>()
result.map { SupabaseMapper.mapToModel(it) }
} catch (e: Exception) {
listOf()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.hieuwu.groceriesstore.domain.usecases.impl.CreateNewOrderUseCaseImpl
import com.hieuwu.groceriesstore.domain.usecases.GetCategoriesListUseCase
import com.hieuwu.groceriesstore.domain.usecases.impl.GetCategoriesListUseCaseImpl
import com.hieuwu.groceriesstore.domain.usecases.GetCurrentCartUseCase
import com.hieuwu.groceriesstore.domain.usecases.GetOrderListUseCase
import com.hieuwu.groceriesstore.domain.usecases.impl.GetCurrentCartUseCaseImpl
import com.hieuwu.groceriesstore.domain.usecases.GetProductDetailUseCase
import com.hieuwu.groceriesstore.domain.usecases.impl.GetProductDetailUseCaseImpl
Expand All @@ -31,6 +32,7 @@ import com.hieuwu.groceriesstore.domain.usecases.impl.UpdateCartItemUseCaseImpl
import com.hieuwu.groceriesstore.domain.usecases.UpdateProfileUseCase
import com.hieuwu.groceriesstore.domain.usecases.impl.UpdateProfileUseCaseImpl
import com.hieuwu.groceriesstore.domain.usecases.UserSettingsUseCase
import com.hieuwu.groceriesstore.domain.usecases.impl.GetOrderListUseCaseImpl
import com.hieuwu.groceriesstore.domain.usecases.impl.UserSettingsUseCaseImpl
import dagger.Binds
import dagger.Module
Expand Down Expand Up @@ -104,4 +106,9 @@ abstract class UseCaseModule {
@ViewModelScoped
@Binds
abstract fun bindSearchProductUseCase(impl: SearchProductUseCaseImpl): SearchProductUseCase

@ViewModelScoped
@Binds
abstract fun bindGetOrdersUseCase(impl: GetOrderListUseCaseImpl): GetOrderListUseCase

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ data class OrderModel(
var id: String = "",
var status: String? = null,
var address: String? = null,
val lineItemList: MutableList<LineItemModel>
val lineItemList: MutableList<LineItemModel>,
val createdAt: String = "",
) {
var totalPrice: Double = 0.0
val total: Double
get() = calculateTotal()

Expand All @@ -17,11 +19,4 @@ data class OrderModel(
}
return sum
}

fun isProductAdded(productId: String): Boolean {
for (item in lineItemList) {
if (item.productId.equals(productId)) return true
}
return false
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.hieuwu.groceriesstore.domain.usecases

import com.hieuwu.groceriesstore.domain.models.OrderModel
import kotlinx.coroutines.flow.Flow

interface GetOrderListUseCase : UseCase<GetOrderListUseCase.Input, GetOrderListUseCase.Output> {
class Input
sealed class Output {
class Success(val data: List<OrderModel>) : Output()
object Failure : Output()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,13 @@ package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.CategoryRepository
import com.hieuwu.groceriesstore.domain.usecases.GetCategoriesListUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import javax.inject.Inject

class GetCategoriesListUseCaseImpl @Inject constructor(
private val categoryRepository: CategoryRepository
) : GetCategoriesListUseCase {
override suspend fun execute(input: GetCategoriesListUseCase.Input): GetCategoriesListUseCase.Output {
return withContext(Dispatchers.IO) {
val result = categoryRepository.getFromLocal()
GetCategoriesListUseCase.Output(result)
}
val result = categoryRepository.getFromLocal()
return GetCategoriesListUseCase.Output(result)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.OrderRepository
import com.hieuwu.groceriesstore.domain.usecases.GetOrderListUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject

class GetOrderListUseCaseImpl @Inject constructor(
private val orderRepository: OrderRepository
) : GetOrderListUseCase {
override suspend fun execute(input: GetOrderListUseCase.Input): GetOrderListUseCase.Output {
return withContext(Dispatchers.IO) {
val result = orderRepository.getOrders()
GetOrderListUseCase.Output.Success(data = result)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,12 @@ package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.UserRepository
import com.hieuwu.groceriesstore.domain.usecases.GetProfileUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import javax.inject.Inject

class GetProfileUseCaseImpl @Inject constructor(private val userRepository: UserRepository) :
GetProfileUseCase {
override suspend fun execute(input: GetProfileUseCase.Input): GetProfileUseCase.Output {
return withContext(Dispatchers.IO) {
val user = userRepository.getCurrentUser()
GetProfileUseCase.Output(user)
}
val user = userRepository.getCurrentUser()
return GetProfileUseCase.Output(user)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,20 +57,26 @@ class AccountFragment : Fragment() {
}

private fun setEventListener() {
binding.profileLayout.setOnClickListener {
findNavController().navigate(R.id.action_accountFragment_to_updateProfileFragment)
}
with(binding) {
profileLayout.setOnClickListener {
findNavController().navigate(R.id.action_accountFragment_to_updateProfileFragment)
}

binding.notificationSettingLayout.setOnClickListener {
findNavController().navigate(R.id.action_accountFragment_to_notificationSettingsFragment)
}
notificationSettingLayout.setOnClickListener {
findNavController().navigate(R.id.action_accountFragment_to_notificationSettingsFragment)
}

binding.signoutButton.setOnClickListener {
viewModel.signOut()
}
orderHistoryLayout.setOnClickListener {
findNavController().navigate(R.id.action_accountFragment_to_orderHistoryFragment)
}

signoutButton.setOnClickListener {
viewModel?.signOut()
}

binding.signinButton.setOnClickListener {
navigateToAuthentication()
signinButton.setOnClickListener {
navigateToAuthentication()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.hieuwu.groceriesstore.presentation.orderhistory

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.Fragment
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class OrderHistoryFragment : Fragment() {


override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return ComposeView(requireContext()).apply {
setContent {
OrderHistoryScreen()
}
}
}
}
Loading

0 comments on commit ca5a54b

Please sign in to comment.