Пользователь - oyboy/Jora GitHub Wiki

Модель UserAvatar

Описание

Модель UserAvatar представляет собой аватар пользователя. Она содержит информацию о двоичных данных изображения и идентификаторе пользователя, которому принадлежит аватар.

Поля

  • id: Long - Уникальный идентификатор аватара (генерируется автоматически).
  • bytes: byte[] - Двоичные данные аватара пользователя.
  • userId: Long - Идентификатор пользователя, которому принадлежит аватар.

Модель User

Описание

Модель User представляет собой пользователя системы. Она отвечает за хранение информации о пользователе, такой как имя, пароль, электронная почта и статус активности.

Поля

  • id: Long - Уникальный идентификатор пользователя (генерируется автоматически).
  • username: String - Имя пользователя (обязательное поле, максимум 50 символов).
  • password: String - Пароль пользователя (обязательное поле, минимум 4 символа, не отображается в строковом представлении).
  • confirmPassword: String - Подтверждение пароля (временное поле).
  • email: String - Электронная почта пользователя (обязательное поле, максимум 50 символов).
  • active: boolean - Статус активности пользователя (активен/неактивен).
  • userProjectRoles: Set<UserProjectRole> - Связь с ролями пользователей в проектах.
  • userTasks: Set<UserTask> - Связь с задачами, назначенными пользователю.
  • tags: List<Tag> - Список тегов, связанных с пользователем.

Методы

  • getAuthorities(): Collection<? extends GrantedAuthority> - Возвращает коллекцию ролей, назначенных пользователю.
  • isAccountNonExpired(): Проверяет, не истек ли срок действия учетной записи.
  • isAccountNonLocked(): Проверяет, не заблокирована ли учетная запись.
  • isCredentialsNonExpired(): Проверяет, не истек ли срок действия учетных данных.
  • isEnabled(): Проверяет, активна ли учетная запись.

Контроллер UserController

Описание

Контроллер UserController предоставляет функциональность для отображения страницы редактирования пользователя, обновления данных профиля и управления аватаром.

Методы

  • currentUser: Заполняет текущего пользователя, основанного на аутентификации.
  • editUserPage: Отображает страницу редактирования пользователя.
  • editUser: Обрабатывает запросы на редактирование профиля пользователя с проверкой ошибок и обновлением данных.
  • uploadAvatar: Обрабатывает загрузку аватара пользователя с проверкой формата файла и ошибок сохранения.
  • deleteAvatar: Удаляет аватар пользователя по его идентификатору.

Контроллер UserRestController

Описание

REST-контроллер UserRestController предоставляет API для получения аватара пользователя по идентификатору пользователя.

Методы

  • getAvatar: Получает аватар пользователя по его идентификатору. Если аватар найден, возвращает его в формате JPEG, иначе возвращает статус 404 (не найден).

Сервис UserService

Описание

Сервис UserService управляет логикой обработки данных пользователей. Он взаимодействует с репозиториями для выполнения операций создания, редактирования и удаления пользователей и их аватаров.

Методы

  • createUser(User user): Создает нового пользователя и сохраняет его в базе данных.
  • editUser(Long user_id, User form): Обновляет данные пользователя, проверяя на наличие ошибок и существование других пользователей с той же электронной почтой.
  • getUserById(Long user_id): Получает пользователя по его идентификатору.
  • setAvatar(MultipartFile file, Long user_id): Сохраняет аватар пользователя с возможностью сжатия изображения.
  • deleteAvatarForUser(Long user_id): Удаляет аватар пользователя по его идентификатору.
  • findAvatarByUserId(Long user_id): Получает аватар пользователя или устанавливает аватар по умолчанию, если аватар не найден.

Регистрация и авторизация

Для данных целей используется один контроллер (RegisterController) в связке с сервисом (UserService). В post-методе реализована множественная проверка входных данных:

//Совпадение паролей
/*Здесь вызывается метод rejectValue для объекта errors. Этот метод принимает три аргумента: "confirmPassword" указывает на имя поля, к которому относится ошибка. Это используется для связывания ошибки с конкретным полем формы. "error.user" — это код ошибки, который можно использовать для интернационализации или регистрации конкретного типа ошибки.*/
        if (!user.getPassword().equals(user.getConfirmPassword())) {
            errors.rejectValue("confirmPassword", "error.user", "Пароли не совпадают");
            model.addAttribute("errors", errors);
            return "registration";
        }

        boolean created = userService.createUser(user);
        if (!created) {
            model.addAttribute("errorMessage",
                    "Пользователь уже существует");
            return "registration";
        }

Поиск по email

Ключевым полем, отличающее одну сущность от другой, является email. По этой причине необходимо было написать отдельный ModelAttribute, вместо того, чтобы вызывать обычный principal.getName(), который возвращает не то, что нужно.

@ModelAttribute(name = "user")
    public User getUser(){
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && authentication.getPrincipal() instanceof User) {
            return (User) authentication.getPrincipal();
        }
        return new User();
    }

Этот метод добавлен в ProjectController, т.к. используется в связанных с ним шаблонах! Также в репозиторий был добавлен метод поиска сущности в бд по email: User findByEmail(String email);.

Кастомный сервис

UserDetailsService тоже нужно было переопределить, чтобы правильно отрабатывала авторизация

@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {
    private final UserRepository userRepository;
    @Override
    public UserDetails loadUserByUsername(String email)
            throws UsernameNotFoundException {
        User user = userRepository.findByEmail(email);
        if (user != null) {
            return user;
        }
        System.out.println("Oh net usera");
        throw new UsernameNotFoundException(
                "User '" + email + "' not found");
    }
}
⚠️ **GitHub.com Fallback** ⚠️