From f1f3dcf01f4c435c73db21f6de4360030a1081b9 Mon Sep 17 00:00:00 2001 From: Danil Markov <danilmarkov88@gmail.com> Date: Sat, 25 Nov 2023 16:25:39 +0400 Subject: [PATCH] feature&fix: lab4 add viewmodel, fix repos --- .idea/workspace.xml | 25 ++++++---- .../com/example/myapplication/dao/OrderDao.kt | 3 ++ .../repository/OrderRepository.kt | 1 + .../repository/UserRepository.kt | 1 - .../viewmodel/BasketViewModel.kt | 43 +++++++++++++++++ .../myapplication/viewmodel/OrderViewModel.kt | 47 +++++++++++++++++++ .../viewmodel/ServiceViewModel.kt | 43 +++++++++++++++++ .../myapplication/viewmodel/UserViewModel.kt | 43 +++++++++++++++++ 8 files changed, 195 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/example/myapplication/viewmodel/BasketViewModel.kt create mode 100644 app/src/main/java/com/example/myapplication/viewmodel/OrderViewModel.kt create mode 100644 app/src/main/java/com/example/myapplication/viewmodel/ServiceViewModel.kt create mode 100644 app/src/main/java/com/example/myapplication/viewmodel/UserViewModel.kt diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 8b46566..ed6f5f6 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -9,16 +9,13 @@ <option name="autoReloadType" value="NONE" /> </component> <component name="ChangeListManager"> - <list default="true" id="7c94e195-a540-483e-9a1c-11797aeb1741" name="Changes" comment="feature: lab3 is done"> - <change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/BasketRepository.kt" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/OrderRepository.kt" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/ServiceRepository.kt" afterDir="false" /> - <change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/UserRepository.kt" afterDir="false" /> + <list default="true" id="7c94e195-a540-483e-9a1c-11797aeb1741" name="Changes" comment="feature: lab4 add repos"> + <change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/viewmodel/OrderViewModel.kt" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/viewmodel/ServiceViewModel.kt" afterDir="false" /> + <change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/viewmodel/UserViewModel.kt" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/BasketDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/BasketDao.kt" afterDir="false" /> <change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/OrderDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/OrderDao.kt" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/ServiceDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/ServiceDao.kt" afterDir="false" /> - <change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/UserDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/UserDao.kt" afterDir="false" /> + <change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/OrderRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/OrderRepository.kt" afterDir="false" /> </list> <option name="SHOW_DIALOG" value="false" /> <option name="HIGHLIGHT_CONFLICTS" value="true" /> @@ -291,7 +288,14 @@ <option name="project" value="LOCAL" /> <updated>1699948377847</updated> </task> - <option name="localTasksCounter" value="6" /> + <task id="LOCAL-00006" summary="feature: lab4 add repos"> + <created>1700908930838</created> + <option name="number" value="00006" /> + <option name="presentableId" value="LOCAL-00006" /> + <option name="project" value="LOCAL" /> + <updated>1700908930838</updated> + </task> + <option name="localTasksCounter" value="7" /> <servers /> </component> <component name="Vcs.Log.Tabs.Properties"> @@ -309,6 +313,7 @@ <MESSAGE value="empty activity test" /> <MESSAGE value="feature: UI, lab2 maybe done" /> <MESSAGE value="feature: lab3 is done" /> - <option name="LAST_COMMIT_MESSAGE" value="feature: lab3 is done" /> + <MESSAGE value="feature: lab4 add repos" /> + <option name="LAST_COMMIT_MESSAGE" value="feature: lab4 add repos" /> </component> </project> \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/dao/OrderDao.kt b/app/src/main/java/com/example/myapplication/dao/OrderDao.kt index 5ba7edf..4909303 100644 --- a/app/src/main/java/com/example/myapplication/dao/OrderDao.kt +++ b/app/src/main/java/com/example/myapplication/dao/OrderDao.kt @@ -7,6 +7,7 @@ import androidx.room.Query import com.example.myapplication.model.Order import com.example.myapplication.model.OrderService import com.example.myapplication.model.OrderWithServices +import com.example.myapplication.model.UserWithOrder import kotlinx.coroutines.flow.Flow @Dao @@ -21,4 +22,6 @@ interface OrderDao { suspend fun getOrderWithServices(id: Int): Flow<OrderWithServices> @Query("SELECT * FROM tbl_order") suspend fun getAllOrders(): Flow<List<Order>> + @Query("SELECT * FROM tbl_user WHERE userId =:id") + suspend fun getUserOrders(id: Int) : Flow<UserWithOrder> } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/repository/OrderRepository.kt b/app/src/main/java/com/example/myapplication/repository/OrderRepository.kt index 0cc6c83..f70cc05 100644 --- a/app/src/main/java/com/example/myapplication/repository/OrderRepository.kt +++ b/app/src/main/java/com/example/myapplication/repository/OrderRepository.kt @@ -10,4 +10,5 @@ class OrderRepository(private val orderDao: OrderDao) { suspend fun delete(order: Order) = orderDao.delete(order) suspend fun getOrderWithServices(id: Int) = orderDao.getOrderWithServices(id) suspend fun getAllOrders() = orderDao.getAllOrders() + suspend fun getUserOrders(id: Int) = orderDao.getUserOrders(id) } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/repository/UserRepository.kt b/app/src/main/java/com/example/myapplication/repository/UserRepository.kt index 79b605e..fb8ae13 100644 --- a/app/src/main/java/com/example/myapplication/repository/UserRepository.kt +++ b/app/src/main/java/com/example/myapplication/repository/UserRepository.kt @@ -9,5 +9,4 @@ class UserRepository(private val userDao: UserDao) { suspend fun delete(user: User) = userDao.delete(user) suspend fun getUserById(id: Int) = userDao.getUserById(id) suspend fun getUserByEmail(email: String) = userDao.getUserByEmail(email) - suspend fun getUserByEmail(id: Int) = userDao.getUserOrders(id) } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/viewmodel/BasketViewModel.kt b/app/src/main/java/com/example/myapplication/viewmodel/BasketViewModel.kt new file mode 100644 index 0000000..68e1b5e --- /dev/null +++ b/app/src/main/java/com/example/myapplication/viewmodel/BasketViewModel.kt @@ -0,0 +1,43 @@ +package com.example.myapplication.viewmodel + +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.example.myapplication.GlobalUser +import com.example.myapplication.model.Basket +import com.example.myapplication.model.BasketService +import com.example.myapplication.model.BasketWithServices +import com.example.myapplication.model.Service +import com.example.myapplication.repository.BasketRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.launch + +class BasketViewModel(private val basketRepository: BasketRepository) : ViewModel() { + val date = mutableLongStateOf(0L) + private var _selectedItems = mutableStateOf<List<Service>>(emptyList()) + val selectedItems get() = _selectedItems.value + + fun createBasket() = viewModelScope.launch { + val basket = Basket( + date = date.value, + total = getTotal(), + creatorUserId = GlobalUser.getInstance().getUser()?.userId!! + ) + + var basketId = basketRepository.insert(basket) + + for(service in selectedItems){ + val basketService = BasketService(null, basketId.toInt(), service.serviceId!!) + basketRepository.insertBasketService(basketService) + } + } + + suspend fun getBasketWithServices(id: Int) : Flow<BasketWithServices> { + return basketRepository.getBasketWithServices(id) + } + + private fun getTotal(): Double { + return selectedItems.sumOf { it.price } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/viewmodel/OrderViewModel.kt b/app/src/main/java/com/example/myapplication/viewmodel/OrderViewModel.kt new file mode 100644 index 0000000..a314867 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/viewmodel/OrderViewModel.kt @@ -0,0 +1,47 @@ +package com.example.myapplication.viewmodel + +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.example.myapplication.GlobalUser +import com.example.myapplication.model.Order +import com.example.myapplication.model.OrderService +import com.example.myapplication.model.OrderWithServices +import com.example.myapplication.model.Service +import com.example.myapplication.model.UserWithOrder +import com.example.myapplication.repository.OrderRepository +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.launch +import java.util.Date + +class OrderViewModel(private val orderRepository: OrderRepository) : ViewModel() { + private var _selectedItems = mutableStateOf<List<Service>>(emptyList()) + val selectedItems get() = _selectedItems.value + + fun createOrder() = viewModelScope.launch { + val order = Order( + date = Date().time, + total = getTotal(), + creatorUserId = GlobalUser.getInstance().getUser()?.userId!! + ) + + var orderId = orderRepository.insert(order) + + for(service in selectedItems){ + val orderService = OrderService(orderId.toInt(), service.serviceId!!) + orderRepository.insertOrderService(orderService) + } + } + + suspend fun getOrderWithServices(id: Int) : Flow<OrderWithServices> { + return orderRepository.getOrderWithServices(id) + } + + suspend fun getUserOrders(id: Int): Flow<UserWithOrder> { + return orderRepository.getUserOrders(id) + } + + private fun getTotal(): Double { + return selectedItems.sumOf { it.price } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/viewmodel/ServiceViewModel.kt b/app/src/main/java/com/example/myapplication/viewmodel/ServiceViewModel.kt new file mode 100644 index 0000000..edf4e32 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/viewmodel/ServiceViewModel.kt @@ -0,0 +1,43 @@ +package com.example.myapplication.viewmodel + +import androidx.compose.runtime.mutableDoubleStateOf +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.example.myapplication.R +import com.example.myapplication.model.Service +import com.example.myapplication.repository.ServiceRepository +import kotlinx.coroutines.launch + +class ServiceViewModel(private val serviceRepository: ServiceRepository): ViewModel() { + var name = mutableStateOf("") + var price = mutableDoubleStateOf(0.00) + var photo = mutableIntStateOf(R.drawable.image_service) + var service: Service? = null + + fun createService() = viewModelScope.launch { + val service = Service( + name = name.value, + price = price.doubleValue, + photo = photo.intValue + ) + serviceRepository.insert(service) + } + + fun updateService(service: Service) = viewModelScope.launch { + serviceRepository.update(service) + } + + fun deleteService(service: Service) = viewModelScope.launch { + serviceRepository.delete(service) + } + + fun getServiceById(id: Int) = viewModelScope.launch { + serviceRepository.getServiceById(id) + } + + fun getAllServices() = viewModelScope.launch { + serviceRepository.getAllServices() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/viewmodel/UserViewModel.kt b/app/src/main/java/com/example/myapplication/viewmodel/UserViewModel.kt new file mode 100644 index 0000000..e005954 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/viewmodel/UserViewModel.kt @@ -0,0 +1,43 @@ +package com.example.myapplication.viewmodel + +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.example.myapplication.GlobalUser +import com.example.myapplication.R +import com.example.myapplication.model.RoleEnum +import com.example.myapplication.model.User +import com.example.myapplication.repository.UserRepository +import kotlinx.coroutines.launch + +class UserViewModel(private val userRepository: UserRepository): ViewModel() { + var name = mutableStateOf("") + var surname = mutableStateOf("") + var email = mutableStateOf("") + var password = mutableStateOf("") + var photo = mutableIntStateOf(R.drawable.icon_profile) + + fun createUser() = viewModelScope.launch { + val user = User( + name = name.value, + surname = surname.value, + email = email.value, + password = password.value, + role = RoleEnum.User + ) + userRepository.insert(user) + } + + fun authUser() = viewModelScope.launch { + val user = userRepository.getUserByEmail(email.value) + if(!password.value.isEmpty() and (user.password == password.value)){ + val globalUser = GlobalUser.getInstance() + globalUser.setUser(user) + } + } + + fun isValidEmail(email: String): Boolean { + return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches() + } +} \ No newline at end of file