From 3a52e73dcc919ff334312edf7885d5a1dd047b9e Mon Sep 17 00:00:00 2001 From: YunJaeHoon Date: Sun, 24 Nov 2024 16:40:52 +0900 Subject: [PATCH 1/5] =?UTF-8?q?FIX:=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AdminController.java | 6 ++++-- .../controller/CourseController.java | 6 ++++-- .../controller/LoginController.java | 6 ++++-- .../controller/MyPageController.java | 6 ++++-- .../controller/VersionController.java | 10 +++------- .../Devkor_project/service/AdminService.java | 14 ++++++++------ .../Devkor_project/service/CourseService.java | 18 ++++++++++-------- .../Devkor_project/service/LoginService.java | 16 +++++++++------- .../Devkor_project/service/MyPageService.java | 12 +++++++----- .../service/SchedulerService.java | 3 +-- 10 files changed, 54 insertions(+), 43 deletions(-) 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..39a1f3a 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") 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..97cb702 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") 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..0f8a931 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") 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/service/AdminService.java b/src/main/java/com/example/Devkor_project/service/AdminService.java index 2f10cd9..9be55d5 100644 --- a/src/main/java/com/example/Devkor_project/service/AdminService.java +++ b/src/main/java/com/example/Devkor_project/service/AdminService.java @@ -11,6 +11,7 @@ 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; @@ -25,16 +26,17 @@ 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 CourseRepository courseRepository; + private final CourseRatingRepository courseRatingRepository; + private final CommentRepository commentRepository; + private final CommentReportRepository commentReportRepository; + private final TrafficRepository trafficRepository; - @Autowired CourseService courseService; + private final CourseService courseService; /* 강의 정보 동기화 서비스 */ @Transactional 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..04b21dd 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) 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..c52c7f0 100644 --- a/src/main/java/com/example/Devkor_project/service/MyPageService.java +++ b/src/main/java/com/example/Devkor_project/service/MyPageService.java @@ -10,6 +10,7 @@ import com.example.Devkor_project.repository.CommentRepository; import com.example.Devkor_project.repository.ProfileRepository; 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 +24,14 @@ 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 CommentRepository commentRepository; + private final CourseService courseService; + private final BCryptPasswordEncoder encoder; /* 마이페이지 기본 정보 서비스 */ public ProfileDto.MyPage myPageInfo(Principal principal) 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 From f83528c926a6a4723a13ffd23f4fe1d3655a0c59 Mon Sep 17 00:00:00 2001 From: YunJaeHoon Date: Sun, 24 Nov 2024 17:16:26 +0900 Subject: [PATCH 2/5] =?UTF-8?q?FIX:=20=EA=B0=95=EC=9D=98=ED=8F=89=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1,=20=EC=88=98=EC=A0=95=20=EC=8B=9C=EC=97=90?= =?UTF-8?q?=20=EA=B0=95=EC=9D=98=ED=8F=89=20=EC=84=B8=EB=B6=80=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EA=B8=B8=EC=9D=B4=EA=B0=80=203000=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=ED=95=98=EC=9D=B8=EC=A7=80=20=ED=99=95=EC=9D=B8?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Devkor_project/controller/CourseController.java | 2 ++ .../com/example/Devkor_project/exception/ErrorCode.java | 1 + .../com/example/Devkor_project/service/CourseService.java | 8 ++++++++ 3 files changed, 11 insertions(+) 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 97cb702..279b0ac 100644 --- a/src/main/java/com/example/Devkor_project/controller/CourseController.java +++ b/src/main/java/com/example/Devkor_project/controller/CourseController.java @@ -190,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))), @@ -249,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/exception/ErrorCode.java b/src/main/java/com/example/Devkor_project/exception/ErrorCode.java index 4af70d1..b3c3f56 100644 --- a/src/main/java/com/example/Devkor_project/exception/ErrorCode.java +++ b/src/main/java/com/example/Devkor_project/exception/ErrorCode.java @@ -33,6 +33,7 @@ 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, "해당 아이템은 유효하지 않습니다."), 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 04b21dd..cda826e 100644 --- a/src/main/java/com/example/Devkor_project/service/CourseService.java +++ b/src/main/java/com/example/Devkor_project/service/CourseService.java @@ -331,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()) @@ -466,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(); From 56aefa2382e25c1933476aa2f747a67b5e883012 Mon Sep 17 00:00:00 2001 From: YunJaeHoon Date: Sun, 24 Nov 2024 18:00:49 +0900 Subject: [PATCH 3/5] =?UTF-8?q?FTR:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B3=84=EC=A0=95=20=EC=83=9D=EC=84=B1=20api=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AdminController.java | 23 +++++++++++ .../Devkor_project/dto/ProfileDto.java | 15 +++++++ .../Devkor_project/service/AdminService.java | 39 +++++++++++++++++-- 3 files changed, 73 insertions(+), 4 deletions(-) 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 39a1f3a..f7c4fd3 100644 --- a/src/main/java/com/example/Devkor_project/controller/AdminController.java +++ b/src/main/java/com/example/Devkor_project/controller/AdminController.java @@ -184,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/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/service/AdminService.java b/src/main/java/com/example/Devkor_project/service/AdminService.java index 9be55d5..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; @@ -18,11 +15,13 @@ 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 @@ -30,10 +29,13 @@ @Slf4j public class AdminService { + private final BCryptPasswordEncoder encoder; + 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; @@ -368,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); + } } From feb69dfde03b17043db8cf1a4ac1473910a4385e Mon Sep 17 00:00:00 2001 From: YunJaeHoon Date: Sun, 24 Nov 2024 18:38:02 +0900 Subject: [PATCH 4/5] =?UTF-8?q?FIX:=20=ED=9A=8C=EC=9B=90=20=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=EC=8B=9C,=20=ED=95=B4=EB=8B=B9=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=EA=B0=80=20=EC=9E=91=EC=84=B1=ED=95=9C=20?= =?UTF-8?q?=EA=B0=95=EC=9D=98=ED=8F=89=EB=93=A4=EC=9D=98=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=EC=9E=90=EA=B0=80=20=EC=95=8C=20=EC=88=98=20=EC=97=86?= =?UTF-8?q?=EC=9D=8C=20=EA=B3=84=EC=A0=95=EC=9C=BC=EB=A1=9C=20=EB=B0=94?= =?UTF-8?q?=EB=80=8C=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MyPageController.java | 3 +-- .../Devkor_project/exception/ErrorCode.java | 3 ++- .../repository/ProfileRepository.java | 5 +++++ .../Devkor_project/service/CourseService.java | 8 +++---- .../Devkor_project/service/MyPageService.java | 21 +++++++++++-------- 5 files changed, 24 insertions(+), 16 deletions(-) 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 0f8a931..8951fc2 100644 --- a/src/main/java/com/example/Devkor_project/controller/MyPageController.java +++ b/src/main/java/com/example/Devkor_project/controller/MyPageController.java @@ -254,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/exception/ErrorCode.java b/src/main/java/com/example/Devkor_project/exception/ErrorCode.java index b3c3f56..f24c171 100644 --- a/src/main/java/com/example/Devkor_project/exception/ErrorCode.java +++ b/src/main/java/com/example/Devkor_project/exception/ErrorCode.java @@ -39,7 +39,8 @@ public enum ErrorCode 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/CourseService.java b/src/main/java/com/example/Devkor_project/service/CourseService.java index cda826e..812f835 100644 --- a/src/main/java/com/example/Devkor_project/service/CourseService.java +++ b/src/main/java/com/example/Devkor_project/service/CourseService.java @@ -549,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/MyPageService.java b/src/main/java/com/example/Devkor_project/service/MyPageService.java index c52c7f0..9484505 100644 --- a/src/main/java/com/example/Devkor_project/service/MyPageService.java +++ b/src/main/java/com/example/Devkor_project/service/MyPageService.java @@ -6,9 +6,7 @@ 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; @@ -29,8 +27,10 @@ public class MyPageService { private final ProfileRepository profileRepository; private final BookmarkRepository bookmarkRepository; + private final CourseRepository courseRepository; private final CommentRepository commentRepository; - private final CourseService courseService; + private final CourseRatingRepository courseRatingRepository; + private final CommentRatingRepository commentRatingRepository; private final BCryptPasswordEncoder encoder; /* 마이페이지 기본 정보 서비스 */ @@ -320,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); }); From 81ac9f956d54076a281add0e21f1e92650d041fc Mon Sep 17 00:00:00 2001 From: YunJaeHoon Date: Tue, 26 Nov 2024 15:10:13 +0900 Subject: [PATCH 5/5] VER: v1.1.3 --- README.md | 2 +- .../java/com/example/Devkor_project/service/MyPageService.java | 2 +- src/main/resources/application.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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/service/MyPageService.java b/src/main/java/com/example/Devkor_project/service/MyPageService.java index 9484505..9be185e 100644 --- a/src/main/java/com/example/Devkor_project/service/MyPageService.java +++ b/src/main/java/com/example/Devkor_project/service/MyPageService.java @@ -324,7 +324,7 @@ public void deleteProfile(ProfileDto.Delete dto, Principal principal) Profile unknownProfile = profileRepository.getUnknownProfile() .orElseThrow(() -> new AppException(ErrorCode.UNKNOWN_NOT_FOUND, null)); - // 해당 사용자의 모든 강의평 삭제 + // 해당 사용자의 모든 강의평 작성자 수정 comments.forEach(comment -> { // 해당 강의평이 해당 사용자가 작성한 강의평이 아니라면, 예외 처리 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: