@@ -1,21 +1,31 @@
|
||||
package ru.soune.nocopy.service.user;
|
||||
|
||||
import jakarta.persistence.EntityNotFoundException;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import ru.soune.nocopy.dto.register.AccountType;
|
||||
import ru.soune.nocopy.dto.register.ChangePasswordRequest;
|
||||
import ru.soune.nocopy.dto.register.RegRequest;
|
||||
import ru.soune.nocopy.dto.tarriff.TariffInfoDTO;
|
||||
import ru.soune.nocopy.dto.user.UserDTO;
|
||||
import ru.soune.nocopy.dto.user.UserRequest;
|
||||
import ru.soune.nocopy.entity.company.Company;
|
||||
import ru.soune.nocopy.entity.tarif.Tariff;
|
||||
import ru.soune.nocopy.entity.tarif.TariffInfo;
|
||||
import ru.soune.nocopy.entity.tarif.TariffType;
|
||||
import ru.soune.nocopy.entity.user.Permission;
|
||||
import ru.soune.nocopy.entity.user.User;
|
||||
import ru.soune.nocopy.exception.CompanyAlreadyExist;
|
||||
import ru.soune.nocopy.exception.InvalidUserEmail;
|
||||
import ru.soune.nocopy.exception.NotValidationPasswordException;
|
||||
import ru.soune.nocopy.exception.UserNotFoundException;
|
||||
import ru.soune.nocopy.repository.AuthTokenRepository;
|
||||
import ru.soune.nocopy.repository.CompanyRepository;
|
||||
import ru.soune.nocopy.repository.UserRepository;
|
||||
import ru.soune.nocopy.service.file.FileStatsService;
|
||||
import ru.soune.nocopy.service.tariff.TariffInfoService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
@@ -30,6 +40,12 @@ public class UserService {
|
||||
|
||||
private final FileStatsService fileStatsService;
|
||||
|
||||
private final CompanyRepository companyRepository;
|
||||
|
||||
private final TariffInfoService tariffInfoService;
|
||||
|
||||
private final AuthTokenRepository authTokenRepository;
|
||||
|
||||
@Transactional
|
||||
public User changePassword(User user, ChangePasswordRequest request) {
|
||||
if (!passwordEncoder.matches(request.getCurrentPassword(), user.getPassword())) {
|
||||
@@ -82,6 +98,95 @@ public class UserService {
|
||||
return userRepository.save(user);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public User createUser(RegRequest registerRequest, boolean verified) {
|
||||
User user = new User();
|
||||
user.setFullName(registerRequest.getFullName());
|
||||
user.setEmail(registerRequest.getEmail());
|
||||
user.setPassword(passwordEncoder.encode(registerRequest.getPassword()));
|
||||
user.setActive(!verified);
|
||||
user.setEmailVerified(!verified);
|
||||
|
||||
AccountType accountType = AccountType.valueOf(registerRequest.getAccountType().toUpperCase());
|
||||
|
||||
if (accountType == AccountType.B2B && registerRequest.getCompanyName() != null) {
|
||||
try {
|
||||
createCompanyAccount(registerRequest, user);
|
||||
} catch (CompanyAlreadyExist exist) {
|
||||
throw new CompanyAlreadyExist("Company already exist");
|
||||
}
|
||||
} else if (accountType == AccountType.B2C && registerRequest.getCompanyName() == null) {
|
||||
createIndividualAccount(user);
|
||||
} else {
|
||||
createIndividualCompanyAccount(registerRequest, user);
|
||||
}
|
||||
|
||||
if (registerRequest.getPhone() != null) {
|
||||
user.setPhone(registerRequest.getPhone());
|
||||
}
|
||||
|
||||
return userRepository.save(user);
|
||||
}
|
||||
|
||||
public Optional<User> getUserById(Long userId) {
|
||||
return userRepository.findById(userId);
|
||||
}
|
||||
|
||||
public boolean existsByEmailOrPhone(String email, String phone){
|
||||
return userRepository.existsByEmail(email) || userRepository.existsByPhone(phone);
|
||||
}
|
||||
|
||||
private void createCompanyAccount(RegRequest request, User user) {
|
||||
Optional<Company> byInn = companyRepository.findByInn(request.getInn());
|
||||
|
||||
if (byInn.isPresent()) {
|
||||
throw new CompanyAlreadyExist("Company was already created");
|
||||
}
|
||||
|
||||
Company company = new Company();
|
||||
company.setCompanyName(request.getCompanyName());
|
||||
company.setInn(request.getInn());
|
||||
|
||||
TariffInfo companyTariff = tariffInfoService.createTariffInfo(TariffType.DEMO);
|
||||
company.setTariffInfo(companyTariff);
|
||||
|
||||
companyRepository.save(company);
|
||||
tariffInfoService.addTariffInfo(companyTariff);
|
||||
|
||||
user.setCompany(company);
|
||||
user.grantPermission(Permission.COMPANY_ADMIN_PERMISSIONS);
|
||||
}
|
||||
|
||||
private void createIndividualAccount(User user) {
|
||||
TariffInfo personalTariff = tariffInfoService.createTariffInfo(TariffType.DEMO);
|
||||
|
||||
tariffInfoService.addTariffInfo(personalTariff);
|
||||
|
||||
user.setPersonalTariffInfo(personalTariff);
|
||||
user.grantPermission(Permission.DEFAULT_USER_PERMISSIONS);
|
||||
}
|
||||
|
||||
|
||||
private void createIndividualCompanyAccount(RegRequest request, User user) {
|
||||
String authToken = request.getAuthToken();
|
||||
Long userIdByToken = authTokenRepository.findUserIdByToken(authToken);
|
||||
User companyUser = userRepository.findById(userIdByToken)
|
||||
.orElseThrow(() -> new EntityNotFoundException("Not found token: " + authToken));
|
||||
|
||||
Company company = companyUser.getCompany();
|
||||
if (company == null) {
|
||||
throw new IllegalStateException("Not have company");
|
||||
}
|
||||
|
||||
TariffInfo tariffInfo = company.getTariffInfo();
|
||||
if (tariffInfo == null) {
|
||||
throw new IllegalStateException("Company not have tariff");
|
||||
}
|
||||
|
||||
user.setCompany(company);
|
||||
user.grantPermission(Permission.DEFAULT_USER_PERMISSIONS);
|
||||
}
|
||||
|
||||
private void updateUserFromRequest(User user, UserRequest request) {
|
||||
if (request.getFullName() != null) {
|
||||
user.setFullName(request.getFullName());
|
||||
|
||||
Reference in New Issue
Block a user