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