From e387f252734ea35aaf107d393b9004a5d5878c00 Mon Sep 17 00:00:00 2001 From: KP9lKk Date: Thu, 30 Jan 2025 10:48:04 +0300 Subject: [PATCH] add shoes --- .idea/misc.xml | 2 +- src/main/kotlin/Main.kt | 18 +++-- src/main/kotlin/data/FavouriteRepository.kt | 10 +++ src/main/kotlin/data/ShoesRepository.kt | 10 +++ src/main/kotlin/data/ShoesRepositoryImpl.kt | 24 +++++++ src/main/kotlin/data/localDataSource.kt | 23 ++++++ src/main/kotlin/data/model/BucketDTO.kt | 5 ++ src/main/kotlin/data/model/FavouriteDTO.kt | 6 ++ .../data/model/FavouriteRepositoryImpl.kt | 27 +++++++ src/main/kotlin/data/model/ShoesDTO.kt | 9 +++ src/main/kotlin/domain/UserUseCaseImpl.kt | 14 +++- src/main/kotlin/domain/mapper.kt | 17 ++++- .../domain/request/AddFavouriteRequest.kt | 3 + .../kotlin/domain/response/ShoesResponse.kt | 16 +++++ .../kotlin/domain/response/UserResponse.kt | 3 + src/main/kotlin/ui/MainMenuUI.kt | 72 +++++++++++++++++++ src/main/kotlin/ui/UserUI.kt | 15 ++++ 17 files changed, 263 insertions(+), 11 deletions(-) create mode 100644 src/main/kotlin/data/FavouriteRepository.kt create mode 100644 src/main/kotlin/data/ShoesRepository.kt create mode 100644 src/main/kotlin/data/ShoesRepositoryImpl.kt create mode 100644 src/main/kotlin/data/model/BucketDTO.kt create mode 100644 src/main/kotlin/data/model/FavouriteDTO.kt create mode 100644 src/main/kotlin/data/model/FavouriteRepositoryImpl.kt create mode 100644 src/main/kotlin/data/model/ShoesDTO.kt create mode 100644 src/main/kotlin/domain/request/AddFavouriteRequest.kt create mode 100644 src/main/kotlin/domain/response/ShoesResponse.kt create mode 100644 src/main/kotlin/ui/MainMenuUI.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index 5cd9a10..c6674f3 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index 944ca99..54f3436 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -1,15 +1,23 @@ package org.example -import org.example.data.UserRepository +import org.example.data.ShoesRepository +import org.example.data.ShoesRepositoryImpl import org.example.data.UserRepositoryImpl +import org.example.data.model.FavouriteRepositoryImpl import org.example.domain.UserUseCaseImpl +import org.example.ui.MainMenuUI import org.example.ui.UserUI + +//class_student +//localuser - где нет rtk +//844SystemUser fun main() { val userRepository = UserRepositoryImpl() - val userUseCase = UserUseCaseImpl(userRepository) + val favouriteRepository = FavouriteRepositoryImpl() + val shoesRepository = ShoesRepositoryImpl() + val userUseCase = UserUseCaseImpl(userRepository, favouriteRepository, shoesRepository) val userUI = UserUI(userUseCase) - userUI.authorize() - userUI.changePassword() - userUI.authorize() + val mainMenuUI = MainMenuUI(userUI) + mainMenuUI.displayStartMenu() } \ No newline at end of file diff --git a/src/main/kotlin/data/FavouriteRepository.kt b/src/main/kotlin/data/FavouriteRepository.kt new file mode 100644 index 0000000..3eee61c --- /dev/null +++ b/src/main/kotlin/data/FavouriteRepository.kt @@ -0,0 +1,10 @@ +package org.example.data + +import org.example.domain.request.AddFavouriteRequest + +interface FavouriteRepository{ + fun getAllFavourites() + fun addFavourites(vararg addFavouriteRequest: AddFavouriteRequest) + fun removeFavourites() + fun getFavouritesByUserId(userID: Int): IntArray +} diff --git a/src/main/kotlin/data/ShoesRepository.kt b/src/main/kotlin/data/ShoesRepository.kt new file mode 100644 index 0000000..72966b8 --- /dev/null +++ b/src/main/kotlin/data/ShoesRepository.kt @@ -0,0 +1,10 @@ +package org.example.data + +import org.example.data.model.ShoesDTO + +interface ShoesRepository { + fun addShoes() + fun getAllShoes(): List + fun removeShoes() + fun getShoesById() +} \ No newline at end of file diff --git a/src/main/kotlin/data/ShoesRepositoryImpl.kt b/src/main/kotlin/data/ShoesRepositoryImpl.kt new file mode 100644 index 0000000..39c3159 --- /dev/null +++ b/src/main/kotlin/data/ShoesRepositoryImpl.kt @@ -0,0 +1,24 @@ +package org.example.data + +import org.example.data.model.ShoesDTO + +class ShoesRepositoryImpl: ShoesRepository { + private val shoesSource = shoesList.toMutableList() + + override fun addShoes() { + TODO("Not yet implemented") + } + + override fun getAllShoes(): List { + return shoesSource + } + + + override fun removeShoes() { + TODO("Not yet implemented") + } + + override fun getShoesById() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/src/main/kotlin/data/localDataSource.kt b/src/main/kotlin/data/localDataSource.kt index d2f8a7b..fcf9562 100644 --- a/src/main/kotlin/data/localDataSource.kt +++ b/src/main/kotlin/data/localDataSource.kt @@ -1,7 +1,30 @@ package org.example.data +import org.example.data.model.FavouriteDTO +import org.example.data.model.ShoesDTO import org.example.data.model.UserDTO +val shoesList = listOf( + ShoesDTO( + shoesId = 1, + shoesName = "1", + shoesDescription = "123", + shoesUrl = "3", + category = "123" + ) +) + +val favouriteListSource = listOf( + FavouriteDTO( + 1, + 1 + ), + FavouriteDTO( + 2, + 1 + ) +) + val userList = listOf( UserDTO( userId = 1, diff --git a/src/main/kotlin/data/model/BucketDTO.kt b/src/main/kotlin/data/model/BucketDTO.kt new file mode 100644 index 0000000..64864e7 --- /dev/null +++ b/src/main/kotlin/data/model/BucketDTO.kt @@ -0,0 +1,5 @@ +package org.example.data.model + +//data class BucketDTO( +// +//) \ No newline at end of file diff --git a/src/main/kotlin/data/model/FavouriteDTO.kt b/src/main/kotlin/data/model/FavouriteDTO.kt new file mode 100644 index 0000000..ea9e3f4 --- /dev/null +++ b/src/main/kotlin/data/model/FavouriteDTO.kt @@ -0,0 +1,6 @@ +package org.example.data.model + +data class FavouriteDTO( + val userId: Int, + val shoesID: Int +) \ No newline at end of file diff --git a/src/main/kotlin/data/model/FavouriteRepositoryImpl.kt b/src/main/kotlin/data/model/FavouriteRepositoryImpl.kt new file mode 100644 index 0000000..1fe7cf5 --- /dev/null +++ b/src/main/kotlin/data/model/FavouriteRepositoryImpl.kt @@ -0,0 +1,27 @@ +package org.example.data.model + +import org.example.data.FavouriteRepository +import org.example.data.favouriteListSource +import org.example.domain.request.AddFavouriteRequest + +class FavouriteRepositoryImpl: FavouriteRepository { + val favouriteList = favouriteListSource.toMutableList() + override fun getAllFavourites() { + TODO("Not yet implemented") + } + + override fun addFavourites(vararg addFavouriteRequest: AddFavouriteRequest) { + TODO("Not yet implemented") + } + + override fun removeFavourites() { + TODO("Not yet implemented") + } + + override fun getFavouritesByUserId(userID: Int): IntArray { + return favouriteList + .filter { it.userId == userID } + .map { it.shoesID } + .toIntArray() + } +} \ No newline at end of file diff --git a/src/main/kotlin/data/model/ShoesDTO.kt b/src/main/kotlin/data/model/ShoesDTO.kt new file mode 100644 index 0000000..bd5adf6 --- /dev/null +++ b/src/main/kotlin/data/model/ShoesDTO.kt @@ -0,0 +1,9 @@ +package org.example.data.model + +data class ShoesDTO ( + val shoesId: Int, + val shoesName: String, + val shoesDescription: String, + val shoesUrl: String, + val category: String, +) \ No newline at end of file diff --git a/src/main/kotlin/domain/UserUseCaseImpl.kt b/src/main/kotlin/domain/UserUseCaseImpl.kt index e649f0e..ecfe7a6 100644 --- a/src/main/kotlin/domain/UserUseCaseImpl.kt +++ b/src/main/kotlin/domain/UserUseCaseImpl.kt @@ -1,12 +1,18 @@ package org.example.domain +import org.example.data.FavouriteRepository +import org.example.data.ShoesRepository import org.example.data.UserRepository import org.example.domain.request.AuthorizeRequest import org.example.domain.request.ChangePasswordRequest import org.example.domain.request.RegistrationRequest import org.example.domain.response.UserResponse -class UserUseCaseImpl(private val userRepository: UserRepository): UserUseCase { +class UserUseCaseImpl( + private val userRepository: UserRepository, + private val favouriteRepository: FavouriteRepository, + private val shoesRepository: ShoesRepository + ): UserUseCase { override fun authorize(authorizeRequest: AuthorizeRequest): UserResponse { val findUser = userRepository.getAllUsers() .firstOrNull { @@ -18,7 +24,9 @@ class UserUseCaseImpl(private val userRepository: UserRepository): UserUseCase { require(findUser.password == authorizeRequest.password){ "Пароли не совпадают" } - return UserDtoToUserResponse(findUser) + val favourite = favouriteRepository.getFavouritesByUserId(userID = findUser.userId) + val shoesFavourite = shoesRepository.getAllShoes().filter { it.shoesId in favourite} + return userDtoToUserResponse(findUser, shoesFavourite) } override fun registration(registrationRequest: RegistrationRequest): UserResponse { @@ -30,7 +38,7 @@ class UserUseCaseImpl(private val userRepository: UserRepository): UserUseCase { "Такая почта уже существует" } val newUser = userRepository.addUser(registrationRequest) - return UserDtoToUserResponse(newUser) + return userDtoToUserResponse(newUser) } override fun changePassword(changePasswordRequest: ChangePasswordRequest) { diff --git a/src/main/kotlin/domain/mapper.kt b/src/main/kotlin/domain/mapper.kt index 6885c6e..60a48fd 100644 --- a/src/main/kotlin/domain/mapper.kt +++ b/src/main/kotlin/domain/mapper.kt @@ -1,13 +1,26 @@ package org.example.domain +import org.example.data.model.ShoesDTO import org.example.data.model.UserDTO +import org.example.domain.response.ShoesResponse import org.example.domain.response.UserResponse -fun UserDtoToUserResponse(userDTO: UserDTO) = UserResponse( +fun userDtoToUserResponse(userDTO: UserDTO, shoesList: List = emptyList()) = UserResponse( lastName = userDTO.lastName, firstName = userDTO.firstName, email = userDTO.email, phone = userDTO.phone, userId = userDTO.userId, address = userDTO.address, -) \ No newline at end of file + favouriteList = shoesList.map(::shoesDtoToUserResponse) +) + +fun shoesDtoToUserResponse(shoesDTO: ShoesDTO): ShoesResponse{ + return ShoesResponse( + shoesId = shoesDTO.shoesId, + shoesName = shoesDTO.shoesName, + shoesUrl = shoesDTO.shoesUrl, + shoesDescription = shoesDTO.shoesDescription, + category = shoesDTO.category + ) +} \ No newline at end of file diff --git a/src/main/kotlin/domain/request/AddFavouriteRequest.kt b/src/main/kotlin/domain/request/AddFavouriteRequest.kt new file mode 100644 index 0000000..c9684a8 --- /dev/null +++ b/src/main/kotlin/domain/request/AddFavouriteRequest.kt @@ -0,0 +1,3 @@ +package org.example.domain.request + +data class AddFavouriteRequest(val userID:Int, val shoesID: Int) diff --git a/src/main/kotlin/domain/response/ShoesResponse.kt b/src/main/kotlin/domain/response/ShoesResponse.kt new file mode 100644 index 0000000..3dc8f4a --- /dev/null +++ b/src/main/kotlin/domain/response/ShoesResponse.kt @@ -0,0 +1,16 @@ +package org.example.domain.response + +data class ShoesResponse( + val shoesId: Int, + val shoesName: String, + val shoesDescription: String, + val shoesUrl: String, + val category: String, +) +{ + override fun toString(): String { + return "name: $shoesName\nshoes: $shoesDescription" + } +} + + diff --git a/src/main/kotlin/domain/response/UserResponse.kt b/src/main/kotlin/domain/response/UserResponse.kt index 1fdd8f2..63c35e0 100644 --- a/src/main/kotlin/domain/response/UserResponse.kt +++ b/src/main/kotlin/domain/response/UserResponse.kt @@ -1,5 +1,7 @@ package org.example.domain.response +import org.example.data.model.ShoesDTO + data class UserResponse( val userId: Int, var firstName: String, @@ -7,4 +9,5 @@ data class UserResponse( var email: String, var phone: String? = null, var address: String? = null, + var favouriteList: List = emptyList() ) diff --git a/src/main/kotlin/ui/MainMenuUI.kt b/src/main/kotlin/ui/MainMenuUI.kt new file mode 100644 index 0000000..3f927ce --- /dev/null +++ b/src/main/kotlin/ui/MainMenuUI.kt @@ -0,0 +1,72 @@ +package org.example.ui + +class MainMenuUI( + private val userUI: UserUI +){ + val menuItems = listOf( + "1. Авторизоваться", + "2. Зарегестрироваться", + "3. Exit" + + ) + val menuAuthorizedItems = listOf( + "1. Change password", + "2. Edit profile", + "3. Exit" + + ) + private fun displayMenuItem(menuItem: () -> Unit){ + try { + menuItem() + } + catch (e: Exception){ + println(e.message) + userUI.userAuthorized?.let { + displayMenuForAuthorizeUser() + } + } + } + + fun displayStartMenu(){ + print(menuItems.joinToString("\n")) + val menuPosition = readlnOrNull()?.toIntOrNull() + if(menuPosition == null) displayStartMenu() + when(menuPosition){ + 1 -> { + displayMenuItem { + userUI.authorize() + displayMenuForAuthorizeUser() + } + } + 2 -> { + userUI.registration() + } + 3 ->{ + return + } + else -> { + displayStartMenu() + } + } + } + + private fun displayMenuForAuthorizeUser(){ + print(menuAuthorizedItems.joinToString("\n")) + val menuPosition = readlnOrNull()?.toIntOrNull() + if(menuPosition == null) displayMenuForAuthorizeUser() + when(menuPosition){ + 1 -> { + displayMenuItem { + userUI.changePassword() + } + } + 2 -> { + userUI.edit() + } + 3 -> { + return + } + else -> displayMenuForAuthorizeUser() + } + } +} diff --git a/src/main/kotlin/ui/UserUI.kt b/src/main/kotlin/ui/UserUI.kt index c3c5ce1..ddca11d 100644 --- a/src/main/kotlin/ui/UserUI.kt +++ b/src/main/kotlin/ui/UserUI.kt @@ -26,6 +26,11 @@ class UserUI(private val userUseCase: UserUseCase) { userAuthorized = user println(userResponseToString(user)) } + + fun edit(){ + + } + fun changePassword(){ checkNotNull(userAuthorized){ "Вы не авторизованы" @@ -84,6 +89,16 @@ class UserUI(private val userUseCase: UserUseCase) { printOutput.appendLine() printOutput.append("Ваш адрес ${userResponse.phone}") } + if(!userResponse.favouriteList.isEmpty()){ + printOutput.appendLine() + printOutput.append( + userResponse.favouriteList + .map { it.toString() } + .joinToString("\n") + + ) + + } return printOutput.toString() } } \ No newline at end of file