Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.epam.izh.rd.online.exception;

public class NotAccessException extends Exception {
public NotAccessException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.epam.izh.rd.online.exception;

public class NotCorrectPasswordException extends Exception {
public NotCorrectPasswordException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.epam.izh.rd.online.exception;

public class SimplePasswordException extends Exception {
public SimplePasswordException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.epam.izh.rd.online.exception;

public class UserAlreadyRegisteredException extends Exception{
public UserAlreadyRegisteredException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.epam.izh.rd.online.exception;

public class UserNotFoundException extends Exception {
public UserNotFoundException(String message) {
super(message);
}
}
109 changes: 56 additions & 53 deletions src/main/java/com/epam/izh/rd/online/repository/UserRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,71 +8,74 @@
import java.util.Objects;

/**
* Готовый класс репозитория.
* Можно добавлять свои методы, принеобходимости, но нельзя исправлять текущие.
* <p>
* Позволяет сохранять\обновлять пользователей.
* Позволяет находить пользователя по логину.
* Готовый класс репозитория. Можно добавлять свои методы, при необходимости, но нельзя исправлять
* текущие.
*
* <p>Позволяет сохранять\обновлять пользователей. Позволяет находить пользователя по логину.
* Позволяет удалять пользователей по логину (есть ограничения).
*/
public class UserRepository implements IUserRepository {

/**
* Поскольку мы еще не прошли тему по работе с базами данных, сохранять пользователей будем в списке
*/
private List<User> userDatabase = new ArrayList<>();
/**
* Поскольку мы еще не прошли тему по работе с базами данных, сохранять пользователей будем в
* списке
*/
private List<User> 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());
}

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

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

/**
* Метод удаления пользователя с определенным логином.
* <p>
* Если вызов метода удаления происходит под пользователем не админом (считаем, что админ имеет логин 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!!!");
}
/**
* Метод удаления пользователя с определенным логином.
*
* <p>Если вызов метода удаления происходит под пользователем не админом (считаем, что админ имеет
* логин 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));
}
}
Original file line number Diff line number Diff line change
@@ -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;
}

/**
* Необходимо доработать данный метод следующим функционлом:
* <p>
* 1) Необходимо проверять наличие авторизующегося пользователя в списке зарегистрированных пользователей.
* Если пользователь не найден, необходимо выбрасывать проверяемое исключение с названием UserNotFoundException
* и текстом ошибки "Пользователь с таким логином не найден".
* <p>
* 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;
}

/**
* Необходимо доработать данный метод следующим функционалом:
*
* <p>1) Необходимо проверять наличие авторизующегося пользователя в списке зарегистрированных
* пользователей. Если пользователь не найден, необходимо выбрасывать проверяемое исключение с
* названием UserNotFoundException и текстом ошибки "Пользователь с таким логином не найден".
*
* <p>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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,32 @@
import com.epam.izh.rd.online.entity.User;

/**
* Данный класс хранит информацию о текущем авторизованном пользователе (пользователе который вошел в систему).
* Считаем, что в систему может войти только один пользователь.
* <p>
* Псле вызова метода {@link AuthenticationService#login(User)}, если все проверки прошли успешно,
* пользователь устанавливается в данное поле.
* <p>
* Поскольку методы статические и поле статическое, его можно доставать в других классх, если понадобится проверить,
* какое пользователь сейчас находится в системе.
* <p>
* Это необходимо например при выполнении метода {@link com.epam.izh.rd.online.repository.UserRepository#deleteByLogin(String)}
* <p>
* Если установить значение поля currentUser обратно в null, будем считать, что пользователь вышел из системы.
* Данный класс хранит информацию о текущем авторизованном пользователе (пользователе который вошел
* в систему). Считаем, что в систему может войти только один пользователь.
*
* <p>После вызова метода {@link AuthenticationService#login(User)}, если все проверки прошли
* успешно, пользователь устанавливается в данное поле.
*
* <p>Поскольку методы статические и поле статическое, его можно доставать в других классах, если
* понадобится проверить, какое пользователь сейчас находится в системе.
*
* <p>Это необходимо например при выполнении метода {@link
* com.epam.izh.rd.online.repository.UserRepository#deleteByLogin(String)}
*
* <p>Если установить значение поля 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;
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
@@ -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;
}
Loading