🏅오늘의 목표
✅ 진행한 작업
📃 개발내용
코스 단건 조회
CourseRepository
Optional<Course> findByUuidAndCourseVisibility(UUID courseUuid, CourseVisibility courseVisibility);
CourseService
- 코스 단건 조회는 전체공개/비공개/크루원만 공개 로 나누어진다.
- 현재는 전체공개/비공개만 구현했고, 추후 크루 도메인 구현시 추가할 예정이다.
// 코스 단건 조회 - 전체 공개
@Transactional(readOnly = true)
public CourseDto getPublicCourse(UUID courseUuid) {
log.debug("[전체공개]코스 조회 시작 : courseUuid={}", courseUuid);
// 코스 확인
Course course = courseRepository.findByUuidAndCourseVisibility(courseUuid, CourseVisibility.PUBLIC)
.orElseThrow(() -> new BaseException(CourseErrorCode.COURSE_NOT_FOUND));
return courseMapper.toDto(course);
}
// 코스 단건 조회 - 비공개
@Transactional(readOnly = true)
public CourseDto getPrivateCourse(UUID userUuid, UUID courseUuid) {
log.debug("[비공개]코스 조회 시작 : courseUuid={}", courseUuid);
// 코스 확인
Course course = courseRepository.findByUuidAndCourseVisibility(courseUuid, CourseVisibility.PRIVATE)
.orElseThrow(() -> new BaseException(CourseErrorCode.COURSE_NOT_FOUND));
// 작성자인지 확인
if (!course.getUser().getUuid().equals(userUuid)) {
throw new BaseException(CourseErrorCode.COURSE_CREATOR_NOT_SAME);
}
return courseMapper.toDto(course);
}
CourseController
// 코스 단건 조회 - 전체공개
@GetMapping("/public/{courseUuid}")
public ResponseEntity<ApiResponse<CourseDto>> getPublicCourse(
@PathVariable UUID courseUuid
){
CourseDto courseDto = courseService.getPublicCourse(courseUuid);
return ResponseEntity.ok(new ApiResponse<>("[전체공개] 코스 단건 조회에 성공했습니다.", courseDto));
}
// 코스 단건 조회 - 비공개
@GetMapping("/me/{courseUuid}")
public ResponseEntity<ApiResponse<CourseDto>> getPrivateCourse(
@AuthenticationPrincipal CustomUserDetails customUserDetails,
@PathVariable UUID courseUuid
){
CourseDto courseDto = courseService.getPrivateCourse(customUserDetails.getUserUuid(),courseUuid);
return ResponseEntity.ok(new ApiResponse<>("[비공개] 코스 단건 조회에 성공했습니다.", courseDto));
}
CourseMapper
@Mapper(componentModel = "spring")
public interface CourseMapper {
@Mapping(target = "courseUuid", source = "uuid")
CourseDto toDto(Course course);
}
📝 테스트