From 3626a51b57c5af60a270c1a07de53d4074979ca7 Mon Sep 17 00:00:00 2001 From: vladp Date: Mon, 24 Nov 2025 23:36:26 +0700 Subject: [PATCH] INC-1 add start logic for login --- .../no_copy/controller/AuthController.java | 12 ++++++ .../ru/soune/no_copy/dto/LoginRequest.java | 12 ++++++ .../ru/soune/no_copy/dto/LoginResponse.java | 13 +++++++ .../ru/soune/no_copy/service/AuthService.java | 37 +++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 src/main/java/ru/soune/no_copy/dto/LoginRequest.java create mode 100644 src/main/java/ru/soune/no_copy/dto/LoginResponse.java diff --git a/src/main/java/ru/soune/no_copy/controller/AuthController.java b/src/main/java/ru/soune/no_copy/controller/AuthController.java index c88cfb6..b2bce62 100644 --- a/src/main/java/ru/soune/no_copy/controller/AuthController.java +++ b/src/main/java/ru/soune/no_copy/controller/AuthController.java @@ -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 login(@RequestBody LoginRequest request) { + //TODO add try-catch and response code +// try { + return ResponseEntity.ok(authService.login(request)); +// } catch (RuntimeException e) { +// return ResponseEntity.badRequest(); +// } + } } diff --git a/src/main/java/ru/soune/no_copy/dto/LoginRequest.java b/src/main/java/ru/soune/no_copy/dto/LoginRequest.java new file mode 100644 index 0000000..852702c --- /dev/null +++ b/src/main/java/ru/soune/no_copy/dto/LoginRequest.java @@ -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; +} diff --git a/src/main/java/ru/soune/no_copy/dto/LoginResponse.java b/src/main/java/ru/soune/no_copy/dto/LoginResponse.java new file mode 100644 index 0000000..3333272 --- /dev/null +++ b/src/main/java/ru/soune/no_copy/dto/LoginResponse.java @@ -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; +} diff --git a/src/main/java/ru/soune/no_copy/service/AuthService.java b/src/main/java/ru/soune/no_copy/service/AuthService.java index 431be40..a2aa84c 100644 --- a/src/main/java/ru/soune/no_copy/service/AuthService.java +++ b/src/main/java/ru/soune/no_copy/service/AuthService.java @@ -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 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);