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
- * Важно - если пользователь не найден - возвращается 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)),
+ "Пароль введен неверно!");
+ }
}