/
ilgizok
/
MyLibService
Обзор
Документация
Войти
/
ilgizok
/
MyLibService
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Test
src/main/java/com/example/mylib/service/UserService.java
224 строки
10 KB
ilgiz
add
20 апр 2025, 01:03
20 апр 2025, 01:03
981190d
Код
Авторство
О чём код?
package com.example.mylib.service; import com.example.mylib.entity.*; import com.example.mylib.exeption.ResourceAlreadyExistsException; import com.example.mylib.exeption.ResourceNotFoundException; import com.example.mylib.repository.*; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; private final BookRepository bookRepository; private final RatingRepository ratingRepository; private final ReviewRepository reviewRepository; private final UserLibraryRepository userLibraryRepository; private static final Logger log = LoggerFactory.getLogger(UserService.class); // Регистрация пользователя @Transactional public User registerUser(String username, String email, String passwordHash) { if (userRepository.existsByEmail(email)) { throw new ResourceAlreadyExistsException("Пользователь с email " + email + " уже существует"); } if (userRepository.existsByUsername(username)) { throw new ResourceAlreadyExistsException("Пользователь с именем " + username + " уже существует"); } User user = User.builder() .username(username) .email(email) .passwordHash(passwordHash) .createdAt(LocalDateTime.now()) .updatedAt(LocalDateTime.now()) .build(); return userRepository.save(user); } // Аутентификация пользователя public User login(String email, String passwordHash) { return userRepository.findByEmail(email) .filter(user -> user.getPasswordHash().equals(passwordHash)) .orElseThrow(() -> new ResourceNotFoundException("Неверный email или пароль")); } // Получение текущего пользователя public User getCurrentUser(Long userId) { return userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException("Пользователь не найден")); } // Получение другого пользователя public User getUserProfile(Long userId) { return userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException("Пользователь не найден")); } // Добавление книги в библиотеку пользователя @Transactional public UserLibrary addBookToLibrary(Long userId, Integer bookId, String status) { User user = userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException("Пользователь не найден")); Book book = bookRepository.findById(bookId) .orElseThrow(() -> new ResourceNotFoundException("Книга не найдена")); if (userLibraryRepository.findByBookAndUser(book, user).isPresent()) { throw new ResourceAlreadyExistsException("Книга уже добавлена в библиотеку"); } UserLibrary userLibrary = UserLibrary.builder() .user(user) .book(book) .readingStatus(status) .addedAt(LocalDateTime.now()) .build(); return userLibraryRepository.save(userLibrary); } // Изменение статуса книги в библиотеке @Transactional public UserLibrary updateBookStatus(Long userId, Integer bookId, String newStatus) { User user = userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException("Пользователь не найден")); Book book = bookRepository.findById(bookId) .orElseThrow(() -> new ResourceNotFoundException("Книга не найдена")); UserLibrary userLibrary = userLibraryRepository.findByBookAndUser(book, user) .orElseThrow(() -> new ResourceNotFoundException("Книга не найдена в библиотеке пользователя")); userLibrary.setReadingStatus(newStatus); return userLibraryRepository.save(userLibrary); } // Удаление книги из библиотеки @Transactional public void removeBookFromLibrary(Long userId, Integer bookId) { User user = userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException("Пользователь не найден")); Book book = bookRepository.findById(bookId) .orElseThrow(() -> new ResourceNotFoundException("Книга не найдена")); UserLibrary userLibrary = userLibraryRepository.findByBookAndUser(book, user) .orElseThrow(() -> new ResourceNotFoundException("Книга не найдена в библиотеке пользователя")); userLibraryRepository.delete(userLibrary); } // Добавление оценки книги @Transactional public Rating rateBook(Long userId, Integer bookId, Integer ratingValue) { if (ratingValue < 1 || ratingValue > 5) { throw new IllegalArgumentException("Оценка должна быть от 1 до 5"); } User user = userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException("Пользователь не найден")); Book book = bookRepository.findById(bookId) .orElseThrow(() -> new ResourceNotFoundException("Книга не найдена")); // Проверяем, есть ли уже оценка от этого пользователя Optional<Rating> existingRating = ratingRepository.findByBookAndUser(book, user); if (existingRating.isPresent()) { Rating rating = existingRating.get(); rating.setRating(ratingValue); rating.setUpdatedAt(LocalDateTime.now()); return ratingRepository.save(rating); } Rating rating = Rating.builder() .user(user) .book(book) .rating(ratingValue) .createdAt(LocalDateTime.now()) .updatedAt(LocalDateTime.now()) .build(); return ratingRepository.save(rating); } // Добавление рецензии @Transactional public Review addReview(Long userId, Integer bookId, String content) { User user = userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException("Пользователь не найден")); Book book = bookRepository.findById(bookId) .orElseThrow(() -> new ResourceNotFoundException("Книга не найдена")); // Проверяем, есть ли уже рецензия от этого пользователя Optional<Review> existingReview = reviewRepository.findByBookAndUser(book, user); if (existingReview.isPresent()) { Review review = existingReview.get(); review.setContent(content); review.setUpdatedAt(LocalDateTime.now()); return reviewRepository.save(review); } Review review = Review.builder() .user(user) .book(book) .content(content) .createdAt(LocalDateTime.now()) .updatedAt(LocalDateTime.now()) .build(); return reviewRepository.save(review); } // Получение библиотеки пользователя public List<UserLibrary> getUserLibrary(Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException("Пользователь не найден")); return userLibraryRepository.findByUser(user); } // Получение рецензий пользователя public List<Review> getUserReviews(Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException("Пользователь не найден")); return reviewRepository.findByUser(user); } // Обновление профиля пользователя @Transactional public User updateProfile(Long userId, String username, String email, String bio, String profileImageUrl) { User user = userRepository.findById(userId) .orElseThrow(() -> new ResourceNotFoundException("Пользователь не найден")); if (username != null && !username.equals(user.getUsername())) { if (userRepository.existsByUsername(username)) { throw new ResourceAlreadyExistsException("Имя пользователя уже занято"); } user.setUsername(username); } if (email != null && !email.equals(user.getEmail())) { if (userRepository.existsByEmail(email)) { throw new ResourceAlreadyExistsException("Email уже используется"); } user.setEmail(email); } if (bio != null) { user.setBio(bio); } if (profileImageUrl != null) { user.setProfileImageUrl(profileImageUrl); } user.setUpdatedAt(LocalDateTime.now()); return userRepository.save(user); } }