From b24dd6c5c5f718cc38b7562ddc780c1d42081b62 Mon Sep 17 00:00:00 2001 From: Nikita Kuritsyn Date: Sun, 8 Jun 2025 22:17:57 +0300 Subject: [PATCH 1/3] Add http error handling --- .../advice/TwitterControllerAdvice.java | 23 +++++++++++++++++++ .../twitterservice/model/dto/ApiErrorDto.java | 8 +++++++ 2 files changed, 31 insertions(+) create mode 100644 src/main/java/ru/randomwalk/twitterservice/controller/advice/TwitterControllerAdvice.java create mode 100644 src/main/java/ru/randomwalk/twitterservice/model/dto/ApiErrorDto.java diff --git a/src/main/java/ru/randomwalk/twitterservice/controller/advice/TwitterControllerAdvice.java b/src/main/java/ru/randomwalk/twitterservice/controller/advice/TwitterControllerAdvice.java new file mode 100644 index 0000000..cc9075e --- /dev/null +++ b/src/main/java/ru/randomwalk/twitterservice/controller/advice/TwitterControllerAdvice.java @@ -0,0 +1,23 @@ +package ru.randomwalk.twitterservice.controller.advice; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import ru.randomwalk.twitterservice.model.dto.ApiErrorDto; +import ru.randomwalk.twitterservice.model.exception.NotFoundException; + +@RestControllerAdvice +@Slf4j +public class TwitterControllerAdvice { + + @ExceptionHandler({NotFoundException.class}) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ResponseEntity exceptionHandler(NotFoundException e) { + log.warn("Handle not found exception", e); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new ApiErrorDto(e.getMessage())); + } +} diff --git a/src/main/java/ru/randomwalk/twitterservice/model/dto/ApiErrorDto.java b/src/main/java/ru/randomwalk/twitterservice/model/dto/ApiErrorDto.java new file mode 100644 index 0000000..607e4b9 --- /dev/null +++ b/src/main/java/ru/randomwalk/twitterservice/model/dto/ApiErrorDto.java @@ -0,0 +1,8 @@ +package ru.randomwalk.twitterservice.model.dto; + +import lombok.Builder; + +@Builder(toBuilder = true) +public record ApiErrorDto ( + String message +) {} From d8810303423b44a2573fc945248ab60c0040c481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D1=80=D0=B8=D1=86=D1=8B=D0=BD=20=D0=9D=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8=D1=82=D0=B0=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <96997917+kryakobess@users.noreply.github.com> Date: Sun, 8 Jun 2025 22:19:53 +0300 Subject: [PATCH 2/3] Update src/main/java/ru/randomwalk/twitterservice/controller/advice/TwitterControllerAdvice.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../controller/advice/TwitterControllerAdvice.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/randomwalk/twitterservice/controller/advice/TwitterControllerAdvice.java b/src/main/java/ru/randomwalk/twitterservice/controller/advice/TwitterControllerAdvice.java index cc9075e..f061f6b 100644 --- a/src/main/java/ru/randomwalk/twitterservice/controller/advice/TwitterControllerAdvice.java +++ b/src/main/java/ru/randomwalk/twitterservice/controller/advice/TwitterControllerAdvice.java @@ -14,7 +14,7 @@ public class TwitterControllerAdvice { @ExceptionHandler({NotFoundException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) + @ResponseStatus(HttpStatus.NOT_FOUND) public ResponseEntity exceptionHandler(NotFoundException e) { log.warn("Handle not found exception", e); return ResponseEntity.status(HttpStatus.NOT_FOUND) From 4ddcb7297a5706323077bdb9f61fe38b6c57cdd2 Mon Sep 17 00:00:00 2001 From: Nikita Kuritsyn Date: Mon, 9 Jun 2025 09:52:56 +0300 Subject: [PATCH 3/3] Create new token on refresh if previous token is not present --- .../service/impl/DeviceServiceImpl.java | 14 +++++++++----- .../service/impl/DeviceServiceImplTest.java | 13 +++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/randomwalk/twitterservice/service/impl/DeviceServiceImpl.java b/src/main/java/ru/randomwalk/twitterservice/service/impl/DeviceServiceImpl.java index e0fce15..df07013 100644 --- a/src/main/java/ru/randomwalk/twitterservice/service/impl/DeviceServiceImpl.java +++ b/src/main/java/ru/randomwalk/twitterservice/service/impl/DeviceServiceImpl.java @@ -52,11 +52,15 @@ public void addNewDeviceToken(UUID userId, String deviceToken) { @Override public void refreshExistingToken(UUID userId, String previousToken, String newToken) { log.info("Refreshing existing token for user {}", userId); - var device = deviceRepository.findByUser_UserIdAndDeviceToken(userId, previousToken) - .orElseThrow(() -> new NotFoundException("Device with provided token does not exist")); - device.setDeviceToken(newToken); - deviceRepository.save(device); - log.info("Token was refreshed for device {}", device.getId()); + var optionalDevice = deviceRepository.findByUser_UserIdAndDeviceToken(userId, previousToken); + if (optionalDevice.isPresent()) { + var device = optionalDevice.get(); + device.setDeviceToken(newToken); + deviceRepository.save(device); + log.info("Token was refreshed for device {}", device.getId()); + } else { + addNewDeviceToken(userId, newToken); + } } private Device createDevice(UserAccount user, String deviceToken) { diff --git a/src/test/java/ru/randomwalk/twitterservice/service/impl/DeviceServiceImplTest.java b/src/test/java/ru/randomwalk/twitterservice/service/impl/DeviceServiceImplTest.java index 9f6d24e..7f67229 100644 --- a/src/test/java/ru/randomwalk/twitterservice/service/impl/DeviceServiceImplTest.java +++ b/src/test/java/ru/randomwalk/twitterservice/service/impl/DeviceServiceImplTest.java @@ -87,4 +87,17 @@ void refreshExistingToken() { var device = deviceRepository.findById(deviceId).get(); assertEquals(newToken, device.getDeviceToken()); } + + @Test + void createNewTokenIfNothingToRefresh() { + String deviceToken = "some device token"; + UUID userId = UUID.randomUUID(); + String newToken = "new token"; + + deviceService.refreshExistingToken(userId, deviceToken, newToken); + + var device = deviceRepository.findByUser_UserIdAndDeviceToken(userId, newToken); + assertTrue(device.isPresent()); + assertEquals(userId, device.get().getUser().getUserId()); + } } \ No newline at end of file