diff --git a/README.md b/README.md index 5afe45e..7e3b975 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Academ Back-end repository 입니다. --- ### 프로젝트 구조 -( 최신화 : v1.1.2 ) +( 최신화 : v1.1.3 ) ``` │ ├── .github diff --git a/src/main/java/com/example/Devkor_project/controller/AdminController.java b/src/main/java/com/example/Devkor_project/controller/AdminController.java index 1ef7335..f7c4fd3 100644 --- a/src/main/java/com/example/Devkor_project/controller/AdminController.java +++ b/src/main/java/com/example/Devkor_project/controller/AdminController.java @@ -16,6 +16,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -25,11 +26,12 @@ import java.util.Map; @RestController +@RequiredArgsConstructor @Tag(name = "ADMIN", description = "ADMIN 권한의 계정만 요청 가능한 api입니다.") public class AdminController { - @Autowired AdminService adminService; - @Autowired VersionProvider versionProvider; + private final AdminService adminService; + private final VersionProvider versionProvider; /* 강의 정보 동기화 컨트톨러 */ @PostMapping("/api/admin/course-synchronization") @@ -182,4 +184,27 @@ public ResponseEntity trafficYearly(@RequestParam("year") S ); } + /* 테스트 계정 생성 컨트롤러 */ + @PostMapping("/api/admin/create-test-account") + @Operation(summary = "테스트 계정 생성") + @Parameters(value = { + @Parameter(in = ParameterIn.HEADER, name = "Authorization", description = "Bearer {access token}"), + }) + @ApiResponses(value = { + @ApiResponse(responseCode = "201", description = "이메일을 반환합니다.", content = @Content(schema = @Schema(implementation = String.class))), + @ApiResponse(responseCode = "실패: 400 (EMAIL_DUPLICATED)", description = "해당 이메일로 생성된 계정이 이미 존재하는 경우 (입력받은 이메일을 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), + }) + public ResponseEntity createTestAccount(@Valid @RequestBody ProfileDto.CreateTestAccount dto) { + adminService.createTestAccount(dto); + + return ResponseEntity.status(HttpStatus.CREATED) + .body( + ResponseDto.Success.builder() + .message("테스트 계정 생성을 성공하였습니다.") + .data(dto.getEmail()) + .version(versionProvider.getVersion()) + .build() + ); + } + } diff --git a/src/main/java/com/example/Devkor_project/controller/CourseController.java b/src/main/java/com/example/Devkor_project/controller/CourseController.java index c8a71cc..279b0ac 100644 --- a/src/main/java/com/example/Devkor_project/controller/CourseController.java +++ b/src/main/java/com/example/Devkor_project/controller/CourseController.java @@ -13,6 +13,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -24,11 +25,12 @@ import java.util.Map; @RestController +@RequiredArgsConstructor @Tag(name = "강의", description = "강의, 강의평 관련 api입니다.") public class CourseController { - @Autowired CourseService courseService; - @Autowired VersionProvider versionProvider; + private final CourseService courseService; + private final VersionProvider versionProvider; /* 강의 검색 컨트롤러 */ @GetMapping("/api/course/search") @@ -188,6 +190,7 @@ public ResponseEntity startInsertComment(Principal principa @ApiResponse(responseCode = "실패: 401 (UNAUTHORIZED)", description = "로그인하지 않은 경우", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 400 (ALREADY_EXIST)", description = "해당 사용자가 해당 강의에 이미 강의평을 등록한 경우 (입력받은 course_id를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 400 (SHORT_COMMENT_REVIEW)", description = "강의평 세부 내용 길이가 50자 미만인 경우 (입력받은 세부 내용의 길이를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), + @ApiResponse(responseCode = "실패: 400 (LONG_COMMENT_REVIEW)", description = "강의평 세부 내용 길이가 3000자 초과인 경우 (입력받은 세부 내용의 길이를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 404 (COURSE_NOT_FOUND)", description = "요청으로 보낸 course_id에 해당하는 강의가 존재하지 않는 경우 (입력받은 course_id를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 404 (COURSE_RATING_NOT_FOUND)", description = "특정 강의에 대한 평점 데이터가 존재하지 않는 경우 (courseRating_id를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 404 (EMAIL_NOT_FOUND)", description = "요청을 보낸 사용자의 계정이 존재하지 않는 경우 (이메일을 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @@ -247,6 +250,7 @@ public ResponseEntity startUpdateComment(Principal principa @ApiResponse(responseCode = "실패: 401 (UNAUTHORIZED)", description = "로그인하지 않은 경우", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 400 (NOT_COMMENT_BY_USER)", description = "해당 강의평이 해당 사용자가 작성한 강의평이 아닌 경우", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 400 (SHORT_COMMENT_REVIEW)", description = "강의평 세부 내용 길이가 50자 미만인 경우 (입력받은 세부 내용의 길이를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), + @ApiResponse(responseCode = "실패: 400 (LONG_COMMENT_REVIEW)", description = "강의평 세부 내용 길이가 3000자 초과인 경우 (입력받은 세부 내용의 길이를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 404 (COURSE_NOT_FOUND)", description = "요청으로 보낸 강의평이 속한 강의가 존재하지 않는 경우 (course_id를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 404 (COMMENT_NOT_FOUND)", description = "요청으로 보낸 comment_id에 해당하는 강의평이 존재하지 않는 경우 (입력받은 comment_id를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 404 (EMAIL_NOT_FOUND)", description = "요청을 보낸 사용자의 계정이 존재하지 않는 경우 (이메일을 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), diff --git a/src/main/java/com/example/Devkor_project/controller/LoginController.java b/src/main/java/com/example/Devkor_project/controller/LoginController.java index 6650e3f..b6bb7cf 100644 --- a/src/main/java/com/example/Devkor_project/controller/LoginController.java +++ b/src/main/java/com/example/Devkor_project/controller/LoginController.java @@ -17,6 +17,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -27,11 +28,12 @@ import java.security.Principal; @RestController +@RequiredArgsConstructor @Tag(name = "로그인", description = "회원가입/로그인/로그아웃, 권한 관련 api입니다.") public class LoginController { - @Autowired LoginService loginService; - @Autowired VersionProvider versionProvider; + private final LoginService loginService; + private final VersionProvider versionProvider; /* 회원가입 컨트롤러 */ @PostMapping("/api/signup") diff --git a/src/main/java/com/example/Devkor_project/controller/MyPageController.java b/src/main/java/com/example/Devkor_project/controller/MyPageController.java index 36f0864..8951fc2 100644 --- a/src/main/java/com/example/Devkor_project/controller/MyPageController.java +++ b/src/main/java/com/example/Devkor_project/controller/MyPageController.java @@ -13,6 +13,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -23,11 +24,12 @@ import java.util.List; @RestController +@RequiredArgsConstructor @Tag(name = "마이페이지", description = "마이페이지 관련 api입니다.") public class MyPageController { - @Autowired MyPageService myPageService; - @Autowired VersionProvider versionProvider; + private final MyPageService myPageService; + private final VersionProvider versionProvider; /* 마이페이지 기본 정보 컨트롤러 */ @GetMapping("/api/mypage/info") @@ -252,9 +254,8 @@ public ResponseEntity updatePassword(@Valid @RequestBody Pr @ApiResponse(responseCode = "실패: 401 (UNAUTHORIZED)", description = "로그인하지 않은 경우", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 400 (WRONG_PASSWORD)", description = "기존 비밀번호가 틀렸을 경우", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 400 (NOT_COMMENT_BY_USER)", description = "특정 강의평이 해당 사용자가 작성한 강의평이 아닌 경우", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), - @ApiResponse(responseCode = "실패: 404 (COURSE_NOT_FOUND)", description = "특정 강의평이 속한 강의가 존재하지 않는 경우 (course_id를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), - @ApiResponse(responseCode = "실패: 404 (COMMENT_NOT_FOUND)", description = "특정 comment_id에 해당하는 강의평이 존재하지 않는 경우 (comment_id를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), @ApiResponse(responseCode = "실패: 404 (EMAIL_NOT_FOUND)", description = "요청을 보낸 비밀번호가 숫자 또는 영문을 포함하지 않았거나, 8~24자리가 아닌 경우 (요청으로 보낸 새로운 비밀번호를 반환)", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), + @ApiResponse(responseCode = "실패: 404 (UNKNOWN_NOT_FOUND)", description = "알 수 없음 계정이 존재하지 않는 경우", content = @Content(schema = @Schema(implementation = ResponseDto.Error.class))), }) public ResponseEntity deleteProfile(@Valid @RequestBody ProfileDto.Delete dto, Principal principal) diff --git a/src/main/java/com/example/Devkor_project/controller/VersionController.java b/src/main/java/com/example/Devkor_project/controller/VersionController.java index d1d6200..0a96501 100644 --- a/src/main/java/com/example/Devkor_project/controller/VersionController.java +++ b/src/main/java/com/example/Devkor_project/controller/VersionController.java @@ -1,18 +1,13 @@ package com.example.Devkor_project.controller; import com.example.Devkor_project.configuration.VersionProvider; -import com.example.Devkor_project.dto.CommentDto; import com.example.Devkor_project.dto.ResponseDto; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.enums.ParameterIn; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -20,10 +15,11 @@ import org.springframework.web.bind.annotation.RestController; @RestController +@RequiredArgsConstructor @Tag(name = "버전", description = "버전 관련 api입니다.") public class VersionController { - @Autowired VersionProvider versionProvider; + private final VersionProvider versionProvider; /* 버전 확인 컨트톨러 */ @GetMapping("/api/is-secure") diff --git a/src/main/java/com/example/Devkor_project/dto/ProfileDto.java b/src/main/java/com/example/Devkor_project/dto/ProfileDto.java index f1b92e0..8b2253c 100644 --- a/src/main/java/com/example/Devkor_project/dto/ProfileDto.java +++ b/src/main/java/com/example/Devkor_project/dto/ProfileDto.java @@ -262,4 +262,19 @@ public static class BuyAccessAuth @Schema(description = "구매 상품") private String item; } + + @AllArgsConstructor + @ToString + @Getter + public static class CreateTestAccount + { + @NotBlank(message = "[email] cannot be blank.") + @Email(message = "[email] should be email format.") + @Schema(description = "이메일") + private String email; + + @NotBlank(message = "[password] cannot be blank.") + @Schema(description = "비밀번호") + private String password; + } } diff --git a/src/main/java/com/example/Devkor_project/exception/ErrorCode.java b/src/main/java/com/example/Devkor_project/exception/ErrorCode.java index 4af70d1..f24c171 100644 --- a/src/main/java/com/example/Devkor_project/exception/ErrorCode.java +++ b/src/main/java/com/example/Devkor_project/exception/ErrorCode.java @@ -33,12 +33,14 @@ public enum ErrorCode ALREADY_EXIST(HttpStatus.BAD_REQUEST, "해당 강의에 해당 사용자는 이미 강의평을 달았습니다."), NOT_COMMENT_BY_USER(HttpStatus.BAD_REQUEST, "해당 강의평은 해당 사용자가 작성한 강의평이 아닙니다."), SHORT_COMMENT_REVIEW(HttpStatus.BAD_REQUEST, "강의평 상세 내용은 50자 이상이어야 합니다."), + LONG_COMMENT_REVIEW(HttpStatus.BAD_REQUEST, "강의평 상세 내용은 3000자 이하이어야 합니다."), INVALID_REASON(HttpStatus.BAD_REQUEST, "해당 신고 사유는 유효하지 않습니다."), TOO_MANY_REPORT(HttpStatus.BAD_REQUEST, "해당 강의평을 너무 많이 신고하였습니다."), INVALID_ITEM(HttpStatus.BAD_REQUEST, "해당 아이템은 유효하지 않습니다."), NOT_ENOUGH_POINT(HttpStatus.BAD_REQUEST, "포인트가 부족합니다."), WRONG_PASSWORD(HttpStatus.BAD_REQUEST, "비밀번호가 틀렸습니다."), - TRAFFIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 기간 동안 요청이 들어오지 않았습니다."); + TRAFFIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 기간 동안 요청이 들어오지 않았습니다."), + UNKNOWN_NOT_FOUND(HttpStatus.NOT_FOUND, "알 수 없음 계정이 존재하지 않습니다."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/com/example/Devkor_project/repository/ProfileRepository.java b/src/main/java/com/example/Devkor_project/repository/ProfileRepository.java index 1efd9d2..224b402 100644 --- a/src/main/java/com/example/Devkor_project/repository/ProfileRepository.java +++ b/src/main/java/com/example/Devkor_project/repository/ProfileRepository.java @@ -1,7 +1,9 @@ package com.example.Devkor_project.repository; import com.example.Devkor_project.entity.Profile; +import io.lettuce.core.dynamic.annotation.Param; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.Optional; @@ -9,4 +11,7 @@ public interface ProfileRepository extends JpaRepository { Optional findByEmail(String email); Optional findByUsername(String username); + + @Query(value = "SELECT * FROM profile WHERE profile_id = 0 AND username = '알 수 없음'", nativeQuery = true) + Optional getUnknownProfile(); } diff --git a/src/main/java/com/example/Devkor_project/service/AdminService.java b/src/main/java/com/example/Devkor_project/service/AdminService.java index 2f10cd9..89da76a 100644 --- a/src/main/java/com/example/Devkor_project/service/AdminService.java +++ b/src/main/java/com/example/Devkor_project/service/AdminService.java @@ -1,9 +1,6 @@ package com.example.Devkor_project.service; -import com.example.Devkor_project.dto.CommentDto; -import com.example.Devkor_project.dto.CourseDto; -import com.example.Devkor_project.dto.CrawlingDto; -import com.example.Devkor_project.dto.TrafficDto; +import com.example.Devkor_project.dto.*; import com.example.Devkor_project.entity.*; import com.example.Devkor_project.exception.AppException; import com.example.Devkor_project.exception.ErrorCode; @@ -11,30 +8,37 @@ import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.transaction.Transactional; import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.http.MediaType; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; import java.security.Principal; +import java.time.LocalDate; import java.util.*; @Service +@RequiredArgsConstructor @Slf4j public class AdminService { - @Autowired CourseRepository courseRepository; - @Autowired CourseRatingRepository courseRatingRepository; - @Autowired CommentRepository commentRepository; - @Autowired CommentReportRepository commentReportRepository; - @Autowired TrafficRepository trafficRepository; + private final BCryptPasswordEncoder encoder; - @Autowired CourseService courseService; + private final CourseRepository courseRepository; + private final CourseRatingRepository courseRatingRepository; + private final CommentRepository commentRepository; + private final CommentReportRepository commentReportRepository; + private final ProfileRepository profileRepository; + private final TrafficRepository trafficRepository; + + private final CourseService courseService; /* 강의 정보 동기화 서비스 */ @Transactional @@ -366,4 +370,33 @@ public List trafficYearly(String year) return data; } + + /* 테스트 계정 생성 서비스 */ + @Transactional + public void createTestAccount(ProfileDto.CreateTestAccount dto) + { + // 이메일 중복 체크 + profileRepository.findByEmail(dto.getEmail()) + .ifPresent(user -> { + throw new AppException(ErrorCode.EMAIL_DUPLICATED, dto.getEmail()); + }); + + // Profile 엔티티 생성 + Profile profile = Profile.builder() + .email(dto.getEmail()) + .password(encoder.encode(dto.getPassword())) + .username("테스트") + .student_id("0000000") + .degree("MASTER") + .semester(1) + .department("컴퓨터학과") + .role("ROLE_ADMIN") + .point(10000000) + .access_expiration_date(LocalDate.now().plusYears(100)) + .created_at(LocalDate.now()) + .build(); + + // 해당 엔티티를 데이터베이스에 저장 + profileRepository.save(profile); + } } diff --git a/src/main/java/com/example/Devkor_project/service/CourseService.java b/src/main/java/com/example/Devkor_project/service/CourseService.java index d7b4081..812f835 100644 --- a/src/main/java/com/example/Devkor_project/service/CourseService.java +++ b/src/main/java/com/example/Devkor_project/service/CourseService.java @@ -7,6 +7,7 @@ import com.example.Devkor_project.exception.ErrorCode; import com.example.Devkor_project.repository.*; import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -19,17 +20,18 @@ import java.util.*; @Service +@RequiredArgsConstructor @Slf4j public class CourseService { - @Autowired ProfileRepository profileRepository; - @Autowired CourseRepository courseRepository; - @Autowired CourseRatingRepository courseRatingRepository; - @Autowired BookmarkRepository bookmarkRepository; - @Autowired CommentRepository commentRepository; - @Autowired CommentRatingRepository commentRatingRepository; - @Autowired CommentLikeRepository commentLikeRepository; - @Autowired CommentReportRepository commentReportRepository; + private final ProfileRepository profileRepository; + private final CourseRepository courseRepository; + private final CourseRatingRepository courseRatingRepository; + private final BookmarkRepository bookmarkRepository; + private final CommentRepository commentRepository; + private final CommentRatingRepository commentRatingRepository; + private final CommentLikeRepository commentLikeRepository; + private final CommentReportRepository commentReportRepository; /* 강의 검색 서비스 */ public List searchCourse(String keyword, String order, int page, Principal principal) @@ -329,6 +331,10 @@ public void insertComment(Principal principal, CommentDto.Insert dto) if(dto.getReview().length() < 50) throw new AppException(ErrorCode.SHORT_COMMENT_REVIEW, dto.getReview().length()); + // 강의평 상세 내용이 3000자 이하인지 확인 + if(dto.getReview().length() > 3000) + throw new AppException(ErrorCode.LONG_COMMENT_REVIEW, dto.getReview().length()); + // 새로운 강의평 평점 엔티티 생성 후, 저장 CommentRating newCommentRating = CommentRating.builder() .rating(dto.getRating()) @@ -464,6 +470,10 @@ public Long updateComment(Principal principal, CommentDto.Update dto) if(dto.getReview().length() < 50) throw new AppException(ErrorCode.SHORT_COMMENT_REVIEW, dto.getReview().length()); + // 강의평 상세 내용이 3000자 이하인지 확인 + if(dto.getReview().length() > 3000) + throw new AppException(ErrorCode.LONG_COMMENT_REVIEW, dto.getReview().length()); + // 강의 엔티티의 강의평 개수 int count = course.getCOUNT_comments(); @@ -539,18 +549,18 @@ else if(!dto.isLearn_t4_industry() && commentRating.isLearn_t4_industry()) @Transactional public Long deleteComment(Principal principal, CommentDto.Delete dto) { - // 강의평 작성 수정 요청을 보낸 사용자의 계정 이메일 + // 강의평 작성 삭제 요청을 보낸 사용자의 계정 이메일 String email = principal.getName(); - // 강의평 작성 수정 요청을 보낸 사용자의 계정이 존재하지 않으면 예외 처리 + // 강의평 작성 삭제 요청을 보낸 사용자의 계정이 존재하지 않으면 예외 처리 Profile profile = profileRepository.findByEmail(email) .orElseThrow(() -> new AppException(ErrorCode.EMAIL_NOT_FOUND, email)); - // 사용자가 삭제할 강의평이 존재하지 않으면 예외 처리 + // 삭제할 강의평이 존재하지 않으면 예외 처리 Comment comment = commentRepository.findById(dto.getComment_id()) .orElseThrow(() -> new AppException(ErrorCode.COMMENT_NOT_FOUND, dto.getComment_id())); - // 사용자가 강의평을 삭제할 강의가 존재하지 않으면 예외 처리 + // 삭제할 강의평이 작성된 강의가 존재하지 않으면 예외 처리 Course course = courseRepository.findById(comment.getCourse_id().getCourse_id()) .orElseThrow(() -> new AppException(ErrorCode.COURSE_NOT_FOUND, comment.getCourse_id().getCourse_id())); diff --git a/src/main/java/com/example/Devkor_project/service/LoginService.java b/src/main/java/com/example/Devkor_project/service/LoginService.java index b3b8a48..cf08ae9 100644 --- a/src/main/java/com/example/Devkor_project/service/LoginService.java +++ b/src/main/java/com/example/Devkor_project/service/LoginService.java @@ -13,6 +13,7 @@ import jakarta.mail.internet.MimeMessage; import jakarta.servlet.http.HttpServletRequest; import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; @@ -29,16 +30,17 @@ import java.util.Random; @Service +@RequiredArgsConstructor @Slf4j public class LoginService { - @Autowired ProfileRepository profileRepository; - @Autowired CodeRepository codeRepository; - @Autowired BCryptPasswordEncoder encoder; - @Autowired JavaMailSender javaMailSender; - @Autowired JwtUtil jwtUtil; - @Autowired CustomUserDetailsService customUserDetailService; - @Autowired RedisTemplate redisTemplate; + private final ProfileRepository profileRepository; + private final CodeRepository codeRepository; + private final BCryptPasswordEncoder encoder; + private final JavaMailSender javaMailSender; + private final JwtUtil jwtUtil; + private final CustomUserDetailsService customUserDetailService; + private final RedisTemplate redisTemplate; /* 회원가입 서비스 */ @Transactional diff --git a/src/main/java/com/example/Devkor_project/service/MyPageService.java b/src/main/java/com/example/Devkor_project/service/MyPageService.java index 46d4787..9be185e 100644 --- a/src/main/java/com/example/Devkor_project/service/MyPageService.java +++ b/src/main/java/com/example/Devkor_project/service/MyPageService.java @@ -6,10 +6,9 @@ import com.example.Devkor_project.entity.*; import com.example.Devkor_project.exception.AppException; import com.example.Devkor_project.exception.ErrorCode; -import com.example.Devkor_project.repository.BookmarkRepository; -import com.example.Devkor_project.repository.CommentRepository; -import com.example.Devkor_project.repository.ProfileRepository; +import com.example.Devkor_project.repository.*; import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -23,13 +22,16 @@ import java.util.Objects; @Service +@RequiredArgsConstructor public class MyPageService { - @Autowired ProfileRepository profileRepository; - @Autowired BookmarkRepository bookmarkRepository; - @Autowired CommentRepository commentRepository; - @Autowired CourseService courseService; - @Autowired BCryptPasswordEncoder encoder; + private final ProfileRepository profileRepository; + private final BookmarkRepository bookmarkRepository; + private final CourseRepository courseRepository; + private final CommentRepository commentRepository; + private final CourseRatingRepository courseRatingRepository; + private final CommentRatingRepository commentRatingRepository; + private final BCryptPasswordEncoder encoder; /* 마이페이지 기본 정보 서비스 */ public ProfileDto.MyPage myPageInfo(Principal principal) @@ -318,15 +320,18 @@ public void deleteProfile(ProfileDto.Delete dto, Principal principal) // 해당 사용자의 모든 강의평 조회 List comments = commentRepository.findAllByProfileId(profile.getProfile_id()); - // 해당 사용자의 모든 강의평 삭제 + // 알 수 없음 사용자 계정 + Profile unknownProfile = profileRepository.getUnknownProfile() + .orElseThrow(() -> new AppException(ErrorCode.UNKNOWN_NOT_FOUND, null)); + + // 해당 사용자의 모든 강의평 작성자 수정 comments.forEach(comment -> { - // Comment 엔티티 -> CommentDto.Delete 변환 - CommentDto.Delete commentDto = CommentDto.Delete.builder() - .comment_id(comment.getComment_id()) - .build(); + // 해당 강의평이 해당 사용자가 작성한 강의평이 아니라면, 예외 처리 + if(!Objects.equals(comment.getProfile_id().getProfile_id(), profile.getProfile_id())) + throw new AppException(ErrorCode.NOT_COMMENT_BY_USER, comment.getProfile_id().getProfile_id()); - courseService.deleteComment(principal, commentDto); + comment.setProfile_id(unknownProfile); }); diff --git a/src/main/java/com/example/Devkor_project/service/SchedulerService.java b/src/main/java/com/example/Devkor_project/service/SchedulerService.java index 7e80efa..1268858 100644 --- a/src/main/java/com/example/Devkor_project/service/SchedulerService.java +++ b/src/main/java/com/example/Devkor_project/service/SchedulerService.java @@ -19,8 +19,7 @@ @RequiredArgsConstructor public class SchedulerService { - @Autowired - private CodeRepository codeRepository; + private final CodeRepository codeRepository; @Transactional @Async diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c9d60e3..04a0540 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,5 +1,5 @@ academ: - version: "v1.1.2" + version: "v1.1.3" spring: