From 1b6dd40e94ce351fe04c79ca1da25983966362b2 Mon Sep 17 00:00:00 2001 From: Seonheui Jeon <88873302+funnysunny08@users.noreply.github.com> Date: Sat, 9 Mar 2024 19:21:27 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[Feat]=20=EC=BD=94=EC=8A=A4=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=A1=B0=ED=9A=8C=EC=97=90=EC=84=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=EC=9E=90=EC=99=80=20=EC=A0=91=EC=86=8D=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=20=EB=B9=84=EA=B5=90=ED=95=98=EB=8A=94=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EB=B0=B0=ED=8F=AC=20(#156)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Feat] 센트리 세팅 (#152) * feat: sentry 세팅 * feat: sentry 세팅 * fix: sentry 버전 수정 * fix: Sentry 설정 변경 * feat: 코스 상세 조회에서 작성자와 접속 유저 비교하는 필드 추가 (#154) --- build.gradle | 2 ++ .../advice/ControllerExceptionAdvice.java | 18 +++++++++--------- .../course/controller/CourseController.java | 2 +- .../response/GetCourseDetailResponseDto.java | 10 ++++++---- .../server/course/service/CourseService.java | 8 ++++++-- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index 10d6022..c3ce667 100644 --- a/build.gradle +++ b/build.gradle @@ -69,6 +69,8 @@ dependencies { //json parser implementation 'com.nimbusds:nimbus-jose-jwt:9.12' + // Sentry + implementation 'io.sentry:sentry-spring-boot-starter:4.3.0' } diff --git a/src/main/java/org/runnect/server/common/advice/ControllerExceptionAdvice.java b/src/main/java/org/runnect/server/common/advice/ControllerExceptionAdvice.java index ff2db6c..6642621 100644 --- a/src/main/java/org/runnect/server/common/advice/ControllerExceptionAdvice.java +++ b/src/main/java/org/runnect/server/common/advice/ControllerExceptionAdvice.java @@ -1,9 +1,15 @@ package org.runnect.server.common.advice; -import lombok.RequiredArgsConstructor; - +import io.sentry.Sentry; +import java.io.IOException; +import java.util.Objects; import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolationException; +import lombok.RequiredArgsConstructor; +import org.runnect.server.common.constant.ErrorStatus; +import org.runnect.server.common.dto.ApiResponseDto; +import org.runnect.server.common.exception.BasicException; +import org.runnect.server.config.slack.SlackApi; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; @@ -14,13 +20,6 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.runnect.server.common.dto.ApiResponseDto; -import org.runnect.server.common.constant.ErrorStatus; -import org.runnect.server.common.exception.BasicException; -import org.runnect.server.config.slack.SlackApi; - -import java.io.IOException; -import java.util.Objects; @RestControllerAdvice @Component @@ -74,6 +73,7 @@ protected ApiResponseDto handleMissingRequestParameterException(final MissingSer @ExceptionHandler(Exception.class) protected ApiResponseDto handleException(final Exception error, final HttpServletRequest request) throws IOException { slackApi.sendAlert(error, request); + Sentry.captureException(error); return ApiResponseDto.error(ErrorStatus.INTERNAL_SERVER_ERROR); } diff --git a/src/main/java/org/runnect/server/course/controller/CourseController.java b/src/main/java/org/runnect/server/course/controller/CourseController.java index 49bcc2c..1e5c946 100644 --- a/src/main/java/org/runnect/server/course/controller/CourseController.java +++ b/src/main/java/org/runnect/server/course/controller/CourseController.java @@ -71,7 +71,7 @@ public ApiResponseDto getPrivateCourseByUser( public ApiResponseDto getCourseDetail(@UserId Long userId, @PathVariable Long courseId) { return ApiResponseDto.success(SuccessStatus.GET_COURSE_DETAIL_SUCCESS, - courseService.getCourseDetail(courseId)); + courseService.getCourseDetail(courseId, userId)); } @PatchMapping("/{courseId}") diff --git a/src/main/java/org/runnect/server/course/dto/response/GetCourseDetailResponseDto.java b/src/main/java/org/runnect/server/course/dto/response/GetCourseDetailResponseDto.java index 534b383..5b22dc0 100644 --- a/src/main/java/org/runnect/server/course/dto/response/GetCourseDetailResponseDto.java +++ b/src/main/java/org/runnect/server/course/dto/response/GetCourseDetailResponseDto.java @@ -19,10 +19,10 @@ public class GetCourseDetailResponseDto { private UserResponseCourseDetail user; private CourseDetailResponse course; - public static GetCourseDetailResponseDto from(Course course) { + public static GetCourseDetailResponseDto of(Course course, Boolean isNowUser) { return new GetCourseDetailResponseDto( UserResponseCourseDetail.from(course.getRunnectUser()), - CourseDetailResponse.of(course) + CourseDetailResponse.of(course, isNowUser) ); } @@ -51,8 +51,9 @@ public static class CourseDetailResponse { private String image; private String title; private DepartureResponse departure; + private Boolean isNowUser; - public static CourseDetailResponse of(Course course) { + public static CourseDetailResponse of(Course course, Boolean isNowUser) { return new CourseDetailResponse( course.getId(), course.getCreatedAt(), @@ -60,7 +61,8 @@ public static CourseDetailResponse of(Course course) { course.getDistance(), course.getImage(), course.getTitle(), - DepartureResponse.from(course) + DepartureResponse.from(course), + isNowUser ); } } diff --git a/src/main/java/org/runnect/server/course/service/CourseService.java b/src/main/java/org/runnect/server/course/service/CourseService.java index 48fa108..9a485c9 100644 --- a/src/main/java/org/runnect/server/course/service/CourseService.java +++ b/src/main/java/org/runnect/server/course/service/CourseService.java @@ -113,13 +113,17 @@ public CourseGetByUserResponseDto getPrivateCourseByUser(Long userId) { } @Transactional(readOnly = true) - public GetCourseDetailResponseDto getCourseDetail(Long courseId) { + public GetCourseDetailResponseDto getCourseDetail(Long courseId, Long userId) { + RunnectUser requestUser = userRepository.findById(userId) + .orElseThrow(() -> new NotFoundUserException(NOT_FOUND_USER_EXCEPTION, + NOT_FOUND_USER_EXCEPTION.getMessage())); Course course = courseRepository.findById(courseId) .orElseThrow(() -> new NotFoundException(NOT_FOUND_COURSE_EXCEPTION, NOT_FOUND_COURSE_EXCEPTION.getMessage())); + RunnectUser uploader = course.getRunnectUser(); - return GetCourseDetailResponseDto.from(course); + return GetCourseDetailResponseDto.of(course,uploader != null && uploader.equals(requestUser)); } @Transactional From 1cf608e3c1e3b8a15f5e0e5d711dfa8907052431 Mon Sep 17 00:00:00 2001 From: LeeMyeongJin Date: Thu, 19 Feb 2026 21:20:57 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?=EA=B3=B5=EA=B0=9C=20=EC=BD=94=EC=8A=A4=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - userId 280(관리자)에 대해 공개 코스 삭제 시 소유자 검증 우회 - 비관리자 기존 동작 유지 --- .../server/publicCourse/service/PublicCourseService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java b/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java index 2ab5c99..c99a026 100644 --- a/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java +++ b/src/main/java/org/runnect/server/publicCourse/service/PublicCourseService.java @@ -350,8 +350,10 @@ public DeletePublicCoursesResponseDto deletePublicCourses( throw new NotFoundException(ErrorStatus.NOT_FOUND_PUBLICCOURSE_EXCEPTION, ErrorStatus.NOT_FOUND_PUBLICCOURSE_EXCEPTION.getMessage()); } + boolean isAdmin = userId.equals(280L); + publicCourses.stream() - .filter(pc -> !pc.getCourse().getRunnectUser().equals(user)) + .filter(pc -> !isAdmin && !pc.getCourse().getRunnectUser().equals(user)) .findAny() .ifPresent(pc -> { throw new PermissionDeniedException(