diff --git a/src/main/java/com/epam/izh/rd/online/exception/NotAccessException.java b/src/main/java/com/epam/izh/rd/online/exception/NotAccessException.java new file mode 100644 index 0000000..72fd3a5 --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/exception/NotAccessException.java @@ -0,0 +1,7 @@ +package com.epam.izh.rd.online.exception; + +public class NotAccessException extends Exception { + public NotAccessException(String message) { + super(message); + } +} diff --git a/src/main/java/com/epam/izh/rd/online/exception/NotCorrectPasswordException.java b/src/main/java/com/epam/izh/rd/online/exception/NotCorrectPasswordException.java new file mode 100644 index 0000000..3a13f6e --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/exception/NotCorrectPasswordException.java @@ -0,0 +1,7 @@ +package com.epam.izh.rd.online.exception; + +public class NotCorrectPasswordException extends Exception { + public NotCorrectPasswordException(String message) { + super(message); + } +} diff --git a/src/main/java/com/epam/izh/rd/online/exception/SimplePasswordException.java b/src/main/java/com/epam/izh/rd/online/exception/SimplePasswordException.java new file mode 100644 index 0000000..58a3cc6 --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/exception/SimplePasswordException.java @@ -0,0 +1,7 @@ +package com.epam.izh.rd.online.exception; + +public class SimplePasswordException extends Exception { + public SimplePasswordException(String message) { + super(message); + } +} diff --git a/src/main/java/com/epam/izh/rd/online/exception/UserAlreadyRegisteredException.java b/src/main/java/com/epam/izh/rd/online/exception/UserAlreadyRegisteredException.java new file mode 100644 index 0000000..1173d57 --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/exception/UserAlreadyRegisteredException.java @@ -0,0 +1,7 @@ +package com.epam.izh.rd.online.exception; + +public class UserAlreadyRegisteredException extends Exception{ + public UserAlreadyRegisteredException(String message) { + super(message); + } +} diff --git a/src/main/java/com/epam/izh/rd/online/exception/UserNotFoundException.java b/src/main/java/com/epam/izh/rd/online/exception/UserNotFoundException.java new file mode 100644 index 0000000..2d289b3 --- /dev/null +++ b/src/main/java/com/epam/izh/rd/online/exception/UserNotFoundException.java @@ -0,0 +1,7 @@ +package com.epam.izh.rd.online.exception; + +public class UserNotFoundException extends Exception { + public UserNotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/com/epam/izh/rd/online/repository/UserRepository.java b/src/main/java/com/epam/izh/rd/online/repository/UserRepository.java index e81491d..7f7a887 100644 --- a/src/main/java/com/epam/izh/rd/online/repository/UserRepository.java +++ b/src/main/java/com/epam/izh/rd/online/repository/UserRepository.java @@ -8,71 +8,74 @@ import java.util.Objects; /** - * Готовый класс репозитория. - * Можно добавлять свои методы, принеобходимости, но нельзя исправлять текущие. - *

- * Позволяет сохранять\обновлять пользователей. - * Позволяет находить пользователя по логину. + * Готовый класс репозитория. Можно добавлять свои методы, при необходимости, но нельзя исправлять + * текущие. + * + *

Позволяет сохранять\обновлять пользователей. Позволяет находить пользователя по логину. * Позволяет удалять пользователей по логину (есть ограничения). */ public class UserRepository implements IUserRepository { - /** - * Поскольку мы еще не прошли тему по работе с базами данных, сохранять пользователей будем в списке - */ - private List userDatabase = new ArrayList<>(); + /** + * Поскольку мы еще не прошли тему по работе с базами данных, сохранять пользователей будем в + * списке + */ + private List userDatabase = new ArrayList<>(); - /** - * Позволяет сохранить пользователя, либо обновить пароль текущего, если пользователь с таким логином уже - * есть в нашей базе данных. - */ - @Override - public User save(User user) { - Objects.requireNonNull(user, "Отсутствуют данные для сохранения или обновления пользователя"); - Objects.requireNonNull(user.getLogin(), "Отсутствует логин сохраняемого пользователя"); - Objects.requireNonNull(user.getPassword(), "Отсутствует пароль сохраняемого пользователя"); + /** + * Позволяет сохранить пользователя, либо обновить пароль текущего, если пользователь с таким + * логином уже есть в нашей базе данных. + */ + @Override + public User save(User user) { + Objects.requireNonNull(user, "Отсутствуют данные для сохранения или обновления пользователя"); + Objects.requireNonNull(user.getLogin(), "Отсутствует логин сохраняемого пользователя"); + Objects.requireNonNull(user.getPassword(), "Отсутствует пароль сохраняемого пользователя"); - User userWithSameLogin = findByLogin(user.getLogin()); + User userWithSameLogin = findByLogin(user.getLogin()); - if (userWithSameLogin == null) { - userDatabase.add(user); - } else { - userWithSameLogin.setPassword(user.getPassword()); - } - - return user; + if (userWithSameLogin == null) { + userDatabase.add(user); + } else { + userWithSameLogin.setPassword(user.getPassword()); } - /** - * Находит пользователя в базе данных по логину. - *

- * Важно - если пользователь не найден - возвращается null. - */ - @Override - public User findByLogin(String login) { - Objects.requireNonNull(login, "Отсутствует логин для поиска пользователя"); + return user; + } - return userDatabase.stream() - .filter(user -> user.getLogin().equalsIgnoreCase(login)) - .findFirst().orElse(null); - } + /** + * Находит пользователя в базе данных по логину. + * + *

Важно - если пользователь не найден - возвращается null. + */ + @Override + public User findByLogin(String login) { + Objects.requireNonNull(login, "Отсутствует логин для поиска пользователя"); - /** - * Метод удаления пользователя с определенным логином. - *

- * Если вызов метода удаления происходит под пользователем не админом (считаем, что админ имеет логин Admin) - * или неавторизованным пользователем (если не был вызван метод - * {@link com.epam.izh.rd.online.service.AuthenticationService#login(User)}), то будет выброшено исключение. - */ - @Override - public void deleteByLogin(String login) { - Objects.requireNonNull(login, "Отсутствует логин для удаления пользователя"); + return userDatabase.stream() + .filter(user -> user.getLogin().equalsIgnoreCase(login)) + .findFirst() + .orElse(null); + } - if (CurrentUserManager.getCurrentLoggedInUser() == null || !CurrentUserManager.getCurrentLoggedInUser() - .getLogin().equalsIgnoreCase("admin")) { - throw new UnsupportedOperationException("You have no access to call this method!!! Noooooo!!!"); - } + /** + * Метод удаления пользователя с определенным логином. + * + *

Если вызов метода удаления происходит под пользователем не админом (считаем, что админ имеет + * логин Admin) или неавторизованным пользователем (если не был вызван метод {@link + * com.epam.izh.rd.online.service.AuthenticationService#login(User)}), то будет выброшено + * исключение. + */ + @Override + public void deleteByLogin(String login) { + Objects.requireNonNull(login, "Отсутствует логин для удаления пользователя"); - userDatabase.removeIf(user -> user.getLogin().equalsIgnoreCase(login)); + if (CurrentUserManager.getCurrentLoggedInUser() == null + || !CurrentUserManager.getCurrentLoggedInUser().getLogin().equalsIgnoreCase("admin")) { + throw new UnsupportedOperationException( + "You have no access to call this method!!! Noooooo!!!"); } + + userDatabase.removeIf(user -> user.getLogin().equalsIgnoreCase(login)); + } } diff --git a/src/main/java/com/epam/izh/rd/online/service/AuthenticationService.java b/src/main/java/com/epam/izh/rd/online/service/AuthenticationService.java index bcb09a7..e487b6f 100644 --- a/src/main/java/com/epam/izh/rd/online/service/AuthenticationService.java +++ b/src/main/java/com/epam/izh/rd/online/service/AuthenticationService.java @@ -1,49 +1,59 @@ package com.epam.izh.rd.online.service; +import com.epam.izh.rd.online.exception.NotCorrectPasswordException; +import com.epam.izh.rd.online.exception.UserNotFoundException; import com.epam.izh.rd.online.entity.User; import com.epam.izh.rd.online.repository.IUserRepository; public class AuthenticationService implements IAuthenticationService { - private IUserRepository userRepository; - - public AuthenticationService(IUserRepository userRepository) { - this.userRepository = userRepository; - } - - /** - * Необходимо доработать данный метод следующим функционлом: - *

- * 1) Необходимо проверять наличие авторизующегося пользователя в списке зарегистрированных пользователей. - * Если пользователь не найден, необходимо выбрасывать проверяемое исключение с названием UserNotFoundException - * и текстом ошибки "Пользователь с таким логином не найден". - *

- * 2) Необходимо проверять, что пароль, который ввел пользователь совпадает с тем, что хранится в базе. - * Если пароли не совпадают, необходимо выбрасывать исключение с названием NotCorrectPasswordException и - * текстом "Пароль введен неверно!" - * - * @param user - пользователь проходящий авторизацию - */ - @Override - public User login(User user) { - // Находим пользователя в базе - User foundUser = userRepository.findByLogin(user.getLogin()); - - // - // Здесь необходимо реализовать перечисленные выше проверки - // - - // Устанавливаем найденного пользователя, который прошел все проверки, как вошедшего в систему. - CurrentUserManager.setCurrentLoggedInUser(foundUser); - - return foundUser; + private IUserRepository userRepository; + + public AuthenticationService(IUserRepository userRepository) { + this.userRepository = userRepository; + } + + /** + * Необходимо доработать данный метод следующим функционалом: + * + *

1) Необходимо проверять наличие авторизующегося пользователя в списке зарегистрированных + * пользователей. Если пользователь не найден, необходимо выбрасывать проверяемое исключение с + * названием UserNotFoundException и текстом ошибки "Пользователь с таким логином не найден". + * + *

2) Необходимо проверять, что пароль, который ввел пользователь совпадает с тем, что хранится + * в базе. Если пароли не совпадают, необходимо выбрасывать исключение с названием + * NotCorrectPasswordException и текстом "Пароль введен неверно!" + * + * @param user - пользователь проходящий авторизацию + */ + @Override + public User login(User user) throws UserNotFoundException, NotCorrectPasswordException { + // Находим пользователя в базе + User foundUser = userRepository.findByLogin(user.getLogin()); + + // + // Здесь необходимо реализовать перечисленные выше проверки + // + + if (foundUser == null) { + throw new UserNotFoundException("Пользователь с таким логином не найден"); } - - /** - * Данный метод очищает данные о текущем (активном) пользователе. - */ - @Override - public void logout() { - CurrentUserManager.setCurrentLoggedInUser(null); + if (foundUser.getPassword() == null + || foundUser + .getPassword() + .equals(userRepository.findByLogin(user.getLogin()).getPassword())) { + throw new NotCorrectPasswordException("Пароль введен неверно!"); } + // Устанавливаем найденного пользователя, который прошел все проверки, как вошедшего в + // систему. + CurrentUserManager.setCurrentLoggedInUser(foundUser); + + return foundUser; + } + + /** Данный метод очищает данные о текущем (активном) пользователе. */ + @Override + public void logout() { + CurrentUserManager.setCurrentLoggedInUser(null); + } } diff --git a/src/main/java/com/epam/izh/rd/online/service/CurrentUserManager.java b/src/main/java/com/epam/izh/rd/online/service/CurrentUserManager.java index 90d8441..2c862e7 100644 --- a/src/main/java/com/epam/izh/rd/online/service/CurrentUserManager.java +++ b/src/main/java/com/epam/izh/rd/online/service/CurrentUserManager.java @@ -3,30 +3,32 @@ import com.epam.izh.rd.online.entity.User; /** - * Данный класс хранит информацию о текущем авторизованном пользователе (пользователе который вошел в систему). - * Считаем, что в систему может войти только один пользователь. - *

- * Псле вызова метода {@link AuthenticationService#login(User)}, если все проверки прошли успешно, - * пользователь устанавливается в данное поле. - *

- * Поскольку методы статические и поле статическое, его можно доставать в других классх, если понадобится проверить, - * какое пользователь сейчас находится в системе. - *

- * Это необходимо например при выполнении метода {@link com.epam.izh.rd.online.repository.UserRepository#deleteByLogin(String)} - *

- * Если установить значение поля currentUser обратно в null, будем считать, что пользователь вышел из системы. + * Данный класс хранит информацию о текущем авторизованном пользователе (пользователе который вошел + * в систему). Считаем, что в систему может войти только один пользователь. + * + *

После вызова метода {@link AuthenticationService#login(User)}, если все проверки прошли + * успешно, пользователь устанавливается в данное поле. + * + *

Поскольку методы статические и поле статическое, его можно доставать в других классах, если + * понадобится проверить, какое пользователь сейчас находится в системе. + * + *

Это необходимо например при выполнении метода {@link + * com.epam.izh.rd.online.repository.UserRepository#deleteByLogin(String)} + * + *

Если установить значение поля currentUser обратно в null, будем считать, что пользователь + * вышел из системы. */ public class CurrentUserManager { - private static User currentUser; + private static User currentUser; - private CurrentUserManager() {} + private CurrentUserManager() {} - public static User getCurrentLoggedInUser() { - return currentUser; - } + public static User getCurrentLoggedInUser() { + return currentUser; + } - public static void setCurrentLoggedInUser(User currentUser) { - CurrentUserManager.currentUser = currentUser; - } + public static void setCurrentLoggedInUser(User currentUser) { + CurrentUserManager.currentUser = currentUser; + } } diff --git a/src/main/java/com/epam/izh/rd/online/service/IAuthenticationService.java b/src/main/java/com/epam/izh/rd/online/service/IAuthenticationService.java index 3f296c3..4ddf6b9 100644 --- a/src/main/java/com/epam/izh/rd/online/service/IAuthenticationService.java +++ b/src/main/java/com/epam/izh/rd/online/service/IAuthenticationService.java @@ -1,9 +1,11 @@ package com.epam.izh.rd.online.service; +import com.epam.izh.rd.online.exception.UserNotFoundException; import com.epam.izh.rd.online.entity.User; +import com.epam.izh.rd.online.exception.NotCorrectPasswordException; public interface IAuthenticationService { - User login(User user); + User login(User user) throws UserNotFoundException, NotCorrectPasswordException; void logout(); } diff --git a/src/main/java/com/epam/izh/rd/online/service/IUserService.java b/src/main/java/com/epam/izh/rd/online/service/IUserService.java index de62d43..5cc0fcb 100644 --- a/src/main/java/com/epam/izh/rd/online/service/IUserService.java +++ b/src/main/java/com/epam/izh/rd/online/service/IUserService.java @@ -1,10 +1,13 @@ package com.epam.izh.rd.online.service; import com.epam.izh.rd.online.entity.User; +import com.epam.izh.rd.online.exception.NotAccessException; +import com.epam.izh.rd.online.exception.SimplePasswordException; +import com.epam.izh.rd.online.exception.UserAlreadyRegisteredException; public interface IUserService { - User register(User user); + User register(User user) throws UserAlreadyRegisteredException, SimplePasswordException; - void delete(String login); + void delete(String login) throws NotAccessException; } diff --git a/src/main/java/com/epam/izh/rd/online/service/UserService.java b/src/main/java/com/epam/izh/rd/online/service/UserService.java index 78c39ed..0337785 100644 --- a/src/main/java/com/epam/izh/rd/online/service/UserService.java +++ b/src/main/java/com/epam/izh/rd/online/service/UserService.java @@ -1,71 +1,91 @@ package com.epam.izh.rd.online.service; import com.epam.izh.rd.online.entity.User; +import com.epam.izh.rd.online.exception.NotAccessException; +import com.epam.izh.rd.online.exception.SimplePasswordException; +import com.epam.izh.rd.online.exception.UserAlreadyRegisteredException; import com.epam.izh.rd.online.repository.IUserRepository; import com.epam.izh.rd.online.repository.UserRepository; -public class UserService implements IUserService { +import java.util.regex.Matcher; +import java.util.regex.Pattern; - private IUserRepository userRepository; +public class UserService implements IUserService { - public UserService(IUserRepository userRepository) { - this.userRepository = userRepository; - } + private IUserRepository userRepository; - /** - * Необходимо доработать данный метод следующим функционлом: - *

- * 1) Необходимо проверять наличие заполнения всех полей сущности User. Если же поле с логином или паролем не - * заполнено или заполнено пустой строкой. Необходимо выбрасывать существующее непроверяемое исключение - * {@link IllegalArgumentException} с текстом "Ошибка в заполнении полей". - *

- * 2) Необходимо запрещать регистрацию пользователя, если другой пользователь с подобным логином уже - * зарегистрирован. Необходимо в таком случае выбрасывать проверяемое исключение с названием UserAlreadyRegisteredException - * и текстом - "Пользователь с логином 'login' уже зарегистрирован", где login - логин пользователя. - *

- * 3) Необходимо запрещать регистрацию пользователя, если он пытается установить пароль состоящий из цифр. - * В случае, если это происходит (например пароль = "123432") необходимо выбрасывать - * исключение с названием SimplePasswordException и текстом - "Пароль не соответствует требованиям безопасности" - * - * @param user - даныне регистрирующегося пользователя - */ - @Override - public User register(User user) { + public UserService(IUserRepository userRepository) { + this.userRepository = userRepository; + } - // - // Здесь необходимо реализовать перечисленные выше проверки - // + /** + * Необходимо доработать данный метод следующим функционалом: + * + *

1) Необходимо проверять наличие заполнения всех полей сущности User. Если же поле с логином + * или паролем не заполнено или заполнено пустой строкой. Необходимо выбрасывать существующее + * непроверяемое исключение {@link IllegalArgumentException} с текстом "Ошибка в заполнении + * полей". + * + *

2) Необходимо запрещать регистрацию пользователя, если другой пользователь с подобным + * логином уже зарегистрирован. Необходимо в таком случае выбрасывать проверяемое исключение с + * названием UserAlreadyRegisteredException и текстом - "Пользователь с логином 'login' уже + * зарегистрирован", где login - логин пользователя. + * + *

3) Необходимо запрещать регистрацию пользователя, если он пытается установить пароль + * состоящий из цифр. В случае, если это происходит (например пароль = "123432") необходимо + * выбрасывать исключение с названием SimplePasswordException и текстом - "Пароль не соответствует + * требованиям безопасности" + * + * @param user - данные регистрирующегося пользователя + */ + @Override + public User register(User user) + throws IllegalArgumentException, UserAlreadyRegisteredException, SimplePasswordException { + // + // Здесь необходимо реализовать перечисленные выше проверки + // - // Если все проверки успешно пройдены, сохраняем пользователя в базу - return userRepository.save(user); + if ((user.getLogin() == null || user.getPassword() == null) + || (user.getLogin().equals("") || user.getPassword().equals(""))) { + throw new IllegalArgumentException("Ошибка в заполнении полей"); + } + if (userRepository.findByLogin(user.getLogin()) != null) { + throw new UserAlreadyRegisteredException( + "Пользователь с логином " + user.getLogin() + " уже зарегистрирован"); } - /** - * Необходимо доработать данный метод следующим функционлом: - *

- * Если мы попытаемся вызвать метод удаления {@link UserRepository#deleteByLogin(String)} - * пользователем не админом (считаем, что админ имеет логин Admin), то будет выброшено исключение - * {@link UnsupportedOperationException} из репозитория. - *

- * При этом, текст этого исключения выглядит очень непрезентабельно. - *

- * Поэтому, если мы не перехватим (через try-catch) это исключение, то оно уйдет пользователю с данным текстом. - * Нам необходимо это предотвратить, перехватив данное исключение и выбросив в ответ на него свое, - * но уже с понятным для пользователя сообщением. - *

- * Название вашего исключения должно быть следующее - NotAccessException и текст сообщения должен - * быть "Недостаточно прав для выполнения операции" - * - * @param login - */ - public void delete(String login) { - - // Здесь необходимо сделать доработку метод - - userRepository.deleteByLogin(login); - - // Здесь необходимо сделать доработку метода - + Pattern patternOnlyDigits = Pattern.compile("\\d"); + Matcher matcherOnlyDigits = patternOnlyDigits.matcher(user.getPassword()); + if (matcherOnlyDigits.find()) { + throw new SimplePasswordException("Пароль не соответствует требованиям безопасности"); } + // Если все проверки успешно пройдены, сохраняем пользователя в базу + return userRepository.save(user); + } + /** + * Необходимо доработать данный метод следующим функционалом: + * + *

Если мы попытаемся вызвать метод удаления {@link UserRepository#deleteByLogin(String)} + * пользователем не админом (считаем, что админ имеет логин Admin), то будет выброшено исключение + * {@link UnsupportedOperationException} из репозитория. + * + *

При этом, текст этого исключения выглядит очень непрезентабельно. + * + *

Поэтому, если мы не перехватим (через try-catch) это исключение, то оно уйдет пользователю с + * данным текстом. Нам необходимо это предотвратить, перехватив данное исключение и выбросив в + * ответ на него свое, но уже с понятным для пользователя сообщением. + * + *

Название вашего исключения должно быть следующее - NotAccessException и текст сообщения + * должен быть "Недостаточно прав для выполнения операции" + * + * @param login + */ + public void delete(String login) throws NotAccessException { + try { + userRepository.deleteByLogin(login); + } catch (UnsupportedOperationException ex) { + throw new NotAccessException("Недостаточно прав для выполнения операции"); + } + } } diff --git a/src/test/java/com/epam/izh/rd/online/AuthenticationServiceTest.java b/src/test/java/com/epam/izh/rd/online/AuthenticationServiceTest.java index d10fce1..11b647f 100644 --- a/src/test/java/com/epam/izh/rd/online/AuthenticationServiceTest.java +++ b/src/test/java/com/epam/izh/rd/online/AuthenticationServiceTest.java @@ -13,30 +13,34 @@ public class AuthenticationServiceTest { - private IAuthenticationService authenticationService; - private IUserRepository userRepository; - private Assert assertion = new Assert(); - - @BeforeEach - private void setup() { - userRepository = new UserRepository(); - authenticationService = new AuthenticationService(userRepository); - } - - @Test - @DisplayName("Тест метода IAuthenticationService.login(User user)") - void testRegisterCase1() { - assertion.assertThrowsWithClassName("UserNotFoundException", () -> authenticationService.login(getUser()), - "Пользователь с таким логином не найден"); - } - - @Test - @DisplayName("Тест метода IAuthenticationService.login(User user)") - void testRegisterCase2() { - User user = getUser(); - userRepository.save(user); - - assertion.assertThrowsWithClassName("NotCorrectPasswordException", () -> authenticationService.login(Providers.changePasswordToWrongValue(user)), - "Пароль введен неверно!"); - } + private IAuthenticationService authenticationService; + private IUserRepository userRepository; + private Assert assertion = new Assert(); + + @BeforeEach + private void setup() { + userRepository = new UserRepository(); + authenticationService = new AuthenticationService(userRepository); + } + + @Test + @DisplayName("Тест метода IAuthenticationService.login(User user)") + void testRegisterCase1() { + assertion.assertThrowsWithClassName( + "UserNotFoundException", + () -> authenticationService.login(getUser()), + "Пользователь с таким логином не найден"); + } + + @Test + @DisplayName("Тест метода IAuthenticationService.login(User user)") + void testRegisterCase2() { + User user = getUser(); + userRepository.save(user); + + assertion.assertThrowsWithClassName( + "NotCorrectPasswordException", + () -> authenticationService.login(Providers.changePasswordToWrongValue(user)), + "Пароль введен неверно!"); + } }