This commit is contained in:
Zyzf 2023-12-20 13:19:12 +04:00
parent 1819d11e39
commit 2f4910bf07
13 changed files with 89 additions and 30 deletions

View File

@ -4,18 +4,18 @@
<value> <value>
<entry key="app"> <entry key="app">
<State> <State>
<runningDeviceTargetSelectedWithDropDown> <targetSelectedWithDropDown>
<Target> <Target>
<type value="RUNNING_DEVICE_TARGET" /> <type value="QUICK_BOOT_TARGET" />
<deviceKey> <deviceKey>
<Key> <Key>
<type value="SERIAL_NUMBER" /> <type value="VIRTUAL_DEVICE_PATH" />
<value value="5l55mnq48hlndua6" /> <value value="$USER_HOME$/.android/avd/Pixel_7_API_33.avd" />
</Key> </Key>
</deviceKey> </deviceKey>
</Target> </Target>
</runningDeviceTargetSelectedWithDropDown> </targetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2023-12-15T06:33:52.521291494Z" /> <timeTargetWasSelectedWithDropDown value="2023-12-20T08:37:35.519292927Z" />
</State> </State>
</entry> </entry>
</value> </value>

View File

@ -23,7 +23,7 @@ interface MyServerService {
@Query("pageSize") limit: Int, @Query("pageSize") limit: Int,
): List<UserRemote> ): List<UserRemote>
@GET("user/{id}/") @GET("user/{id}")
suspend fun getUser( suspend fun getUser(
@Path("id") id: Int, @Path("id") id: Int,
): UserRemote ): UserRemote
@ -78,7 +78,7 @@ interface MyServerService {
): CoffeeRemote ): CoffeeRemote
companion object { companion object {
private const val BASE_URL = "http://192.168.42.143:8080/api/" private const val BASE_URL = "http://192.168.0.100:8080/api/"
@Volatile @Volatile
private var INSTANCE: MyServerService? = null private var INSTANCE: MyServerService? = null

View File

@ -44,18 +44,18 @@ class RestUserRepository(
} }
override suspend fun getByUid(uid: Int): User = override suspend fun getByUid(uid: Int): User =
service.getUser(uid).toUser() service.getUser(uid).toUser()!!
override suspend fun tryLogin(login: String, password: String): User = override suspend fun tryLogin(login: String, password: String): User? =
service.tryLogin(login, password).toUser() service.tryLogin(login, password).toUser()
override suspend fun insert(user: User): Long { override suspend fun insert(user: User): Long {
return service.createUser(user.toUserRemote()).toUser().uid.toLong() return service.createUser(user.toUserRemote()).toUser()?.uid?.toLong()!!
} }
override suspend fun update(user: User): Int { override suspend fun update(user: User): Int {
return service.updateUser(user.uid, user.toUserRemote()).toUser().uid return service.updateUser(user.uid, user.toUserRemote()).toUser()?.uid!!
} }
override suspend fun delete(user: User) { override suspend fun delete(user: User) {

View File

@ -8,6 +8,7 @@ import com.zyzf.coffeepreorder.CoffeeApplication
import com.zyzf.coffeepreorder.ui.cart.CartViewModel import com.zyzf.coffeepreorder.ui.cart.CartViewModel
import com.zyzf.coffeepreorder.ui.coffee.CoffeeListViewModel import com.zyzf.coffeepreorder.ui.coffee.CoffeeListViewModel
import com.zyzf.coffeepreorder.ui.login.LoginViewModel import com.zyzf.coffeepreorder.ui.login.LoginViewModel
import com.zyzf.coffeepreorder.ui.profile.ProfileViewModel
import com.zyzf.coffeepreorder.ui.register.RegisterViewModel import com.zyzf.coffeepreorder.ui.register.RegisterViewModel
object AppViewModelProvider { object AppViewModelProvider {
@ -24,6 +25,9 @@ object AppViewModelProvider {
initializer { initializer {
RegisterViewModel(coffeeApplication().container.userRestRepository) RegisterViewModel(coffeeApplication().container.userRestRepository)
} }
initializer {
ProfileViewModel(coffeeApplication().container.userRestRepository)
}
} }
} }

View File

@ -52,11 +52,9 @@ class CoffeeListViewModel(
copyFileToSftp(f, "/mnt/nextcloud/data/Zyzf/files/Images") copyFileToSftp(f, "/mnt/nextcloud/data/Zyzf/files/Images")
} }
suspend fun editCoffee(coffee: Coffee, imageUri: Uri?, context: Context) { suspend fun editCoffee(coffee: Coffee, imageUri: Any?, context: Context) {
val editedCoffee: Int = coffeeRepository.update(coffee) val editedCoffee: Int = coffeeRepository.update(coffee)
if (imageUri == null) { if (imageUri !is Uri) return
return
}
val inputStream = context.contentResolver.openInputStream(imageUri) val inputStream = context.contentResolver.openInputStream(imageUri)
val bitmap = BitmapFactory.decodeStream(inputStream) val bitmap = BitmapFactory.decodeStream(inputStream)

View File

@ -8,6 +8,11 @@ class LoginViewModel(
private val userRepository: UserRepository private val userRepository: UserRepository
) : ViewModel() { ) : ViewModel() {
suspend fun tryLogin(login: String, password: String): User? { suspend fun tryLogin(login: String, password: String): User? {
return userRepository.tryLogin(login, password) val user: User? = userRepository.tryLogin(login, password)
return if (user?.uid == 0) {
null
} else {
user
}
} }
} }

View File

@ -29,6 +29,7 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -39,13 +40,17 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController import androidx.navigation.NavController
import com.zyzf.coffeepreorder.CoffeeApplication import com.zyzf.coffeepreorder.CoffeeApplication
import com.zyzf.coffeepreorder.R import com.zyzf.coffeepreorder.R
import com.zyzf.coffeepreorder.database.AppDatabase import com.zyzf.coffeepreorder.database.AppDatabase
import com.zyzf.coffeepreorder.database.model.User import com.zyzf.coffeepreorder.database.model.User
import com.zyzf.coffeepreorder.ui.AppViewModelProvider
import com.zyzf.coffeepreorder.ui.login.LoginViewModel
import com.zyzf.coffeepreorder.ui.navigation.Screen import com.zyzf.coffeepreorder.ui.navigation.Screen
import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
@ -54,10 +59,14 @@ import kotlinx.coroutines.withContext
@OptIn(DelicateCoroutinesApi::class) @OptIn(DelicateCoroutinesApi::class)
@Composable @Composable
fun Profile(navController: NavController?) { fun Profile(
navController: NavController?,
viewModel: ProfileViewModel = viewModel(factory = AppViewModelProvider.Factory)
) {
val openDialogEdit = remember { mutableStateOf(false) } val openDialogEdit = remember { mutableStateOf(false) }
val openDialogExit = remember { mutableStateOf(false) } val openDialogExit = remember { mutableStateOf(false) }
val openDialogDelete = remember { mutableStateOf(false) } val openDialogDelete = remember { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope()
val context = LocalContext.current val context = LocalContext.current
var user: User by remember { mutableStateOf(User("", "", "", "", "")) } var user: User by remember { mutableStateOf(User("", "", "", "", "")) }
var userLogin by remember { mutableStateOf("") } var userLogin by remember { mutableStateOf("") }
@ -193,13 +202,10 @@ fun Profile(navController: NavController?) {
confirmButton = { confirmButton = {
TextButton( TextButton(
onClick = { onClick = {
GlobalScope.launch (Dispatchers.Main) { coroutineScope.launch {
if (userOldPsswd.value == user.password && userNewPsswd.value == userNewPsswdConf.value) { val user: User = viewModel.changeUser(user.password, userOldPsswd.value, userNewPsswd.value, userNewPsswd.value,
val userUid: Int? = AppDatabase.getInstance(context).userDao().update(User( user.uid, userLogin, userFIO, userPhone, user.role)
user.uid, userLogin, userFIO, userPhone, userNewPsswd.value, user.role)) CoffeeApplication.currentUser = user
user = AppDatabase.getInstance(context).userDao().getByUid(userUid!!)!!
CoffeeApplication.currentUser = user
}
} }
openDialogEdit.value = false openDialogEdit.value = false
} }

View File

@ -0,0 +1,30 @@
package com.zyzf.coffeepreorder.ui.profile
import androidx.lifecycle.ViewModel
import com.zyzf.coffeepreorder.CoffeeApplication
import com.zyzf.coffeepreorder.database.AppDatabase
import com.zyzf.coffeepreorder.database.model.User
import com.zyzf.coffeepreorder.database.repository.UserRepository
class ProfileViewModel(
private val userRepository: UserRepository
) : ViewModel() {
suspend fun changeUser(currentUserPassw: String,
userOldPsswd: String,
userNewPsswd: String,
userNewPsswdConf: String,
userUid: Int,
userLogin: String,
userFIO: String,
userPhone: String,
userRole: String): User {
if (userOldPsswd == currentUserPassw && userNewPsswd == userNewPsswdConf) {
val userUid: Int? = userRepository.update(User(
userUid, userLogin, userFIO, userPhone, userNewPsswd, userRole))
} else {
val userUid: Int? = userRepository.update(User(
userUid, userLogin, userFIO, userPhone, currentUserPassw, userRole))
}
return userRepository.getByUid(userUid!!)!!
}
}

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<network-security-config> <network-security-config>
<domain-config cleartextTrafficPermitted="true"> <domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">192.168.42.143</domain> <domain includeSubdomains="true">192.168.0.100</domain>
</domain-config> </domain-config>
</network-security-config> </network-security-config>

View File

@ -2,6 +2,7 @@ package com.kalyshev.yan.coffee.service;
import com.kalyshev.yan.coffee.controller.CoffeeDto; import com.kalyshev.yan.coffee.controller.CoffeeDto;
import com.kalyshev.yan.coffee.model.Coffee; import com.kalyshev.yan.coffee.model.Coffee;
import com.kalyshev.yan.coffee.repository.CoffeeNotFoundException;
import com.kalyshev.yan.coffee.repository.CoffeeRepository; import com.kalyshev.yan.coffee.repository.CoffeeRepository;
import com.kalyshev.yan.user.repository.UserNotFoundException; import com.kalyshev.yan.user.repository.UserNotFoundException;
import com.kalyshev.yan.util.validation.ValidatorUtil; import com.kalyshev.yan.util.validation.ValidatorUtil;
@ -40,7 +41,7 @@ public class CoffeeService {
@Transactional(readOnly = true) @Transactional(readOnly = true)
public Coffee findCoffee(Long id) { public Coffee findCoffee(Long id) {
final Optional<Coffee> coffee = coffeeRepository.findById(id); final Optional<Coffee> coffee = coffeeRepository.findById(id);
return coffee.orElseThrow(() -> new UserNotFoundException(id)); return coffee.orElseThrow(() -> new CoffeeNotFoundException(id));
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public List<CoffeeDto> findAllCoffees(int pageNo, int pageSize, String sortBy, String sortDir) { public List<CoffeeDto> findAllCoffees(int pageNo, int pageSize, String sortBy, String sortDir) {

View File

@ -30,7 +30,7 @@ public class UserController {
return userService.findAllUsers(pageNo, pageSize, sortBy, sortDir); return userService.findAllUsers(pageNo, pageSize, sortBy, sortDir);
} }
@GetMapping("/tryLogin") @GetMapping("/tryLogin")
public Optional<User> tryLogin( public User tryLogin(
@RequestParam(value = "login") String login, @RequestParam(value = "login") String login,
@RequestParam(value = "password") String password @RequestParam(value = "password") String password
){ ){

View File

@ -27,6 +27,14 @@ public class User {
this.password = password; this.password = password;
this.role = role; this.role = role;
} }
public User(Long id, String login, String fio, String phone, String password, String role) {
this.id = id;
this.login = login;
this.fio = fio;
this.phone = phone;
this.password = password;
this.role = role;
}
public Long getId() { public Long getId() {
return id; return id;

View File

@ -1,5 +1,6 @@
package com.kalyshev.yan.user.service; package com.kalyshev.yan.user.service;
import com.kalyshev.yan.coffee.repository.CoffeeNotFoundException;
import com.kalyshev.yan.user.controller.UserDto; import com.kalyshev.yan.user.controller.UserDto;
import com.kalyshev.yan.user.model.User; import com.kalyshev.yan.user.model.User;
import com.kalyshev.yan.user.repository.UserNotFoundException; import com.kalyshev.yan.user.repository.UserNotFoundException;
@ -52,8 +53,14 @@ public class UserService {
return user.orElseThrow(() -> new UserNotFoundException(id)); return user.orElseThrow(() -> new UserNotFoundException(id));
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public Optional<User> tryLogin(String login, String password) { public User tryLogin(String login, String password) {
return userRepository.tryLogin(login, password); Optional<User> user = userRepository.tryLogin(login, password);
if (user.isPresent()) {
return user.orElseThrow((() -> new UserNotFoundException((long)0))) ;
} else {
return new User((long)0,"", "", "", "", "");
}
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
public List<UserDto> findAllUsers(int pageNo, int pageSize, String sortBy, String sortDir) { public List<UserDto> findAllUsers(int pageNo, int pageSize, String sortBy, String sortDir) {