Merge pull request 'NCBACK-13' (#8) from NCBACK-13 into dev
Test Workflow / test (push) Waiting to run

Reviewed-on: #8
This commit was merged in pull request #8.
This commit is contained in:
2025-12-21 17:15:16 +08:00
6 changed files with 82 additions and 44 deletions
@@ -15,6 +15,7 @@ import ru.soune.nocopy.dto.RegAnswer;
import ru.soune.nocopy.exception.NotValidFieldException; import ru.soune.nocopy.exception.NotValidFieldException;
import ru.soune.nocopy.exception.ValidationException; import ru.soune.nocopy.exception.ValidationException;
import ru.soune.nocopy.handler.LoginRequestHandler; import ru.soune.nocopy.handler.LoginRequestHandler;
import ru.soune.nocopy.handler.LogoutRequestHandler;
import ru.soune.nocopy.handler.RegRequestHandler; import ru.soune.nocopy.handler.RegRequestHandler;
import ru.soune.nocopy.handler.RequestHandler; import ru.soune.nocopy.handler.RequestHandler;
@@ -36,9 +37,11 @@ public class ApiController {
public void init() { public void init() {
RegRequestHandler regHandler = applicationContext.getBean(RegRequestHandler.class); RegRequestHandler regHandler = applicationContext.getBean(RegRequestHandler.class);
LoginRequestHandler loginHandler = applicationContext.getBean(LoginRequestHandler.class); LoginRequestHandler loginHandler = applicationContext.getBean(LoginRequestHandler.class);
LogoutRequestHandler logoutHandler = applicationContext.getBean(LogoutRequestHandler.class);
handlers.put(20002, regHandler);
handlers.put(20001, loginHandler); handlers.put(20001, loginHandler);
handlers.put(20002, regHandler);
handlers.put(20006, logoutHandler);
} }
@PostMapping("/v{version}/data") @PostMapping("/v{version}/data")
@@ -1,37 +0,0 @@
package ru.soune.nocopy.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import ru.soune.nocopy.entity.AuthToken;
import ru.soune.nocopy.exception.TokenNotFoundException;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.service.AuthService;
import java.util.Map;
import java.util.Optional;
@RestController
@RequestMapping("v1/api/auth")
@RequiredArgsConstructor
public class AuthController {
private final AuthService authService;
private final AuthTokenRepository authTokenRepository;
@PostMapping("/logout")
public ResponseEntity<?> logout(@RequestHeader("Authorization") String tokenHeader) {
String token = tokenHeader.replace("Bearer ", "");
Optional<AuthToken> opToken = authTokenRepository.findByToken(token);
if (opToken.isEmpty()) {
throw new TokenNotFoundException("Token not found");
}
authService.logout(token);
return ResponseEntity.ok(Map.of("success", true));
}
}
@@ -4,14 +4,9 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class LogOutAnswer { public class LogOutAnswer {
private String Token; private String email;
private List<Map<String, String>> fieldErrors;
} }
@@ -0,0 +1,19 @@
package ru.soune.nocopy.dto;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LogoutRequest {
@NotBlank(message = "error.not.blank") @Email(message = "error.not.email") @Size(max = 128)
private String email;
@NotBlank(message = "error.not.blank")
private String token;
}
@@ -9,6 +9,8 @@ public enum MessageCode {
MSG_ID_NOT_FOUND(4, "Message id not found"), MSG_ID_NOT_FOUND(4, "Message id not found"),
AUTH_EMAIL_NOT_FOUND(4, "Email not found"), AUTH_EMAIL_NOT_FOUND(4, "Email not found"),
AUTH_EMAIL_OR_TOKEN_NOT_FOUND(4, "Email or Token not found "),
AUTH_TOKEN_MISMATCH(4, "Token mismatch"),
AUTH_PASSWORD_NOT_MATCHES(2, "Password does not match"); AUTH_PASSWORD_NOT_MATCHES(2, "Password does not match");
private final Integer code; private final Integer code;
@@ -0,0 +1,56 @@
package ru.soune.nocopy.handler;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import ru.soune.nocopy.dto.*;
import ru.soune.nocopy.entity.AuthToken;
import ru.soune.nocopy.entity.User;
import ru.soune.nocopy.exception.NotValidFieldException;
import ru.soune.nocopy.repository.AuthTokenRepository;
import ru.soune.nocopy.repository.UserRepository;
import ru.soune.nocopy.service.AuthService;
import java.util.Objects;
import java.util.Optional;
@Component
@RequiredArgsConstructor
public class LogoutRequestHandler implements RequestHandler {
private final AuthService authService;
private final AuthTokenRepository authTokenRepository;
private final ObjectMapper objectMapper;
private final UserRepository userRepository;
@Override
public BaseResponse handle(BaseRequest request) {
LogoutRequest logoutRequest = objectMapper.convertValue(request.getMessageBody(), LogoutRequest.class);
Optional<AuthToken> opToken = authTokenRepository.findByToken(logoutRequest.getToken());
Optional<User> user = userRepository.findByEmail(logoutRequest.getEmail());
if (opToken.isEmpty() || user.isEmpty()) {
throw new NotValidFieldException("User with email or token not found",
new BaseResponse(request.getMsgId(), MessageCode.AUTH_EMAIL_OR_TOKEN_NOT_FOUND.getCode(),
MessageCode.AUTH_EMAIL_OR_TOKEN_NOT_FOUND.getDescription(),
new LogoutRequest(logoutRequest.getEmail(), logoutRequest.getToken())));
}
if (!Objects.equals(opToken.get().getUser().getId(), user.get().getId())) {
throw new NotValidFieldException("User token mismatch with user",
new BaseResponse(request.getMsgId(), MessageCode.AUTH_TOKEN_MISMATCH.getCode(),
MessageCode.AUTH_TOKEN_MISMATCH.getDescription(),
new LogoutRequest(logoutRequest.getEmail(), logoutRequest.getToken())));
}
authService.logout(logoutRequest.getToken());
return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(),
new LogOutAnswer(logoutRequest.getEmail()));
}
}