diff --git a/src/main/java/com/moabam/api/application/ranking/RankingMapper.java b/src/main/java/com/moabam/api/application/ranking/RankingMapper.java index 817ccdc8..5d17e5d1 100644 --- a/src/main/java/com/moabam/api/application/ranking/RankingMapper.java +++ b/src/main/java/com/moabam/api/application/ranking/RankingMapper.java @@ -25,7 +25,7 @@ public static TopRankingInfo topRankingResponse(int rank, long score, RankingInf public static TopRankingInfo topRankingResponse(int rank, UpdateRanking updateRanking) { return TopRankingInfo.builder() - .rank(rank + 1) + .rank(rank) .score(updateRanking.score()) .nickname(updateRanking.rankingInfo().nickname()) .image(updateRanking.rankingInfo().image()) diff --git a/src/main/java/com/moabam/api/application/ranking/RankingService.java b/src/main/java/com/moabam/api/application/ranking/RankingService.java index 651093f4..4b7b1e9e 100644 --- a/src/main/java/com/moabam/api/application/ranking/RankingService.java +++ b/src/main/java/com/moabam/api/application/ranking/RankingService.java @@ -51,17 +51,17 @@ public void removeRanking(RankingInfo rankingInfo) { public TopRankingResponse getMemberRanking(UpdateRanking myRankingInfo) { List topRankings = getTopRankings(); - Long myRanking = zSetRedisRepository.reverseRank(RANKING, myRankingInfo.rankingInfo()); + long myRanking = zSetRedisRepository.reverseRank(RANKING, myRankingInfo.rankingInfo()) + 1; Optional myTopRanking = topRankings.stream() .filter(topRankingInfo -> Objects.equals(topRankingInfo.memberId(), myRankingInfo.rankingInfo().memberId())) .findFirst(); if (myTopRanking.isPresent()) { - myRanking = (long)myTopRanking.get().rank(); + myRanking = myTopRanking.get().rank(); } - TopRankingInfo myRankingInfoResponse = RankingMapper.topRankingResponse(myRanking.intValue(), myRankingInfo); + TopRankingInfo myRankingInfoResponse = RankingMapper.topRankingResponse((int)myRanking, myRankingInfo); return RankingMapper.topRankingResponses(myRankingInfoResponse, topRankings); } diff --git a/src/main/java/com/moabam/global/common/annotation/SlackNotification.java b/src/main/java/com/moabam/global/common/annotation/SlackNotification.java new file mode 100644 index 00000000..17863400 --- /dev/null +++ b/src/main/java/com/moabam/global/common/annotation/SlackNotification.java @@ -0,0 +1,12 @@ +package com.moabam.global.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface SlackNotification { + +} diff --git a/src/main/java/com/moabam/global/common/util/SlackNotificationAspect.java b/src/main/java/com/moabam/global/common/util/SlackNotificationAspect.java new file mode 100644 index 00000000..e50f41c7 --- /dev/null +++ b/src/main/java/com/moabam/global/common/util/SlackNotificationAspect.java @@ -0,0 +1,29 @@ +package com.moabam.global.common.util; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +import com.moabam.api.infrastructure.slack.SlackService; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; + +@Aspect +@Component +@Profile({"dev", "prod"}) +@RequiredArgsConstructor +public class SlackNotificationAspect { + + private final SlackService slackService; + + @Around("@annotation(com.moabam.global.common.annotation.SlackNotification) && args(request, exception)") + public Object sendSlack(ProceedingJoinPoint joinPoint, HttpServletRequest request, Exception exception) + throws Throwable { + slackService.send(request, exception); + + return joinPoint.proceed(); + } +} diff --git a/src/main/java/com/moabam/global/error/handler/GlobalExceptionHandler.java b/src/main/java/com/moabam/global/error/handler/GlobalExceptionHandler.java index 766a7e01..8fa4d5a3 100644 --- a/src/main/java/com/moabam/global/error/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/moabam/global/error/handler/GlobalExceptionHandler.java @@ -10,12 +10,14 @@ import org.springframework.http.HttpStatus; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingRequestValueException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.multipart.MaxUploadSizeExceededException; +import com.moabam.global.common.annotation.SlackNotification; import com.moabam.global.error.exception.BadRequestException; import com.moabam.global.error.exception.ConflictException; import com.moabam.global.error.exception.FcmException; @@ -26,9 +28,18 @@ import com.moabam.global.error.exception.UnauthorizedException; import com.moabam.global.error.model.ErrorResponse; +import jakarta.servlet.http.HttpServletRequest; + @RestControllerAdvice public class GlobalExceptionHandler { + @SlackNotification + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(Exception.class) + protected ErrorResponse handleException(HttpServletRequest request, Exception exception) { + return new ErrorResponse(exception.getMessage(), null); + } + @ResponseStatus(HttpStatus.NOT_FOUND) @ExceptionHandler(NotFoundException.class) protected ErrorResponse handleNotFoundException(MoabamException exception) { @@ -104,6 +115,12 @@ protected ErrorResponse handleMethodArgumentTypeMismatchException(MethodArgument return new ErrorResponse(message, null); } + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MissingRequestValueException.class) + protected ErrorResponse handleMethodArgumentTypeMismatchException(MissingRequestValueException exception) { + return new ErrorResponse(exception.getMessage(), null); + } + @ExceptionHandler(MaxUploadSizeExceededException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) protected ErrorResponse handleMaxSizeException(MaxUploadSizeExceededException exception) { diff --git a/src/main/java/com/moabam/global/error/handler/SlackExceptionHandler.java b/src/main/java/com/moabam/global/error/handler/SlackExceptionHandler.java deleted file mode 100644 index b144c62b..00000000 --- a/src/main/java/com/moabam/global/error/handler/SlackExceptionHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.moabam.global.error.handler; - -import org.springframework.context.annotation.Profile; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import com.moabam.api.infrastructure.slack.SlackService; -import com.moabam.global.error.model.ErrorResponse; - -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; - -@RestControllerAdvice -@Profile({"dev", "prod"}) -@RequiredArgsConstructor -public class SlackExceptionHandler { - - private final SlackService slackService; - - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(Exception.class) - protected ErrorResponse handleException(HttpServletRequest request, Exception exception) throws Exception { - slackService.send(request, exception); - - return new ErrorResponse(exception.getMessage(), null); - } -} diff --git a/src/main/resources/config b/src/main/resources/config index 6c56ec63..05316d99 160000 --- a/src/main/resources/config +++ b/src/main/resources/config @@ -1 +1 @@ -Subproject commit 6c56ec639c26b593ae2ea4ba98c4db1f4c0cf83c +Subproject commit 05316d99c521b3a26772206d4063cc069e08c848 diff --git a/src/test/java/com/moabam/api/presentation/MemberAuthorizeControllerTest.java b/src/test/java/com/moabam/api/presentation/MemberAuthorizeControllerTest.java index be66cc08..3e3083ec 100644 --- a/src/test/java/com/moabam/api/presentation/MemberAuthorizeControllerTest.java +++ b/src/test/java/com/moabam/api/presentation/MemberAuthorizeControllerTest.java @@ -213,7 +213,8 @@ void token_info_response_fail(int code) throws Exception { .andRespond(withStatus(HttpStatusCode.valueOf(code))); mockMvc.perform(post("/members/login/kakao/oauth") - .flashAttr("authorizationCodeResponse", authorizationCodeResponse)) + .content(objectMapper.writeValueAsString(authorizationCodeResponse)) + .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isBadRequest()); } }