Files
no-copy/src/main/java/ru/soune/nocopy/service/user/UserService.java
T

141 lines
5.3 KiB
Java
Raw Normal View History

2026-01-20 03:47:51 +07:00
package ru.soune.nocopy.service.user;
import lombok.AllArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
2026-01-20 03:47:51 +07:00
import ru.soune.nocopy.dto.register.ChangePasswordRequest;
2026-05-12 14:22:56 +07:00
import ru.soune.nocopy.dto.tarriff.TariffInfoDTO;
2026-01-20 03:47:51 +07:00
import ru.soune.nocopy.dto.user.UserDTO;
import ru.soune.nocopy.dto.user.UserRequest;
2026-05-12 14:22:56 +07:00
import ru.soune.nocopy.entity.tarif.Tariff;
import ru.soune.nocopy.entity.tarif.TariffInfo;
import ru.soune.nocopy.entity.user.User;
2025-12-10 19:12:54 +07:00
import ru.soune.nocopy.exception.InvalidUserEmail;
import ru.soune.nocopy.exception.NotValidationPasswordException;
import ru.soune.nocopy.exception.UserNotFoundException;
import ru.soune.nocopy.repository.UserRepository;
2026-05-12 14:22:56 +07:00
import ru.soune.nocopy.service.file.FileStatsService;
2026-04-17 22:00:33 +07:00
import java.util.List;
2026-01-20 03:47:51 +07:00
import java.util.Optional;
@Service
@AllArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
2026-05-12 14:22:56 +07:00
private final FileStatsService fileStatsService;
@Transactional
public User changePassword(User user, ChangePasswordRequest request) {
if (!passwordEncoder.matches(request.getCurrentPassword(), user.getPassword())) {
throw new NotValidationPasswordException("Current password is incorrect");
}
user.setPassword(passwordEncoder.encode(request.getNewPassword()));
return userRepository.save(user);
}
@Transactional
public UserDTO updateUser(UserRequest userRequest, User currentUser) {
User user = userRepository.findById(currentUser.getId())
.orElseThrow(() -> new UserNotFoundException("User not found with id: " + currentUser.getId()));
updateUserFromRequest(user, userRequest);
User updatedUser = userRepository.save(user);
return mapToDTO(updatedUser);
}
2026-05-12 14:22:56 +07:00
public UserDTO getUserInfo(Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new UserNotFoundException("User not found with id: " + userId));
return mapToDTO(user);
}
2026-04-17 22:00:33 +07:00
@Transactional
public List<String> getUsersCompanyEmails(String company) {
return userRepository.emailsByCompany(company);
}
2026-01-20 03:47:51 +07:00
@Transactional
2026-01-20 15:12:24 +07:00
public User activateAndVerifyUser(long userId) {
2026-01-20 03:47:51 +07:00
Optional<User> users = userRepository.findById(userId);
User user = users.orElseThrow(() -> new UserNotFoundException("User not found with id: " + userId));
2026-01-20 15:12:24 +07:00
user.setActive(true);
2026-01-20 03:47:51 +07:00
user.setEmailVerified(true);
2026-01-20 15:12:24 +07:00
return userRepository.save(user);
2026-01-20 03:47:51 +07:00
}
private void updateUserFromRequest(User user, UserRequest request) {
if (request.getFullName() != null) {
user.setFullName(request.getFullName());
}
if (request.getEmail() != null && !request.getEmail().equals(user.getEmail())) {
if (userRepository.existsByEmail(request.getEmail())) {
throw new InvalidUserEmail("Email already exists: " + request.getEmail());
}
user.setEmail(request.getEmail());
}
if (request.getPhone() != null) {
user.setPhone(request.getPhone());
}
if (request.getGenderType() != null) {
user.setGenderType(request.getGenderType());
}
if (request.getBirthday() != null) {
user.setBirthday(request.getBirthday());
}
}
private UserDTO mapToDTO(User user) {
2026-05-12 14:22:56 +07:00
TariffInfo personalTariffInfo = user.getPersonalTariffInfo();
Tariff tariff = personalTariffInfo.getTariff();
Long fileOnDisk = user.canManageCompanySettings() ?
fileStatsService.calculateCompanyFileSize(user.getId()):
fileStatsService.calculateUserFileSize(user.getId());
Integer filesCount = user.canManageCompanySettings() ?
fileStatsService.filesCompanyCount(user.getId()):
fileStatsService.filesUserCount(user.getId());
TariffInfoDTO infoDTO = TariffInfoDTO.builder().tokens(personalTariffInfo.getTokens())
.id(personalTariffInfo.getId())
.tariffName(tariff.getName())
.status(personalTariffInfo.getStatus().name())
.tariffId(tariff.getId())
.currentFileCounts(filesCount)
.maxFileCounts(tariff.getMaxFilesCount())
.currentFileOnDisk(fileOnDisk)
.maxFileOnDisk(tariff.getDiskSize())
.startTariff(personalTariffInfo.getStartTariff())
.endTariff(personalTariffInfo.getEndTariff())
.tokens(personalTariffInfo.getTokens() + personalTariffInfo.getBoughtTokens())
.build();
return UserDTO.builder()
.fullName(user.getFullName())
2026-01-29 21:46:37 +07:00
.company(user.getCompanyName())
2026-05-12 14:22:56 +07:00
.email(user.getEmail())
.active(user.isActive())
.phone(user.getPhone())
.genderType(user.getGenderType())
.birthday(user.getBirthday())
.createdAt(user.getCreatedAt())
2026-05-12 14:22:56 +07:00
.subscriptionType(user.getSubscriptionType())
.tariffInfo(infoDTO)
.verifiedStatus(user.getVerificationStatus())
.build();
}
}