From adec55412276901993d12f307407a3db9e5931aa Mon Sep 17 00:00:00 2001 From: vladp Date: Tue, 25 Nov 2025 14:20:28 +0700 Subject: [PATCH] NCP-2 add logout --- .../soune/no_copy/controller/AuthController.java | 16 ++++++++++++---- .../no_copy/repository/AuthTokenRepository.java | 1 + .../ru/soune/no_copy/service/AuthService.java | 4 ++++ 3 files changed, 17 insertions(+), 4 deletions(-) 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 5c4e380..03ee445 100644 --- a/src/main/java/ru/soune/no_copy/controller/AuthController.java +++ b/src/main/java/ru/soune/no_copy/controller/AuthController.java @@ -3,10 +3,7 @@ package ru.soune.no_copy.controller; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import ru.soune.no_copy.dto.AuthResponse; import ru.soune.no_copy.dto.LoginRequest; import ru.soune.no_copy.dto.LoginResponse; @@ -14,6 +11,8 @@ import ru.soune.no_copy.dto.RegisterRequest; import ru.soune.no_copy.entity.AuthToken; import ru.soune.no_copy.service.AuthService; +import java.util.Map; + @RestController @RequestMapping("/api/auth") @RequiredArgsConstructor @@ -36,4 +35,13 @@ public class AuthController { return ResponseEntity.ok(new LoginResponse(true, login.getUser().getEmail(), login.getToken(),login.getExpiresAt().toString())); } + + @PostMapping("/logout") + public ResponseEntity logout(@RequestHeader("Authorization") String tokenHeader) { + String token = tokenHeader.replace("Bearer ", ""); + + authService.logout(token); + + return ResponseEntity.ok(Map.of("success", true)); + } } diff --git a/src/main/java/ru/soune/no_copy/repository/AuthTokenRepository.java b/src/main/java/ru/soune/no_copy/repository/AuthTokenRepository.java index 725d8e0..af56845 100644 --- a/src/main/java/ru/soune/no_copy/repository/AuthTokenRepository.java +++ b/src/main/java/ru/soune/no_copy/repository/AuthTokenRepository.java @@ -10,4 +10,5 @@ import java.util.Optional; @Repository public interface AuthTokenRepository extends JpaRepository { Optional findByTokenAndExpiresAtAfter(String token, LocalDate expiresAtAfter); + Optional findByToken(String token); } 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 524c28c..3922b17 100644 --- a/src/main/java/ru/soune/no_copy/service/AuthService.java +++ b/src/main/java/ru/soune/no_copy/service/AuthService.java @@ -78,6 +78,10 @@ public class AuthService { return authTokenRepository.save(authToken); } + public void logout(String token) { + authTokenRepository.findByToken(token) + .ifPresent(authTokenRepository::delete); + } private String generateAuthToken() { byte[] bytes = new byte[32];