feature&fix: lab4 add viewmodel, fix repos

This commit is contained in:
Danil Markov 2023-11-25 16:25:39 +04:00
parent ff959a86aa
commit f1f3dcf01f
8 changed files with 195 additions and 11 deletions

25
.idea/workspace.xml generated
View File

@ -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>

View File

@ -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>
}

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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 }
}
}

View File

@ -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 }
}
}

View File

@ -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()
}
}

View File

@ -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()
}
}