@@ -17,12 +17,10 @@ import ru.soune.nocopy.entity.tarif.TariffType;
|
||||
import ru.soune.nocopy.entity.user.AuthToken;
|
||||
import ru.soune.nocopy.entity.user.Permission;
|
||||
import ru.soune.nocopy.entity.user.User;
|
||||
import ru.soune.nocopy.entity.user.UserNotActive;
|
||||
import ru.soune.nocopy.exception.NotFoundAuthToken;
|
||||
import ru.soune.nocopy.exception.NotValidFieldException;
|
||||
import ru.soune.nocopy.repository.AuthTokenRepository;
|
||||
import ru.soune.nocopy.repository.CompanyRepository;
|
||||
import ru.soune.nocopy.repository.TariffInfoRepository;
|
||||
import ru.soune.nocopy.repository.UserRepository;
|
||||
import ru.soune.nocopy.repository.*;
|
||||
import ru.soune.nocopy.service.file.CheckCounterService;
|
||||
import ru.soune.nocopy.service.tariff.TariffInfoService;
|
||||
|
||||
@@ -48,6 +46,8 @@ public class AuthService {
|
||||
|
||||
private final TariffInfoService tariffInfoService;
|
||||
|
||||
private final UserNotActiveRepository userNotActiveRepository;
|
||||
|
||||
private final SecureRandom secureRandom = new SecureRandom();
|
||||
|
||||
@Transactional
|
||||
@@ -102,14 +102,30 @@ public class AuthService {
|
||||
return authToken.getUser().getId();
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
public AuthToken login(LoginRequest request) {
|
||||
User user = userRepository.findByEmail(request.getEmail());
|
||||
|
||||
if (!user.isActive()) {
|
||||
throw new NotValidFieldException("User not active", new BaseResponse(20003,
|
||||
MessageCode.USER_NOT_ACTIVE.getCode(),
|
||||
MessageCode.USER_NOT_ACTIVE.getDescription(), Map.of("userId", user.getId())));
|
||||
}
|
||||
|
||||
if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
|
||||
LoginAnswer loginAnswer = new LoginAnswer();
|
||||
loginAnswer.setFieldErrors(Arrays.asList(Map.of("password", request.getPassword())));
|
||||
loginAnswer.setVerified(user.isEmailVerified());
|
||||
loginAnswer.setActive(user.isActive());
|
||||
|
||||
int attempts = user.getFailedLoginAttempts() + 1;
|
||||
user.setFailedLoginAttempts(attempts);
|
||||
|
||||
if (attempts >= 5) {
|
||||
user.setActive(false);
|
||||
blockUser(user);
|
||||
}
|
||||
|
||||
userRepository.save(user);
|
||||
|
||||
throw new NotValidFieldException("Invalid password", new BaseResponse(20003,
|
||||
MessageCode.AUTH_PASSWORD_NOT_MATCHES.getCode(),
|
||||
@@ -117,6 +133,9 @@ public class AuthService {
|
||||
}
|
||||
|
||||
user.setLastLoginAt(LocalDateTime.now());
|
||||
user.setFailedLoginAttempts(0);
|
||||
user.setActive(true);
|
||||
|
||||
User savedUser = userRepository.save(user);
|
||||
|
||||
AuthToken authToken = new AuthToken();
|
||||
@@ -132,6 +151,7 @@ public class AuthService {
|
||||
.ifPresent(authTokenRepository::delete);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public AuthToken generateAuthToken(User user) {
|
||||
return authTokenRepository.save(genereateAuthToken(user));
|
||||
}
|
||||
@@ -211,4 +231,19 @@ public class AuthService {
|
||||
user.setCompany(company);
|
||||
user.grantPermission(Permission.DEFAULT_USER_PERMISSIONS);
|
||||
}
|
||||
|
||||
public void blockUser(User user) {
|
||||
Optional<UserNotActive> existing = userNotActiveRepository.findByUserId(user.getId());
|
||||
if (existing.isEmpty()) {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
||||
UserNotActive notActive = UserNotActive.builder()
|
||||
.user(user)
|
||||
.createdAt(now)
|
||||
.blockedUntil(now.plusMinutes(15))
|
||||
.build();
|
||||
|
||||
userNotActiveRepository.save(notActive);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user