INC-1 add start logic for login

This commit is contained in:
vladp
2025-11-24 23:36:26 +07:00
parent 633644b149
commit 3626a51b57
4 changed files with 74 additions and 0 deletions
@@ -8,6 +8,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import ru.soune.no_copy.dto.AuthResponse;
import ru.soune.no_copy.dto.LoginRequest;
import ru.soune.no_copy.dto.LoginResponse;
import ru.soune.no_copy.dto.RegisterRequest;
import ru.soune.no_copy.entity.AuthToken;
import ru.soune.no_copy.service.AuthService;
@@ -26,4 +28,14 @@ public class AuthController {
return ResponseEntity.ok(new AuthResponse(true, "success.user.register", authToken.getToken(),
authToken.getExpiresAt()));
}
@PostMapping("/login")
public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest request) {
//TODO add try-catch and response code
// try {
return ResponseEntity.ok(authService.login(request));
// } catch (RuntimeException e) {
// return ResponseEntity.badRequest();
// }
}
}
@@ -0,0 +1,12 @@
package ru.soune.no_copy.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
public class LoginRequest {
private String email;
private String password;
}
@@ -0,0 +1,13 @@
package ru.soune.no_copy.dto;
import lombok.Data;
import ru.soune.no_copy.entity.User;
@Data
public class LoginResponse {
private boolean success;
private String message;
private User user;
private String token;
private String expiresAt;
}
@@ -5,6 +5,8 @@ import org.springframework.context.MessageSource;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ru.soune.no_copy.dto.LoginRequest;
import ru.soune.no_copy.dto.LoginResponse;
import ru.soune.no_copy.dto.RegisterRequest;
import ru.soune.no_copy.entity.AuthToken;
import ru.soune.no_copy.entity.User;
@@ -13,8 +15,10 @@ import ru.soune.no_copy.repository.AuthTokenRepository;
import ru.soune.no_copy.repository.UserRepository;
import java.security.SecureRandom;
import java.time.LocalDateTime;
import java.util.HexFormat;
import java.util.Locale;
import java.util.Optional;
@Service
@RequiredArgsConstructor
@@ -51,6 +55,39 @@ public class AuthService {
return authTokenRepository.save(authToken);
}
public LoginResponse login(LoginRequest request) {
Optional<User> userOpt = userRepository.findByEmail(request.getEmail());
if (userOpt.isEmpty()) {
//ADD EXCEPTION
}
User user = userOpt.get();
if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) {
//ADD EXCEPTION
}
String token = generateToken();
LocalDateTime expiresAt = LocalDateTime.now().plusDays(30);
AuthToken authToken = new AuthToken();
authToken.setToken(generateToken());
authToken.setUser(user);
authTokenRepository.save(authToken);
userRepository.save(user);
LoginResponse response = new LoginResponse();
response.setSuccess(true);
// response.setMessage(""); add message
response.setUser(user);
response.setToken(token);
response.setExpiresAt(expiresAt.toString());
return response;
}
//TODO change logic generate token
private String generateToken() {
byte[] bytes = new byte[32];
new SecureRandom().nextBytes(bytes);