Feature: increment, decrement sneaker in basket

This commit is contained in:
Emelyanov535 2023-12-08 23:48:06 +04:00
parent 4bf376ce3f
commit 7990af8e0b
18 changed files with 324 additions and 119 deletions

View File

@ -1,8 +1,10 @@
package com.example.android_programming.api
import com.example.android_programming.api.model.BasketSneakerRemote
import com.example.android_programming.api.model.SneakerRemote
import com.example.android_programming.api.model.UserRemote
import com.example.android_programming.api.model.UserRemoteSignIn
import com.example.android_programming.model.Sneaker
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
import kotlinx.serialization.json.Json
import okhttp3.MediaType.Companion.toMediaType
@ -10,8 +12,10 @@ import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.PUT
import retrofit2.http.Path
import retrofit2.http.Query
@ -29,6 +33,22 @@ interface BackendService {
@Query("size") size: Int,
): List<SneakerRemote>
@POST("sneaker/create")
suspend fun createSneaker(
@Body sneaker: SneakerRemote,
): SneakerRemote
@PUT("sneaker/update/{id}")
suspend fun updateSneaker(
@Path("id") id: Int,
@Body sneaker: SneakerRemote
): SneakerRemote
@DELETE("sneaker/delete/{id}")
suspend fun deleteSneaker(
@Path("id") id: Int
)
//USER
@POST("user/signup")
suspend fun SignUp(
@ -40,6 +60,40 @@ interface BackendService {
@Body user: UserRemoteSignIn
): UserRemote
//BASKET
@POST("basket/createBasketSneaker")
suspend fun createBasketSneaker(
@Body basketSneaker: BasketSneakerRemote
)
@GET("basket/getUserBasketSneakers/{id}")
suspend fun getUserBasketSneakers(
@Path("id") id: Int
): List<SneakerRemote>
@GET("basket/getUserBasket/{id}")
suspend fun getUserBasket(
@Path("id") id: Int
): Int
@GET("basket/getQuantity/{basketId}/{sneakerId}")
suspend fun getQuantity(
@Path("basketId") basketId: Int,
@Path("sneakerId") sneakerId: Int,
): Int
@PUT("basket/incrementQuantity/{basketId}/{sneakerId}")
suspend fun increment(
@Path("basketId") basketId: Int,
@Path("sneakerId") sneakerId: Int,
)
@PUT("basket/decrementQuantity/{basketId}/{sneakerId}")
suspend fun decrement(
@Path("basketId") basketId: Int,
@Path("sneakerId") sneakerId: Int,
)
companion object {
private const val BASE_URL = "https://59k4pfj3-8080.euw.devtunnels.ms/api/"

View File

@ -0,0 +1,9 @@
package com.example.android_programming.api.model
import kotlinx.serialization.Serializable
@Serializable
data class BasketRemote (
val id: Int? = 0,
val userId: Int = 0,
)

View File

@ -0,0 +1,24 @@
package com.example.android_programming.api.model
import com.example.android_programming.model.BasketSneakers
import com.example.android_programming.model.Sneaker
import kotlinx.serialization.Serializable
@Serializable
data class BasketSneakerRemote (
val basketId: Int = 0,
val sneakerId: Int = 0,
val quantity: Int = 0
)
fun BasketSneakerRemote.toBasketSneaker(): BasketSneakers = BasketSneakers(
basketId,
sneakerId,
quantity
)
fun BasketSneakers.toBasketSneakerRemote():BasketSneakerRemote = BasketSneakerRemote(
basketId,
sneakerId,
quantity
)

View File

@ -0,0 +1,75 @@
package com.example.android_programming.api.repository
import com.example.android_programming.api.BackendService
import com.example.android_programming.api.model.SneakerRemote
import com.example.android_programming.api.model.toBasketSneakerRemote
import com.example.android_programming.api.model.toSneaker
import com.example.android_programming.businessLogic.repo.BasketRepository
import com.example.android_programming.model.Basket
import com.example.android_programming.model.BasketSneakers
import com.example.android_programming.model.BasketWithSneakers
import com.example.android_programming.model.Sneaker
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
class RestBasketRepository(
private var service: BackendService
): BasketRepository {
override suspend fun insertBasketSneaker(basketSneaker: BasketSneakers) {
service.createBasketSneaker(basketSneaker.toBasketSneakerRemote())
}
override suspend fun getBasketWithSneakers(id: Int): Flow<List<Sneaker>> {
val sneakersRemoteList = service.getUserBasketSneakers(id)
val sneakersList = sneakersRemoteList.map { it.toSneaker() }
return flowOf(sneakersList.toList())
}
override suspend fun getUserOrder(id: Int): Int {
return service.getUserBasket(id)
}
override suspend fun getQuantity(basketId: Int, sneakerId: Int): Int? {
return service.getQuantity(basketId, sneakerId)
}
//
// override fun getAllBasket(): Flow<List<Basket>> {
// TODO("Not yet implemented")
// }
//
// override suspend fun delete(basket: Basket) {
// TODO("Not yet implemented")
// }
//
// override suspend fun createBasket(basket: Basket): Long {
// TODO("Not yet implemented")
// }
//
// override suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int) {
// TODO("Not yet implemented")
// }
//
// override suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int) {
// TODO("Not yet implemented")
// }
//
override suspend fun incrementSneakerQuantity(basketId: Int, sneakerId: Int) {
service.increment(basketId, sneakerId)
}
override suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int) {
service.decrement(basketId, sneakerId)
}
//
// override suspend fun getQuantity(basketId: Int, sneakerId: Int): Int? {
// TODO("Not yet implemented")
// }
//
// override suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers? {
// TODO("Not yet implemented")
// }
//
// override suspend fun getTotalPriceForUser(userId: Int): Double? {
// TODO("Not yet implemented")
// }
}

View File

@ -8,6 +8,7 @@ import com.example.android_programming.di.AppContainer
import com.example.android_programming.api.BackendService
import com.example.android_programming.api.SneakerRemoteMediator
import com.example.android_programming.api.model.toSneaker
import com.example.android_programming.api.model.toSneakerRemote
import com.example.android_programming.database.AppDatabase
import com.example.android_programming.database.repository.RemoteKeysRepositoryImpl
import com.example.android_programming.model.Sneaker
@ -44,14 +45,14 @@ class RestSneakerRepository(
override suspend fun getSneakerById(id: Int): Sneaker = service.getSneaker(id).toSneaker()
override suspend fun insertSneaker(sneaker: Sneaker) {
print("sdfsd")
service.createSneaker(sneaker.toSneakerRemote())
}
override suspend fun updateSneaker(sneaker: Sneaker) {
print("sdfsd")
sneaker.sneakerId?.let { service.updateSneaker(it, sneaker.toSneakerRemote()) }
}
override suspend fun deleteSneaker(sneaker: Sneaker) {
print("sdfsd")
sneaker.sneakerId?.let { service.deleteSneaker(it) }
}
}

View File

@ -6,19 +6,21 @@ import androidx.room.Query
import com.example.android_programming.model.Basket
import com.example.android_programming.model.BasketSneakers
import com.example.android_programming.model.BasketWithSneakers
import com.example.android_programming.model.Sneaker
import kotlinx.coroutines.flow.Flow
interface BasketRepository {
suspend fun insertBasketSneaker(basketSneaker: BasketSneakers)
fun getBasketWithSneakers(id: Int): Flow<BasketWithSneakers>
fun getAllBasket(): Flow<List<Basket>>
suspend fun delete(basket: Basket)
suspend fun createBasket(basket: Basket):Long
suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int)
suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int)
suspend fun getBasketWithSneakers(id: Int): Flow<List<Sneaker>>
suspend fun getUserOrder(id: Int): Int
// fun getAllBasket(): Flow<List<Basket>>
// suspend fun delete(basket: Basket)
// suspend fun createBasket(basket: Basket):Long
// suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int)
// suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int)
suspend fun incrementSneakerQuantity(basketId: Int, sneakerId: Int)
suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int)
suspend fun getQuantity(basketId: Int, sneakerId: Int): Int?
suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers?
suspend fun getTotalPriceForUser(userId: Int): Double?
// suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers?
// suspend fun getTotalPriceForUser(userId: Int): Double?
}

View File

@ -1,19 +1,34 @@
package com.example.android_programming.businessLogic.vmodel
import androidx.compose.runtime.State
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.android_programming.model.BasketSneakers
import com.example.android_programming.model.BasketWithSneakers
import com.example.android_programming.businessLogic.repo.BasketRepository
import com.example.android_programming.model.Sneaker
import kotlinx.coroutines.async
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
class BasketViewModel(private val basketRepository: BasketRepository): ViewModel() {
private val _quantityStateMap = mutableMapOf<Int, MutableStateFlow<Int>>()
private val _sneakerList = MutableStateFlow<List<Sneaker>>(emptyList())
val sneakerList: StateFlow<List<Sneaker>> = _sneakerList.asStateFlow()
private val _basketId = MutableLiveData<Int>()
val basketId: LiveData<Int> get() = _basketId
fun getQuantityState(basketId: Int, sneakerId: Int): StateFlow<Int> {
val quantityStateFlow = _quantityStateMap.getOrPut(sneakerId) {
MutableStateFlow(0)
@ -26,28 +41,41 @@ class BasketViewModel(private val basketRepository: BasketRepository): ViewModel
return quantityStateFlow
}
suspend fun isSneakerInBasket(basketId: Int, sneakerId: Int): Boolean {
return basketRepository.getSneaker(basketId, sneakerId) != null
}
//
// suspend fun isSneakerInBasket(basketId: Int, sneakerId: Int): Boolean {
// return basketRepository.getSneaker(basketId, sneakerId) != null
// }
fun addToBasket(basketSneakers: BasketSneakers) = viewModelScope.launch {
val isSneakerInBasket = isSneakerInBasket(basketSneakers.basketId, basketSneakers.sneakerId)
if (isSneakerInBasket) {
incrementQuantity(basketSneakers.basketId, basketSneakers.sneakerId)
} else {
basketRepository.insertBasketSneaker(basketSneakers)
basketRepository.insertBasketSneaker(basketSneakers)
// val isSneakerInBasket = isSneakerInBasket(basketSneakers.basketId, basketSneakers.sneakerId)
//
// if (isSneakerInBasket) {
// incrementQuantity(basketSneakers.basketId, basketSneakers.sneakerId)
// } else {
// basketRepository.insertBasketSneaker(basketSneakers)
// }
}
//
fun fetchBasketSneakers(userId: Int) {
viewModelScope.launch {
basketRepository.getBasketWithSneakers(userId).collect {
_sneakerList.emit(it)
}
}
}
fun getBasketSneakers(id: Int): Flow<BasketWithSneakers> {
return basketRepository.getBasketWithSneakers(id)
}
fun deleteSneakerFromBasket(basketId: Int, sneakerId: Int) = viewModelScope.launch {
basketRepository.removeSneakerFromBasket(basketId, sneakerId)
}
// fun getUserBasketId(userId: Int) {
// viewModelScope.async {
// val basket = basketRepository.getUserOrder(userId)
// _basketId.value = basket
// }.await()
// }
//
// fun deleteSneakerFromBasket(basketId: Int, sneakerId: Int) = viewModelScope.launch {
// basketRepository.removeSneakerFromBasket(basketId, sneakerId)
// }
//
fun incrementQuantity(basketId: Int, sneakerId: Int) {
val currentQuantity = _quantityStateMap[sneakerId]?.value ?: 1
_quantityStateMap[sneakerId]?.value = currentQuantity + 1

View File

@ -44,41 +44,41 @@ class OrderViewModel(private val orderRepository: OrderRepository, private val b
return orderRepository.getOrderWithSneakers(id)
}
fun createOrder() = viewModelScope.launch {
val userId = GlobalUser.getInstance().getUser()?.userId!!
val order = Order(
date = Date().time,
city = city.value,
street = street.value,
house = house.value,
subtotal = getSubTotal(userId),
taxes = "%.2f".format(getSubTotal(userId) * 0.05).toDouble(),
total = "%.2f".format(getSubTotal(userId) * 0.05 + getSubTotal(userId)).toDouble(),
creatorUserId = GlobalUser.getInstance().getUser()?.userId!!
)
// fun createOrder() = viewModelScope.launch {
// val userId = GlobalUser.getInstance().getUser()?.userId!!
// val order = Order(
// date = Date().time,
// city = city.value,
// street = street.value,
// house = house.value,
// subtotal = getSubTotal(userId),
// taxes = "%.2f".format(getSubTotal(userId) * 0.05).toDouble(),
// total = "%.2f".format(getSubTotal(userId) * 0.05 + getSubTotal(userId)).toDouble(),
// creatorUserId = GlobalUser.getInstance().getUser()?.userId!!
// )
//
// val orderId = orderRepository.createOrder(order)
//
//// for (sneaker in selectedItems.value.orEmpty()) {
//// val userId = GlobalUser.getInstance().getUser()?.userId!!
//// val orderSneaker = basketRepository.getQuantity(userId, sneaker.sneakerId!!)
//// ?.let { OrderSneaker( orderId.toInt(), sneaker.sneakerId!!, it) }
//// if (orderSneaker != null) {
//// orderRepository.insertOrderSneaker(orderSneaker)
//// }
//// }
// city.value = ""
// street.value = ""
// house.value = ""
// }
val orderId = orderRepository.createOrder(order)
// fun updateSubTotal(userId: Int) {
// viewModelScope.launch {
// _subTotal.value = getSubTotal(userId)
// }
// }
for (sneaker in selectedItems.value.orEmpty()) {
val userId = GlobalUser.getInstance().getUser()?.userId!!
val orderSneaker = basketRepository.getQuantity(userId, sneaker.sneakerId!!)
?.let { OrderSneaker( orderId.toInt(), sneaker.sneakerId!!, it) }
if (orderSneaker != null) {
orderRepository.insertOrderSneaker(orderSneaker)
}
}
city.value = ""
street.value = ""
house.value = ""
}
fun updateSubTotal(userId: Int) {
viewModelScope.launch {
_subTotal.value = getSubTotal(userId)
}
}
suspend fun getSubTotal(userId: Int): Double {
return basketRepository.getTotalPriceForUser(userId) ?: 0.0
}
// suspend fun getSubTotal(userId: Int): Double {
// return basketRepository.getTotalPriceForUser(userId) ?: 0.0
// }
}

View File

@ -6,21 +6,19 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.android_programming.R
import com.example.android_programming.api.repository.RestSneakerRepository
import com.example.android_programming.businessLogic.repo.SneakerRepository
import com.example.android_programming.model.Sneaker
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
class SneakerViewModel(private val sneakerRepository: RestSneakerRepository): ViewModel() {
class SneakerViewModel(private val sneakerRepository: SneakerRepository): ViewModel() {
val sneakerList = sneakerRepository.getAllSneakers()
var brand = mutableStateOf("")
val model = mutableStateOf("")
val description = mutableStateOf("")
val price = mutableStateOf("")
val photo = mutableIntStateOf(R.drawable.img)
var sneaker: Sneaker? = null
private var _record = MutableStateFlow<Sneaker?>(null)
var record: StateFlow<Sneaker?> = _record
fun insertSneaker() = viewModelScope.launch {
val sneaker = Sneaker(
brand = brand.value,

View File

@ -36,7 +36,7 @@ import kotlinx.coroutines.delay
@Composable
fun ChangePanel(navHostController: NavHostController, sneakerViewModel: SneakerViewModel = viewModel(factory = AppViewModelProvider.Factory)) {
// val list = sneakerViewModel.sneakerList.collectAsLazyPagingItems()
val list = sneakerViewModel.sneakerList.collectAsLazyPagingItems()
Column(
modifier = Modifier
@ -44,18 +44,18 @@ fun ChangePanel(navHostController: NavHostController, sneakerViewModel: SneakerV
.background(Color.White)
.padding(16.dp, 80.dp)
) {
// Row {
// LazyColumn(
// modifier = Modifier
// .fillMaxSize()
// ) {
// items(list.itemCount) { index ->
// list[index]?.let { sneaker ->
// CardSneakerForChange(item = sneaker, navController = navHostController)
// }
// }
// }
// }
Row {
LazyColumn(
modifier = Modifier
.fillMaxSize()
) {
items(list.itemCount) { index ->
list[index]?.let { sneaker ->
CardSneakerForChange(item = sneaker, navController = navHostController)
}
}
}
}
}
}

View File

@ -18,6 +18,7 @@ import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ShoppingCart
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
@ -35,7 +36,6 @@ import com.example.android_programming.model.BasketSneakers
import com.example.android_programming.model.Sneaker
import com.example.android_programming.businessLogic.vmodel.AppViewModelProvider
import com.example.android_programming.businessLogic.vmodel.BasketViewModel
import com.example.android_programming.businessLogic.vmodel.SneakerViewModel
import com.google.gson.Gson
@Composable
@ -93,10 +93,13 @@ fun CardSneaker(item: Sneaker, navController: NavHostController, basketViewModel
contentColor = Color.White
),
onClick = {
if(GlobalUser.getInstance().getUser() == null){
val user = GlobalUser.getInstance().getUser()
if(user == null){
navController.navigate("login")
}else{
basketViewModel.addToBasket(BasketSneakers(GlobalUser.getInstance().getUser()?.userId!!, item.sneakerId!!, 1))
// basketViewModel.getUserBasketId(user.userId!!)
// val userBasketId = basketViewModel.basketId.value!!
// basketViewModel.addToBasket(BasketSneakers(userBasketId, item.sneakerId!!, 1))
}
},
modifier = Modifier

View File

@ -81,7 +81,7 @@ fun CardSneakerLike(item: Sneaker, basketViewModel: BasketViewModel = viewModel(
contentColor = Color.White
),
onClick = {
basketViewModel.deleteSneakerFromBasket(GlobalUser.getInstance().getUser()?.userId!!, item.sneakerId!!)
// basketViewModel.deleteSneakerFromBasket(GlobalUser.getInstance().getUser()?.userId!!, item.sneakerId!!)
},
modifier = Modifier
.padding(end = 16.dp)

View File

@ -13,6 +13,7 @@ import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.colorResource
@ -40,11 +41,11 @@ fun OrderScreen(navHostController: NavHostController, basketViewModel: BasketVie
DeliveryAddress(orderViewModel)
val userId = GlobalUser.getInstance().getUser()?.userId
if (userId != null) {
val list by basketViewModel.getBasketSneakers(userId!!).collectAsState(initial = null)
val SneakerList: List<Sneaker>? = list?.sneakers
if (SneakerList != null) {
orderViewModel.updateSelectedItems(SneakerList)
ShoppingList(SneakerList)
basketViewModel.fetchBasketSneakers(userId!!)
val sneakerList: List<Sneaker>? = basketViewModel.sneakerList.collectAsState(null).value
if (sneakerList != null) {
orderViewModel.updateSelectedItems(sneakerList)
ShoppingList(sneakerList)
SubTotal(orderViewModel)
}
}
@ -54,12 +55,12 @@ fun OrderScreen(navHostController: NavHostController, basketViewModel: BasketVie
contentColor = Color.White
),
onClick = {
if(GlobalUser.getInstance().getUser() != null){
orderViewModel.createOrder()
navHostController.navigate("home")
}else{
navHostController.navigate("login")
}
// if(GlobalUser.getInstance().getUser() != null){
// orderViewModel.createOrder()
// navHostController.navigate("home")
// }else{
// navHostController.navigate("login")
// }
},
modifier = Modifier
.fillMaxWidth()

View File

@ -22,7 +22,7 @@ import com.example.android_programming.businessLogic.vmodel.OrderViewModel
@Composable
fun SubTotal(orderViewModel: OrderViewModel) {
val userId = GlobalUser.getInstance().getUser()?.userId!!
orderViewModel.updateSubTotal(userId)
// orderViewModel.updateSubTotal(userId)
val subTotal = orderViewModel.subTotal.value
Column(
modifier = Modifier

View File

@ -5,19 +5,23 @@ import com.example.android_programming.database.dao.BasketDao
import com.example.android_programming.model.Basket
import com.example.android_programming.model.BasketSneakers
import com.example.android_programming.model.BasketWithSneakers
import com.example.android_programming.model.Sneaker
import kotlinx.coroutines.flow.Flow
class BasketRepoImpl(private val basketDao: BasketDao): BasketRepository {
override suspend fun createBasket(basket: Basket): Long = basketDao.createBasket(basket)
override suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int) = basketDao.removeSneakerFromBasket(basketId, sneakerId)
override suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int) = basketDao.updateSneakerQuantity(basketId, sneakerId, quantity)
override suspend fun incrementSneakerQuantity(basketId: Int, sneakerId: Int) = basketDao.incrementSneakerQuantity(basketId, sneakerId)
override suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int) = basketDao.decrementSneakerQuantity(basketId, sneakerId)
override suspend fun insertBasketSneaker(basketSneaker: BasketSneakers) = basketDao.insertBasketSneaker(basketSneaker)
override fun getBasketWithSneakers(id: Int): Flow<BasketWithSneakers> = basketDao.getBasketWithSneakers(id)
override fun getAllBasket(): Flow<List<Basket>> = basketDao.getAllBasket()
override suspend fun delete(basket: Basket) = basketDao.delete(basket)
override suspend fun getQuantity(basketId: Int, sneakerId: Int): Int? = basketDao.getQuantity(basketId, sneakerId)
override suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers? = basketDao.getSneaker(basketId, sneakerId)
override suspend fun getTotalPriceForUser(userId: Int): Double? = basketDao.getTotalPriceForUser(userId)
}
//class BasketRepoImpl(private val basketDao: BasketDao): BasketRepository {
//// override suspend fun createBasket(basket: Basket): Long = basketDao.createBasket(basket)
//// override suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int) = basketDao.removeSneakerFromBasket(basketId, sneakerId)
//// override suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int) = basketDao.updateSneakerQuantity(basketId, sneakerId, quantity)
//// override suspend fun incrementSneakerQuantity(basketId: Int, sneakerId: Int) = basketDao.incrementSneakerQuantity(basketId, sneakerId)
//// override suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int) = basketDao.decrementSneakerQuantity(basketId, sneakerId)
// override suspend fun insertBasketSneaker(basketSneaker: BasketSneakers) = basketDao.insertBasketSneaker(basketSneaker)
// override suspend fun getBasketWithSneakers(id: Int): Flow<List<Sneaker>> {
// return basketDao
// }
//// override fun getBasketWithSneakers(id: Int): Flow<BasketWithSneakers> = basketDao.getBasketWithSneakers(id)
//// override fun getAllBasket(): Flow<List<Basket>> = basketDao.getAllBasket()
//// override suspend fun delete(basket: Basket) = basketDao.delete(basket)
//// override suspend fun getQuantity(basketId: Int, sneakerId: Int): Int? = basketDao.getQuantity(basketId, sneakerId)
//// override suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers? = basketDao.getSneaker(basketId, sneakerId)
//// override suspend fun getTotalPriceForUser(userId: Int): Double? = basketDao.getTotalPriceForUser(userId)
//}

View File

@ -1,13 +1,16 @@
package com.example.android_programming.di
import com.example.android_programming.api.repository.RestBasketRepository
import com.example.android_programming.api.repository.RestSneakerRepository
import com.example.android_programming.api.repository.RestUserRepository
import com.example.android_programming.businessLogic.repo.BasketRepository
import com.example.android_programming.businessLogic.repo.OrderRepository
import com.example.android_programming.businessLogic.repo.SneakerRepository
import com.example.android_programming.businessLogic.repo.UserRepository
interface AppContainer {
val sneakerRepo: RestSneakerRepository
val userRepo: RestUserRepository
val sneakerRepo: SneakerRepository
val userRepo: UserRepository
val orderRepo: OrderRepository
val basketRepo: BasketRepository

View File

@ -2,18 +2,20 @@ package com.example.android_programming.di
import android.content.Context
import com.example.android_programming.api.BackendService
import com.example.android_programming.api.repository.RestBasketRepository
import com.example.android_programming.api.repository.RestSneakerRepository
import com.example.android_programming.api.repository.RestUserRepository
import com.example.android_programming.database.AppDatabase
import com.example.android_programming.database.repository.RemoteKeysRepositoryImpl
import com.example.android_programming.database.repository.BasketRepoImpl
import com.example.android_programming.businessLogic.repo.BasketRepository
import com.example.android_programming.database.repository.OrderRepoImpl
import com.example.android_programming.businessLogic.repo.OrderRepository
import com.example.android_programming.businessLogic.repo.SneakerRepository
import com.example.android_programming.businessLogic.repo.UserRepository
import com.example.android_programming.database.repository.SneakerRepoImpl
class AppDataContainer(private val context: Context) : AppContainer {
override val sneakerRepo: RestSneakerRepository by lazy {
override val sneakerRepo: SneakerRepository by lazy {
RestSneakerRepository(
BackendService.getInstance(),
sneakerRepository,
@ -21,15 +23,16 @@ class AppDataContainer(private val context: Context) : AppContainer {
remoteKeyRepository
)
}
override val userRepo: RestUserRepository by lazy {
override val userRepo: UserRepository by lazy {
RestUserRepository(BackendService.getInstance())
}
override val basketRepo: BasketRepository by lazy {
RestBasketRepository(BackendService.getInstance())
}
override val orderRepo: OrderRepository by lazy {
OrderRepoImpl(AppDatabase.getInstance(context).orderDao())
}
override val basketRepo: BasketRepository by lazy {
BasketRepoImpl(AppDatabase.getInstance(context).basketDao())
}
private val sneakerRepository: SneakerRepoImpl by lazy {
SneakerRepoImpl(AppDatabase.getInstance(context).sneakerDao())
}

View File

@ -4,7 +4,7 @@ import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(primaryKeys = ["basketId", "sneakerId"])
class BasketSneakers (
class BasketSneakers(
val basketId: Int,
val sneakerId: Int,
val quantity: Int