From d3fde20a0a080350cf6d6ae2a68cbff33a0ac96c Mon Sep 17 00:00:00 2001 From: zyzf Date: Fri, 15 Dec 2023 11:48:20 +0400 Subject: [PATCH] fixed warnings --- .../zyzf/coffeepreorder/CoffeeApplication.kt | 1 - .../coffeepreorder/MainComposeActivity.kt | 3 - .../api/user/RestUserRepository.kt | 7 -- .../api/user/UserRemoteMediator.kt | 3 - .../coffeepreorder/database/dao/UserDao.kt | 3 - .../coffeepreorder/database/model/Cart.kt | 3 +- .../coffeepreorder/database/model/Coffee.kt | 3 +- .../coffeepreorder/database/model/User.kt | 3 +- .../repository/OfflineUserRepository.kt | 1 - .../com/zyzf/coffeepreorder/ui/cart/Cart.kt | 28 ++---- .../coffeepreorder/ui/coffee/CoffeeList.kt | 37 ++++---- .../com/zyzf/coffeepreorder/ui/login/Login.kt | 4 - .../coffeepreorder/ui/login/LoginViewModel.kt | 1 - .../zyzf/coffeepreorder/ui/profile/Profile.kt | 3 +- .../coffeepreorder/ui/register/Register.kt | 6 -- .../ui/register/RegisterViewModel.kt | 1 - app/src/main/res/drawable/coffee_image.png | Bin 30570 -> 0 bytes .../main/res/drawable/ic_connection_error.xml | 25 ----- app/src/main/res/values/colors.xml | 10 +- app/src/main/res/values/strings.xml | 14 --- backend/build.gradle | 3 +- .../coffee/controller/CoffeeController.java | 1 - .../yan/coffee/controller/CoffeeDto.java | 2 - .../com/kalyshev/yan/coffee/model/Coffee.java | 2 - .../yan/coffee/service/CoffeeService.java | 1 - .../kalyshev/yan/user/controller/UserDto.java | 2 - .../com/kalyshev/yan/user/model/User.java | 2 - .../yan/user/service/UserService.java | 7 +- .../com/kalyshev/yan/JpaCabinetTests.java | 64 ------------- .../kalyshev/yan/JpaComputerCabinetTests.java | 85 ----------------- .../com/kalyshev/yan/JpaComputerTests.java | 89 ------------------ .../com/kalyshev/yan/JpaMonitorTests.java | 78 --------------- 32 files changed, 35 insertions(+), 457 deletions(-) delete mode 100644 app/src/main/res/drawable/coffee_image.png delete mode 100644 app/src/main/res/drawable/ic_connection_error.xml delete mode 100644 backend/src/test/java/com/kalyshev/yan/JpaCabinetTests.java delete mode 100644 backend/src/test/java/com/kalyshev/yan/JpaComputerCabinetTests.java delete mode 100644 backend/src/test/java/com/kalyshev/yan/JpaComputerTests.java delete mode 100644 backend/src/test/java/com/kalyshev/yan/JpaMonitorTests.java diff --git a/app/src/main/java/com/zyzf/coffeepreorder/CoffeeApplication.kt b/app/src/main/java/com/zyzf/coffeepreorder/CoffeeApplication.kt index 457cbc1..ce12640 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/CoffeeApplication.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/CoffeeApplication.kt @@ -3,7 +3,6 @@ package com.zyzf.coffeepreorder import android.app.Application import com.zyzf.coffeepreorder.database.AppContainer import com.zyzf.coffeepreorder.database.AppDataContainer -import com.zyzf.coffeepreorder.database.model.Coffee import com.zyzf.coffeepreorder.database.model.User class CoffeeApplication : Application() { diff --git a/app/src/main/java/com/zyzf/coffeepreorder/MainComposeActivity.kt b/app/src/main/java/com/zyzf/coffeepreorder/MainComposeActivity.kt index 3fadc1c..dffe05c 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/MainComposeActivity.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/MainComposeActivity.kt @@ -1,15 +1,12 @@ package com.zyzf.coffeepreorder -import android.content.res.Configuration import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface -import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview import com.zyzf.coffeepreorder.ui.navigation.MainNavbar import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme diff --git a/app/src/main/java/com/zyzf/coffeepreorder/api/user/RestUserRepository.kt b/app/src/main/java/com/zyzf/coffeepreorder/api/user/RestUserRepository.kt index 16c051a..03a1ecd 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/api/user/RestUserRepository.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/api/user/RestUserRepository.kt @@ -6,18 +6,11 @@ import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData import com.zyzf.coffeepreorder.api.MyServerService -import com.zyzf.coffeepreorder.api.coffee.CoffeeRemoteMediator -import com.zyzf.coffeepreorder.api.model.UserRemote -import com.zyzf.coffeepreorder.api.model.toCoffee -import com.zyzf.coffeepreorder.api.model.toCoffeeRemote import com.zyzf.coffeepreorder.api.model.toUser import com.zyzf.coffeepreorder.api.model.toUserRemote import com.zyzf.coffeepreorder.database.AppContainer import com.zyzf.coffeepreorder.database.AppDatabase -import com.zyzf.coffeepreorder.database.model.Coffee import com.zyzf.coffeepreorder.database.model.User -import com.zyzf.coffeepreorder.database.repository.CoffeeRepository -import com.zyzf.coffeepreorder.database.repository.OfflineCoffeeRepository import com.zyzf.coffeepreorder.database.repository.OfflineRemoteKeyRepository import com.zyzf.coffeepreorder.database.repository.OfflineUserRepository import com.zyzf.coffeepreorder.database.repository.UserRepository diff --git a/app/src/main/java/com/zyzf/coffeepreorder/api/user/UserRemoteMediator.kt b/app/src/main/java/com/zyzf/coffeepreorder/api/user/UserRemoteMediator.kt index db24acb..e3a2499 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/api/user/UserRemoteMediator.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/api/user/UserRemoteMediator.kt @@ -6,14 +6,11 @@ import androidx.paging.PagingState import androidx.paging.RemoteMediator import androidx.room.withTransaction import com.zyzf.coffeepreorder.api.MyServerService -import com.zyzf.coffeepreorder.api.model.toCoffee import com.zyzf.coffeepreorder.api.model.toUser import com.zyzf.coffeepreorder.database.AppDatabase -import com.zyzf.coffeepreorder.database.model.Coffee import com.zyzf.coffeepreorder.database.model.RemoteKeyType import com.zyzf.coffeepreorder.database.model.RemoteKeys import com.zyzf.coffeepreorder.database.model.User -import com.zyzf.coffeepreorder.database.repository.OfflineCoffeeRepository import com.zyzf.coffeepreorder.database.repository.OfflineRemoteKeyRepository import com.zyzf.coffeepreorder.database.repository.OfflineUserRepository import retrofit2.HttpException diff --git a/app/src/main/java/com/zyzf/coffeepreorder/database/dao/UserDao.kt b/app/src/main/java/com/zyzf/coffeepreorder/database/dao/UserDao.kt index 4f9c1e1..cc1884b 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/database/dao/UserDao.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/database/dao/UserDao.kt @@ -6,10 +6,7 @@ import androidx.room.Delete import androidx.room.Insert import androidx.room.Query import androidx.room.Update -import com.zyzf.coffeepreorder.api.user.RestUserRepository -import com.zyzf.coffeepreorder.database.model.Coffee import com.zyzf.coffeepreorder.database.model.User -import kotlinx.coroutines.flow.Flow @Dao interface UserDao { diff --git a/app/src/main/java/com/zyzf/coffeepreorder/database/model/Cart.kt b/app/src/main/java/com/zyzf/coffeepreorder/database/model/Cart.kt index b031660..ac9a86c 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/database/model/Cart.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/database/model/Cart.kt @@ -35,8 +35,7 @@ data class Cart( other as Cart if (uid != other.uid) return false if (coffeeId != other.coffeeId) return false - if (count != other.count) return false - return true + return count == other.count } override fun hashCode(): Int { diff --git a/app/src/main/java/com/zyzf/coffeepreorder/database/model/Coffee.kt b/app/src/main/java/com/zyzf/coffeepreorder/database/model/Coffee.kt index 5dcac82..2cd4142 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/database/model/Coffee.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/database/model/Coffee.kt @@ -41,8 +41,7 @@ data class Coffee( if (uid != other.uid) return false if (name != other.name) return false if (cost != other.cost) return false - if (ingredients != other.ingredients) return false - return true + return ingredients == other.ingredients } override fun hashCode(): Int { diff --git a/app/src/main/java/com/zyzf/coffeepreorder/database/model/User.kt b/app/src/main/java/com/zyzf/coffeepreorder/database/model/User.kt index 21dea05..c044e5f 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/database/model/User.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/database/model/User.kt @@ -51,8 +51,7 @@ data class User( if (fio != other.fio) return false if (phone != other.phone) return false if (password != other.password) return false - if (role != other.role) return false - return true + return role == other.role } override fun hashCode(): Int { diff --git a/app/src/main/java/com/zyzf/coffeepreorder/database/repository/OfflineUserRepository.kt b/app/src/main/java/com/zyzf/coffeepreorder/database/repository/OfflineUserRepository.kt index 40df1f5..d84de96 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/database/repository/OfflineUserRepository.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/database/repository/OfflineUserRepository.kt @@ -6,7 +6,6 @@ import androidx.paging.PagingData import androidx.paging.PagingSource import com.zyzf.coffeepreorder.database.AppContainer import com.zyzf.coffeepreorder.database.dao.UserDao -import com.zyzf.coffeepreorder.database.model.Coffee import com.zyzf.coffeepreorder.database.model.User import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/zyzf/coffeepreorder/ui/cart/Cart.kt b/app/src/main/java/com/zyzf/coffeepreorder/ui/cart/Cart.kt index aadc424..ef411c0 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/ui/cart/Cart.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/ui/cart/Cart.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding @@ -96,7 +95,7 @@ fun Cart( } ) { innerPadding -> Box (modifier = Modifier - .padding(0.dp) + .padding(innerPadding) .pullRefresh(state)) { PullRefreshIndicator(refreshing = refreshing, state = state, modifier = Modifier @@ -104,34 +103,27 @@ fun Cart( .align(Alignment.TopCenter) ) CartList( - modifier = Modifier - .padding(innerPadding) - .pullRefresh(state) - .fillMaxSize(), coffeeList = coffeeListUiState, onDeleteFromCartClick = {currentCoffee: Coffee -> coffee.value = currentCoffee openDialog.value = true - }, - getCoffeeCount = {coffeeId: Int -> - viewModel.getCountForCoffee(coffeeId) } - ) + ) { coffeeId: Int -> + viewModel.getCountForCoffee(coffeeId) + } } } DeleteFromCartAlertDialog( - openDialog = openDialog, - onConfirmClick = { - coroutineScope.launch { - viewModel.deleteCoffeeFromCart(coffee.value) - } + openDialog = openDialog + ) { + coroutineScope.launch { + viewModel.deleteCoffeeFromCart(coffee.value) } - ) + } } @Composable private fun CartList( - modifier: Modifier = Modifier, coffeeList: LazyPagingItems, onDeleteFromCartClick: (coffee: Coffee) -> Unit, getCoffeeCount: (coffeeId: Int) -> Double @@ -158,7 +150,6 @@ private fun CartList( @Composable private fun CartListItem ( coffee: Coffee, - modifier: Modifier = Modifier, onDeleteFromCartClick: (coffee: Coffee) -> Unit, getCoffeeCount: (coffeeId: Int) -> Double ) { @@ -219,7 +210,6 @@ private fun CartListItem ( @Composable private fun DeleteFromCartAlertDialog( - modifier: Modifier = Modifier, openDialog: MutableState, onConfirmClick: () -> Unit ) { diff --git a/app/src/main/java/com/zyzf/coffeepreorder/ui/coffee/CoffeeList.kt b/app/src/main/java/com/zyzf/coffeepreorder/ui/coffee/CoffeeList.kt index b37fe59..016ca10 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/ui/coffee/CoffeeList.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/ui/coffee/CoffeeList.kt @@ -15,7 +15,6 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding @@ -131,27 +130,23 @@ fun CoffeeList( } } ) { innerPadding -> - Box (modifier = Modifier.padding(0.dp).pullRefresh(state)) { + Box (modifier = Modifier.padding(innerPadding).pullRefresh(state)) { PullRefreshIndicator(refreshing = refreshing, state = state, modifier = Modifier.zIndex(100f).align(Alignment.TopCenter) ) CoffeeList( - modifier = Modifier - .padding(innerPadding) - .fillMaxSize(), coffeeList = coffeeListUiState, onAddToCartClick = { coffeeUid: Int -> coroutineScope.launch { viewModel.addCoffeeToCart(coffeeUid = coffeeUid) } - }, - onEditClick = { currentCoffee: Coffee -> - coroutineScope.launch { - coffee.value = currentCoffee - openDialog.value = true - } } - ) + ) { currentCoffee: Coffee -> + coroutineScope.launch { + coffee.value = currentCoffee + openDialog.value = true + } + } } } AddEditModalBottomSheet( @@ -290,7 +285,6 @@ private fun AddEditModalBottomSheet( @Composable private fun CoffeeList( - modifier: Modifier = Modifier, coffeeList: LazyPagingItems, onAddToCartClick: (coffeeUid: Int) -> Unit, onEditClick: (coffee: Coffee) -> Unit @@ -304,7 +298,11 @@ private fun CoffeeList( ) {index -> val coffee = coffeeList[index] coffee?.let { - CoffeeListItem(coffee = coffee, onAddToCartClick = onAddToCartClick, onEditClick = onEditClick) + CoffeeListItem( + coffee = coffee, + onAddToCartClick = onAddToCartClick, + onEditClick = onEditClick + ) } } } @@ -313,7 +311,6 @@ private fun CoffeeList( @Composable private fun CoffeeListItem( coffee: Coffee, - modifier: Modifier = Modifier, onAddToCartClick: (coffeeUid: Int) -> Unit, onEditClick: (coffee: Coffee) -> Unit ) { @@ -395,9 +392,8 @@ fun CoffeeListPreview() { coffeeList = MutableStateFlow( PagingData.from((1..20).map { i -> Coffee.getCoffee(i) }) ).collectAsLazyPagingItems(), - onAddToCartClick = {}, - onEditClick = {} - ) + onAddToCartClick = {} + ) {} } } } @@ -415,9 +411,8 @@ fun CoffeeEmptyListPreview() { coffeeList = MutableStateFlow( PagingData.empty() ).collectAsLazyPagingItems(), - onAddToCartClick = {}, - onEditClick = {} - ) + onAddToCartClick = {} + ) {} } } } \ No newline at end of file diff --git a/app/src/main/java/com/zyzf/coffeepreorder/ui/login/Login.kt b/app/src/main/java/com/zyzf/coffeepreorder/ui/login/Login.kt index 6ad308c..c555a98 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/ui/login/Login.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/ui/login/Login.kt @@ -44,17 +44,13 @@ import com.zyzf.coffeepreorder.R import com.zyzf.coffeepreorder.database.AppDatabase import com.zyzf.coffeepreorder.database.model.User import com.zyzf.coffeepreorder.ui.AppViewModelProvider -import com.zyzf.coffeepreorder.ui.coffee.CoffeeListViewModel import com.zyzf.coffeepreorder.ui.navigation.Screen import com.zyzf.coffeepreorder.ui.theme.CoffeePreorderTheme import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -@OptIn(DelicateCoroutinesApi::class) @Composable fun Login( navController: NavController?, diff --git a/app/src/main/java/com/zyzf/coffeepreorder/ui/login/LoginViewModel.kt b/app/src/main/java/com/zyzf/coffeepreorder/ui/login/LoginViewModel.kt index 1b14407..5e2bcff 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/ui/login/LoginViewModel.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/ui/login/LoginViewModel.kt @@ -1,7 +1,6 @@ package com.zyzf.coffeepreorder.ui.login import androidx.lifecycle.ViewModel -import com.zyzf.coffeepreorder.api.user.RestUserRepository import com.zyzf.coffeepreorder.database.model.User import com.zyzf.coffeepreorder.database.repository.UserRepository diff --git a/app/src/main/java/com/zyzf/coffeepreorder/ui/profile/Profile.kt b/app/src/main/java/com/zyzf/coffeepreorder/ui/profile/Profile.kt index 97a82fe..6e03c48 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/ui/profile/Profile.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/ui/profile/Profile.kt @@ -195,7 +195,8 @@ fun Profile(navController: NavController?) { onClick = { GlobalScope.launch (Dispatchers.Main) { if (userOldPsswd.value == user.password && userNewPsswd.value == userNewPsswdConf.value) { - val userUid: Int? = AppDatabase.getInstance(context).userDao().update(User(user.uid!!, userLogin, userFIO, userPhone, userNewPsswd.value, user.role)) + val userUid: Int? = AppDatabase.getInstance(context).userDao().update(User( + user.uid, userLogin, userFIO, userPhone, userNewPsswd.value, user.role)) user = AppDatabase.getInstance(context).userDao().getByUid(userUid!!)!! CoffeeApplication.currentUser = user } diff --git a/app/src/main/java/com/zyzf/coffeepreorder/ui/register/Register.kt b/app/src/main/java/com/zyzf/coffeepreorder/ui/register/Register.kt index ce05e41..3694728 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/ui/register/Register.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/ui/register/Register.kt @@ -40,25 +40,19 @@ import coil.compose.AsyncImage import coil.request.ImageRequest import com.zyzf.coffeepreorder.CoffeeApplication import com.zyzf.coffeepreorder.R -import com.zyzf.coffeepreorder.database.AppDatabase 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.theme.CoffeePreorderTheme import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch -@OptIn(DelicateCoroutinesApi::class) @Composable fun Register( navController: NavController?, viewModel: RegisterViewModel = viewModel(factory = AppViewModelProvider.Factory) ) { - val context = LocalContext.current val coroutineScope = rememberCoroutineScope() var login: String by remember { mutableStateOf("") } var fio: String by remember { mutableStateOf("") } diff --git a/app/src/main/java/com/zyzf/coffeepreorder/ui/register/RegisterViewModel.kt b/app/src/main/java/com/zyzf/coffeepreorder/ui/register/RegisterViewModel.kt index d0dcf7b..af518f5 100644 --- a/app/src/main/java/com/zyzf/coffeepreorder/ui/register/RegisterViewModel.kt +++ b/app/src/main/java/com/zyzf/coffeepreorder/ui/register/RegisterViewModel.kt @@ -1,7 +1,6 @@ package com.zyzf.coffeepreorder.ui.register import androidx.lifecycle.ViewModel -import com.zyzf.coffeepreorder.database.AppDatabase import com.zyzf.coffeepreorder.database.model.User import com.zyzf.coffeepreorder.database.repository.UserRepository diff --git a/app/src/main/res/drawable/coffee_image.png b/app/src/main/res/drawable/coffee_image.png deleted file mode 100644 index c82e4323078e16c92a34a830e94c4a37615e90bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30570 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 z - - - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f8c6127..a6b3dae 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,10 +1,2 @@ - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c493969..6f4c641 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -8,7 +8,6 @@ Название Стоимость Ингредиенты - Изменить кофе Профиль Логин @@ -19,17 +18,4 @@ Новый пароль Подтверждение пароля - Имя - Фамилия - Группа - Телефон - e-mail - Список студентов - Профиль студента - О нас - -

Это текст о нас!

\n\n -

Здесь могла быть Ваша реклама!

\n\n -

Наш сайт ulstu.ru

-
\ No newline at end of file diff --git a/backend/build.gradle b/backend/build.gradle index f86170e..0c07ab8 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -6,7 +6,6 @@ plugins { group = 'com.kalyshev' version = '0.0.1-SNAPSHOT' -sourceCompatibility = '17' repositories { mavenCentral() @@ -28,3 +27,5 @@ dependencies { tasks.named('test') { useJUnitPlatform() } + +java.targetCompatibility = JavaVersion.VERSION_17 \ No newline at end of file diff --git a/backend/src/main/java/com/kalyshev/yan/coffee/controller/CoffeeController.java b/backend/src/main/java/com/kalyshev/yan/coffee/controller/CoffeeController.java index ee62444..2de860b 100644 --- a/backend/src/main/java/com/kalyshev/yan/coffee/controller/CoffeeController.java +++ b/backend/src/main/java/com/kalyshev/yan/coffee/controller/CoffeeController.java @@ -2,7 +2,6 @@ package com.kalyshev.yan.coffee.controller; import com.kalyshev.yan.WebConfiguration; import com.kalyshev.yan.coffee.service.CoffeeService; -import com.kalyshev.yan.user.model.User; import jakarta.validation.Valid; import org.springframework.web.bind.annotation.*; diff --git a/backend/src/main/java/com/kalyshev/yan/coffee/controller/CoffeeDto.java b/backend/src/main/java/com/kalyshev/yan/coffee/controller/CoffeeDto.java index d43b824..06a6df5 100644 --- a/backend/src/main/java/com/kalyshev/yan/coffee/controller/CoffeeDto.java +++ b/backend/src/main/java/com/kalyshev/yan/coffee/controller/CoffeeDto.java @@ -1,8 +1,6 @@ package com.kalyshev.yan.coffee.controller; import com.kalyshev.yan.coffee.model.Coffee; -import lombok.Getter; -import lombok.Setter; public class CoffeeDto { private Long id; diff --git a/backend/src/main/java/com/kalyshev/yan/coffee/model/Coffee.java b/backend/src/main/java/com/kalyshev/yan/coffee/model/Coffee.java index be7b99e..83bedc7 100644 --- a/backend/src/main/java/com/kalyshev/yan/coffee/model/Coffee.java +++ b/backend/src/main/java/com/kalyshev/yan/coffee/model/Coffee.java @@ -4,8 +4,6 @@ import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; import java.util.Objects; diff --git a/backend/src/main/java/com/kalyshev/yan/coffee/service/CoffeeService.java b/backend/src/main/java/com/kalyshev/yan/coffee/service/CoffeeService.java index 4b82906..66077ae 100644 --- a/backend/src/main/java/com/kalyshev/yan/coffee/service/CoffeeService.java +++ b/backend/src/main/java/com/kalyshev/yan/coffee/service/CoffeeService.java @@ -3,7 +3,6 @@ package com.kalyshev.yan.coffee.service; import com.kalyshev.yan.coffee.controller.CoffeeDto; import com.kalyshev.yan.coffee.model.Coffee; import com.kalyshev.yan.coffee.repository.CoffeeRepository; -import com.kalyshev.yan.user.model.User; import com.kalyshev.yan.user.repository.UserNotFoundException; import com.kalyshev.yan.util.validation.ValidatorUtil; import org.springframework.data.domain.Page; diff --git a/backend/src/main/java/com/kalyshev/yan/user/controller/UserDto.java b/backend/src/main/java/com/kalyshev/yan/user/controller/UserDto.java index 5bf7833..08233f8 100644 --- a/backend/src/main/java/com/kalyshev/yan/user/controller/UserDto.java +++ b/backend/src/main/java/com/kalyshev/yan/user/controller/UserDto.java @@ -1,8 +1,6 @@ package com.kalyshev.yan.user.controller; import com.kalyshev.yan.user.model.User; -import lombok.Getter; -import lombok.Setter; public class UserDto { private Long id; diff --git a/backend/src/main/java/com/kalyshev/yan/user/model/User.java b/backend/src/main/java/com/kalyshev/yan/user/model/User.java index 068177b..f6dc7b3 100644 --- a/backend/src/main/java/com/kalyshev/yan/user/model/User.java +++ b/backend/src/main/java/com/kalyshev/yan/user/model/User.java @@ -4,8 +4,6 @@ import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; -import lombok.Getter; -import lombok.Setter; import java.util.Objects; diff --git a/backend/src/main/java/com/kalyshev/yan/user/service/UserService.java b/backend/src/main/java/com/kalyshev/yan/user/service/UserService.java index c25a613..077676f 100644 --- a/backend/src/main/java/com/kalyshev/yan/user/service/UserService.java +++ b/backend/src/main/java/com/kalyshev/yan/user/service/UserService.java @@ -53,8 +53,7 @@ public class UserService { } @Transactional(readOnly = true) public Optional tryLogin(String login, String password) { - final Optional user = userRepository.tryLogin(login, password); - return user; + return userRepository.tryLogin(login, password); } @Transactional(readOnly = true) public List findAllUsers(int pageNo, int pageSize, String sortBy, String sortDir) { @@ -69,11 +68,9 @@ public class UserService { // get content for page object List listOfUsers = users.getContent(); - List content = listOfUsers.stream() + return listOfUsers.stream() .map(UserDto::new) .toList(); - - return content; } @Transactional public User updateUser(Long id, String login, String fio, String phone, String password, String role) { diff --git a/backend/src/test/java/com/kalyshev/yan/JpaCabinetTests.java b/backend/src/test/java/com/kalyshev/yan/JpaCabinetTests.java deleted file mode 100644 index b889fdc..0000000 --- a/backend/src/test/java/com/kalyshev/yan/JpaCabinetTests.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.kalyshev.yan; - -import com.kalyshev.yan.cabinet.model.Cabinet; -import com.kalyshev.yan.cabinet.repository.CabinetNotFoundException; -import com.kalyshev.yan.cabinet.service.CabinetService; -import com.kalyshev.yan.computer.service.ComputerService; -import com.kalyshev.yan.monitor.service.MonitorService; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; - -@SpringBootTest -public class JpaCabinetTests { - private static final Logger log = LoggerFactory.getLogger(JpaCabinetTests.class); - @Autowired - private ComputerService computerService; - @Autowired - private MonitorService monitorService; - @Autowired - private CabinetService cabinetService; - - @Test - void testCabinetCreate() { - cabinetService.deleteAllCabinets(); - final Cabinet cabinet = cabinetService.addCabinet("18"); - log.info(cabinet.toString()); - Assertions.assertNotNull(cabinet.getId()); - } - @Test - void testCabinetRead() { - cabinetService.deleteAllCabinets(); - final Cabinet cabinet = cabinetService.addCabinet("18"); - log.info(cabinet.toString()); - final Cabinet findCabinet = cabinetService.findCabinet(cabinet.getId()); - log.info(findCabinet.toString()); - Assertions.assertEquals(cabinet, findCabinet); - } - @Test - void testCabinetReadNotFound() { - cabinetService.deleteAllCabinets(); - Assertions.assertThrows(CabinetNotFoundException.class, () -> cabinetService.findCabinet(-1L)); - } - @Test - void testCabinetReadAll() { - cabinetService.deleteAllCabinets(); - cabinetService.addCabinet("18"); - cabinetService.addCabinet("19"); - final List cabinets = cabinetService.findAllCabinets(); - log.info(cabinets.toString()); - Assertions.assertEquals(cabinets.size(), 2); - } - @Test - void testComputerReadAllEmpty() { - cabinetService.deleteAllCabinets(); - final List cabinets = cabinetService.findAllCabinets(); - log.info(cabinets.toString()); - Assertions.assertEquals(cabinets.size(), 0); - } -} diff --git a/backend/src/test/java/com/kalyshev/yan/JpaComputerCabinetTests.java b/backend/src/test/java/com/kalyshev/yan/JpaComputerCabinetTests.java deleted file mode 100644 index 8c05d06..0000000 --- a/backend/src/test/java/com/kalyshev/yan/JpaComputerCabinetTests.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.kalyshev.yan; - -import com.kalyshev.yan.cabinet.model.Cabinet; -import com.kalyshev.yan.cabinet.service.CabinetService; -import com.kalyshev.yan.computer.model.Computer; -import com.kalyshev.yan.computer.service.ComputerService; -import com.kalyshev.yan.monitor.model.Monitor; -import com.kalyshev.yan.monitor.service.MonitorService; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -public class JpaComputerCabinetTests { - private static final Logger log = LoggerFactory.getLogger(JpaCabinetTests.class); - @Autowired - private ComputerService computerService; - @Autowired - private MonitorService monitorService; - @Autowired - private CabinetService cabinetService; - - @Test - void testCabinetAddOneToMany() { - cabinetService.deleteAllCabinets(); - computerService.deleteAllComputers(); - computerService.deleteAllMonitorsWithRelations(); - final Cabinet cabinet = cabinetService.addCabinet("18"); - final Monitor monitor = monitorService.addMonitor("Asus"); - final Computer computer = computerService.addComputer("PC", "78457h", monitor.getId()); - cabinet.addComputer(computer); - log.info(cabinet.toString()); - log.info(computer.toString()); - Assertions.assertEquals(cabinet.getComputers().get(0).getSerialNum(), computer.getSerialNum()); - } - - @Test - void testCabinetDeleteOneToMany() { - cabinetService.deleteAllCabinets(); - computerService.deleteAllComputers(); - computerService.deleteAllMonitorsWithRelations(); - final Cabinet cabinet = cabinetService.addCabinet("18"); - final Monitor monitor = monitorService.addMonitor("Asus"); - final Computer computer = computerService.addComputer("PC", "78457h", monitor.getId()); - cabinet.addComputer(computer); - log.info(cabinet.toString()); - log.info(computer.toString()); - Assertions.assertEquals(cabinet.getComputers().get(0).getSerialNum(), computer.getSerialNum()); - cabinet.removeComputer(computer); - Assertions.assertEquals(cabinet.getComputers().size(), 0); - } - - @Test - void testComputerAddManyToMany() { - cabinetService.deleteAllCabinets(); - computerService.deleteAllComputers(); - computerService.deleteAllMonitorsWithRelations(); - final Cabinet cabinet = cabinetService.addCabinet("18"); - final Monitor monitor = monitorService.addMonitor("Asus"); - final Computer computer = computerService.addComputer("PC", "78457h", monitor.getId()); - computer.setCabinet(cabinet); - log.info(cabinet.toString()); - log.info(computer.toString()); - Assertions.assertEquals(computer.getCabinet().getNumber(), cabinet.getNumber()); - } - - @Test - void testComputerDeleteManyToMany() { - cabinetService.deleteAllCabinets(); - computerService.deleteAllComputers(); - computerService.deleteAllMonitorsWithRelations(); - final Cabinet cabinet = cabinetService.addCabinet("18"); - final Monitor monitor = monitorService.addMonitor("Asus"); - final Computer computer = computerService.addComputer("PC", "78457h", monitor.getId()); - computer.setCabinet(cabinet); - log.info(cabinet.toString()); - log.info(computer.toString()); - Assertions.assertEquals(computer.getCabinet().getNumber(), cabinet.getNumber()); - computer.setCabinet(null); - Assertions.assertNull(computer.getCabinet()); - } -} diff --git a/backend/src/test/java/com/kalyshev/yan/JpaComputerTests.java b/backend/src/test/java/com/kalyshev/yan/JpaComputerTests.java deleted file mode 100644 index 007d090..0000000 --- a/backend/src/test/java/com/kalyshev/yan/JpaComputerTests.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.kalyshev.yan; - -import com.kalyshev.yan.cabinet.model.Cabinet; -import com.kalyshev.yan.cabinet.service.CabinetService; -import com.kalyshev.yan.computer.model.Computer; -import com.kalyshev.yan.computer.repository.ComputerNotFoundException; -import com.kalyshev.yan.computer.service.ComputerService; -import com.kalyshev.yan.monitor.model.Monitor; -import com.kalyshev.yan.monitor.service.MonitorService; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; - -@SpringBootTest -public class JpaComputerTests { - private static final Logger log = LoggerFactory.getLogger(JpaComputerTests.class); - @Autowired - private ComputerService computerService; - @Autowired - private MonitorService monitorService; - @Autowired - private CabinetService cabinetService; - - @Test - void testComputerPartialCreate() { - computerService.deleteAllComputers(); - final Monitor monitor = monitorService.addMonitor("Asus"); - final Computer computer = computerService.addComputer("Computer", "w7894572", monitor.getId()); - log.info(computer.toString()); - Assertions.assertNotNull(computer.getId()); - Assertions.assertNull(computer.getCabinet()); - } - @Test - void testComputerFullCreate() { - computerService.deleteAllComputers(); - final Monitor monitor = monitorService.addMonitor("Asus"); - final Cabinet cabinet = cabinetService.addCabinet("18a"); - final Computer computer = computerService.addComputer("Computer", "w7894572", monitor.getId()); - computer.setCabinet(cabinet); - log.info(computer.toString()); - Assertions.assertNotNull(computer.getId()); - Assertions.assertEquals(cabinet, computer.getCabinet()); - } - @Test - void testComputerDelete() { - computerService.deleteAllComputers(); - final Monitor monitor = monitorService.addMonitor("Asus"); - final Computer computer = computerService.addComputer("Computer", "w7894572", null); - log.info(computer.toString()); - computerService.deleteComputer(computer.getId()); - Assertions.assertThrows(ComputerNotFoundException.class, () -> computerService.findComputer(computer.getId())); - } - @Test - void testComputerRead() { - computerService.deleteAllComputers(); - final Computer computer = computerService.addComputer("Computer", "w7894572", null); - log.info(computer.toString()); - final Computer findComputer = computerService.findComputer(computer.getId()); - log.info(findComputer.toString()); - Assertions.assertEquals(computer, findComputer); - } - @Test - void testComputerReadNotFound() { - computerService.deleteAllComputers(); - Assertions.assertThrows(ComputerNotFoundException.class, () -> computerService.findComputer(-1L)); - } - @Test - void testComputerReadAll() { - computerService.deleteAllComputers(); - final Monitor monitor = monitorService.addMonitor("Asus"); - computerService.addComputer("Computer", "w7894572", null); - computerService.addComputer("Another comp", "3453s", null); - final List computers = computerService.findAllComputers(); - log.info(computers.toString()); - Assertions.assertEquals(computers.size(), 2); - } - @Test - void testComputerReadAllEmpty() { - computerService.deleteAllComputers(); - final List computers = computerService.findAllComputers(); - log.info(computers.toString()); - Assertions.assertEquals(computers.size(), 0); - } -} diff --git a/backend/src/test/java/com/kalyshev/yan/JpaMonitorTests.java b/backend/src/test/java/com/kalyshev/yan/JpaMonitorTests.java deleted file mode 100644 index 03dc8a5..0000000 --- a/backend/src/test/java/com/kalyshev/yan/JpaMonitorTests.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.kalyshev.yan; - -import com.kalyshev.yan.computer.model.Computer; -import com.kalyshev.yan.computer.service.ComputerService; -import com.kalyshev.yan.monitor.model.Monitor; -import com.kalyshev.yan.monitor.repository.MonitorNotFoundException; -import com.kalyshev.yan.monitor.service.MonitorService; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; -@SpringBootTest -public class JpaMonitorTests { - private static final Logger log = LoggerFactory.getLogger(JpaMonitorTests.class); - @Autowired - private MonitorService monitorService; - @Autowired - private ComputerService computerService; - @Test - void testMonitorCreate() { - computerService.deleteAllMonitorsWithRelations(); - final Monitor monitor = monitorService.addMonitor("Asus"); - log.info(monitor.toString()); - Assertions.assertNotNull(monitor.getId()); - } - @Test - void testMonitorRead() { - computerService.deleteAllMonitorsWithRelations(); - final Monitor monitor = monitorService.addMonitor("Asus"); - log.info(monitor.toString()); - final Monitor findMonitor = monitorService.findMonitor(monitor.getId()); - log.info(findMonitor.toString()); - Assertions.assertEquals(monitor, findMonitor); - } - @Test - void testMonitorDelete() { - computerService.deleteAllMonitorsWithRelations(); - final Monitor monitor = monitorService.addMonitor("Asus"); - log.info(monitor.toString()); - computerService.deleteMonitorWithRelation(monitor.getId()); - Assertions.assertThrows(MonitorNotFoundException.class, () -> monitorService.findMonitor(monitor.getId())); - } - @Test - void testMonitorReadNotFound() { - computerService.deleteAllMonitorsWithRelations(); - Assertions.assertThrows(MonitorNotFoundException.class, () -> monitorService.findMonitor(-1L)); - } - @Test - void testMonitorReadAll() { - computerService.deleteAllMonitorsWithRelations(); - monitorService.addMonitor("Asus"); - monitorService.addMonitor("HP"); - final List monitors = monitorService.findAllMonitors(); - log.info(monitors.toString()); - Assertions.assertEquals(monitors.size(), 2); - } - @Test - void testMonitorReadAllEmpty() { - computerService.deleteAllMonitorsWithRelations(); - final List monitors = monitorService.findAllMonitors(); - log.info(monitors.toString()); - Assertions.assertEquals(monitors.size(), 0); - } - @Test - void testMonitorGetComputer() { - computerService.deleteAllMonitorsWithRelations(); - computerService.deleteAllComputers(); - Monitor monitor = monitorService.addMonitor("Asus"); - Computer computer = computerService.addComputer("Model", "6sfv4", monitor.getId()); - log.info(computer.toString()); - Computer fetchedComputer = computerService.findComputerByMonitor(monitor); - Assertions.assertEquals(computer, fetchedComputer); - } -}