From 04f4732da1eae7c2687880b10d7865f9d718b220 Mon Sep 17 00:00:00 2001 From: litoral05 Date: Wed, 3 Jun 2026 12:23:08 +0100 Subject: [PATCH] Add login endpoint --- .../backend_gateway/auth/AuthController.java | 21 ++++++++ .../backend_gateway/auth/AuthService.java | 50 +++++++++++++++++++ .../auth/InvalidCredentialsException.java | 12 +++++ .../auth/dto/LoginRequest.java | 7 +++ .../auth/dto/LoginResponse.java | 12 +++++ .../config/AuthExceptionHandler.java | 17 +++++++ 6 files changed, 119 insertions(+) create mode 100644 src/main/java/com/litoralregas/backend_gateway/auth/AuthController.java create mode 100644 src/main/java/com/litoralregas/backend_gateway/auth/AuthService.java create mode 100644 src/main/java/com/litoralregas/backend_gateway/auth/InvalidCredentialsException.java create mode 100644 src/main/java/com/litoralregas/backend_gateway/auth/dto/LoginRequest.java create mode 100644 src/main/java/com/litoralregas/backend_gateway/auth/dto/LoginResponse.java create mode 100644 src/main/java/com/litoralregas/backend_gateway/config/AuthExceptionHandler.java diff --git a/src/main/java/com/litoralregas/backend_gateway/auth/AuthController.java b/src/main/java/com/litoralregas/backend_gateway/auth/AuthController.java new file mode 100644 index 0000000..6da203e --- /dev/null +++ b/src/main/java/com/litoralregas/backend_gateway/auth/AuthController.java @@ -0,0 +1,21 @@ +package com.litoralregas.backend_gateway.auth; + +import com.litoralregas.backend_gateway.auth.dto.LoginRequest; +import com.litoralregas.backend_gateway.auth.dto.LoginResponse; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/auth") +public class AuthController { + + private final AuthService authService; + + public AuthController(AuthService authService) { + this.authService = authService; + } + + @PostMapping("/login") + public LoginResponse login(@RequestBody LoginRequest request) { + return authService.login(request); + } +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend_gateway/auth/AuthService.java b/src/main/java/com/litoralregas/backend_gateway/auth/AuthService.java new file mode 100644 index 0000000..cf402a8 --- /dev/null +++ b/src/main/java/com/litoralregas/backend_gateway/auth/AuthService.java @@ -0,0 +1,50 @@ +package com.litoralregas.backend_gateway.auth; + +import com.litoralregas.backend_gateway.auth.dto.LoginRequest; +import com.litoralregas.backend_gateway.auth.dto.LoginResponse; +import com.litoralregas.backend_gateway.user.UserEntity; +import com.litoralregas.backend_gateway.user.UserRepository; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +public class AuthService { + + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + + public AuthService( + UserRepository userRepository, + PasswordEncoder passwordEncoder + ) { + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + } + + public LoginResponse login(LoginRequest request) { + + UserEntity user = userRepository.findByUsername(request.username()) + .orElseThrow(InvalidCredentialsException::new); + + if (!user.isEnabled()) { + throw new InvalidCredentialsException(); + } + + boolean valid = passwordEncoder.matches( + request.password(), + user.getPasswordHash() + ); + + if (!valid) { + throw new InvalidCredentialsException(); + } + + return new LoginResponse( + user.getId(), + user.getClient().getId(), + user.getClient().getName(), + user.getUsername(), + user.getRole() + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend_gateway/auth/InvalidCredentialsException.java b/src/main/java/com/litoralregas/backend_gateway/auth/InvalidCredentialsException.java new file mode 100644 index 0000000..4cf879a --- /dev/null +++ b/src/main/java/com/litoralregas/backend_gateway/auth/InvalidCredentialsException.java @@ -0,0 +1,12 @@ +package com.litoralregas.backend_gateway.auth; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.UNAUTHORIZED) +public class InvalidCredentialsException extends RuntimeException { + + public InvalidCredentialsException() { + super("Invalid credentials"); + } +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend_gateway/auth/dto/LoginRequest.java b/src/main/java/com/litoralregas/backend_gateway/auth/dto/LoginRequest.java new file mode 100644 index 0000000..5e8dd84 --- /dev/null +++ b/src/main/java/com/litoralregas/backend_gateway/auth/dto/LoginRequest.java @@ -0,0 +1,7 @@ +package com.litoralregas.backend_gateway.auth.dto; + +public record LoginRequest( + String username, + String password +) { +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend_gateway/auth/dto/LoginResponse.java b/src/main/java/com/litoralregas/backend_gateway/auth/dto/LoginResponse.java new file mode 100644 index 0000000..69c856b --- /dev/null +++ b/src/main/java/com/litoralregas/backend_gateway/auth/dto/LoginResponse.java @@ -0,0 +1,12 @@ +package com.litoralregas.backend_gateway.auth.dto; + +import com.litoralregas.backend_gateway.user.UserRole; + +public record LoginResponse( + Long userId, + Long clientId, + String clientName, + String username, + UserRole role +) { +} \ No newline at end of file diff --git a/src/main/java/com/litoralregas/backend_gateway/config/AuthExceptionHandler.java b/src/main/java/com/litoralregas/backend_gateway/config/AuthExceptionHandler.java new file mode 100644 index 0000000..52e6c49 --- /dev/null +++ b/src/main/java/com/litoralregas/backend_gateway/config/AuthExceptionHandler.java @@ -0,0 +1,17 @@ +package com.litoralregas.backend_gateway.auth; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class AuthExceptionHandler { + + @ExceptionHandler(InvalidCredentialsException.class) + public ResponseEntity handleInvalidCredentials() { + return ResponseEntity + .status(HttpStatus.UNAUTHORIZED) + .body("Invalid credentials"); + } +} \ No newline at end of file