diff --git a/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java b/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java index 6d8c45fbf..892597e90 100644 --- a/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java +++ b/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java @@ -19,7 +19,7 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor -@RequestMapping("/application") +@RequestMapping("/applications") @RestController public class ApplicationController { @@ -27,7 +27,7 @@ public class ApplicationController { private final ApplicationQueryService applicationQueryService; // 지원서 제출하기 api - @PostMapping() + @PostMapping public ResponseEntity apply( @AuthorizedUser SiteUser siteUser, @Valid @RequestBody ApplyRequest applyRequest diff --git a/src/main/java/com/example/solidconnection/community/board/controller/BoardController.java b/src/main/java/com/example/solidconnection/community/board/controller/BoardController.java index 9329535a1..40410bdbe 100644 --- a/src/main/java/com/example/solidconnection/community/board/controller/BoardController.java +++ b/src/main/java/com/example/solidconnection/community/board/controller/BoardController.java @@ -1,10 +1,14 @@ package com.example.solidconnection.community.board.controller; +import com.example.solidconnection.community.post.dto.PostListResponse; +import com.example.solidconnection.community.post.service.PostQueryService; import com.example.solidconnection.type.BoardCode; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; @@ -12,11 +16,13 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/communities") +@RequestMapping("/boards") public class BoardController { + private final PostQueryService postQueryService; + // todo: 회원별로 접근 가능한 게시판 목록 조회 기능 개발 - @GetMapping() + @GetMapping public ResponseEntity findAccessibleCodes() { List accessibleCodeList = new ArrayList<>(); for (BoardCode boardCode : BoardCode.values()) { @@ -24,4 +30,13 @@ public ResponseEntity findAccessibleCodes() { } return ResponseEntity.ok().body(accessibleCodeList); } + + @GetMapping("/{code}") + public ResponseEntity findPostsByCodeAndCategory( + @PathVariable(value = "code") String code, + @RequestParam(value = "category", defaultValue = "전체") String category) { + List postsByCodeAndPostCategory = postQueryService + .findPostsByCodeAndPostCategory(code, category); + return ResponseEntity.ok().body(postsByCodeAndPostCategory); + } } diff --git a/src/main/java/com/example/solidconnection/community/comment/controller/CommentController.java b/src/main/java/com/example/solidconnection/community/comment/controller/CommentController.java index e215fea72..d096f6cc9 100644 --- a/src/main/java/com/example/solidconnection/community/comment/controller/CommentController.java +++ b/src/main/java/com/example/solidconnection/community/comment/controller/CommentController.java @@ -21,39 +21,36 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/posts") +@RequestMapping("/comments") public class CommentController { private final CommentService commentService; - @PostMapping("/{post_id}/comments") + @PostMapping public ResponseEntity createComment( @AuthorizedUser SiteUser siteUser, - @PathVariable("post_id") Long postId, @Valid @RequestBody CommentCreateRequest commentCreateRequest ) { - CommentCreateResponse response = commentService.createComment(siteUser, postId, commentCreateRequest); + CommentCreateResponse response = commentService.createComment(siteUser, commentCreateRequest); return ResponseEntity.ok().body(response); } - @PatchMapping("/{post_id}/comments/{comment_id}") + @PatchMapping("/{comment_id}") public ResponseEntity updateComment( @AuthorizedUser SiteUser siteUser, - @PathVariable("post_id") Long postId, @PathVariable("comment_id") Long commentId, @Valid @RequestBody CommentUpdateRequest commentUpdateRequest ) { - CommentUpdateResponse response = commentService.updateComment(siteUser, postId, commentId, commentUpdateRequest); + CommentUpdateResponse response = commentService.updateComment(siteUser, commentId, commentUpdateRequest); return ResponseEntity.ok().body(response); } - @DeleteMapping("/{post_id}/comments/{comment_id}") + @DeleteMapping("/{comment_id}") public ResponseEntity deleteCommentById( @AuthorizedUser SiteUser siteUser, - @PathVariable("post_id") Long postId, @PathVariable("comment_id") Long commentId ) { - CommentDeleteResponse response = commentService.deleteCommentById(siteUser, postId, commentId); + CommentDeleteResponse response = commentService.deleteCommentById(siteUser, commentId); return ResponseEntity.ok().body(response); } } diff --git a/src/main/java/com/example/solidconnection/community/comment/dto/CommentCreateRequest.java b/src/main/java/com/example/solidconnection/community/comment/dto/CommentCreateRequest.java index 610f602c8..13c512a0c 100644 --- a/src/main/java/com/example/solidconnection/community/comment/dto/CommentCreateRequest.java +++ b/src/main/java/com/example/solidconnection/community/comment/dto/CommentCreateRequest.java @@ -4,9 +4,13 @@ import com.example.solidconnection.community.post.domain.Post; import com.example.solidconnection.siteuser.domain.SiteUser; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; public record CommentCreateRequest( + @NotNull(message = "게시글 ID를 설정해주세요.") + Long postId, + @NotBlank(message = "댓글 내용은 빈 값일 수 없습니다.") @Size(min = 1, max = 255, message = "댓글 내용은 최소 1자 이상, 최대 255자 이하여야 합니다.") String content, diff --git a/src/main/java/com/example/solidconnection/community/comment/service/CommentService.java b/src/main/java/com/example/solidconnection/community/comment/service/CommentService.java index 209dd6987..76138b356 100644 --- a/src/main/java/com/example/solidconnection/community/comment/service/CommentService.java +++ b/src/main/java/com/example/solidconnection/community/comment/service/CommentService.java @@ -8,10 +8,11 @@ import com.example.solidconnection.community.comment.dto.CommentUpdateResponse; import com.example.solidconnection.community.comment.dto.PostFindCommentResponse; import com.example.solidconnection.community.comment.repository.CommentRepository; -import com.example.solidconnection.custom.exception.CustomException; import com.example.solidconnection.community.post.domain.Post; import com.example.solidconnection.community.post.repository.PostRepository; +import com.example.solidconnection.custom.exception.CustomException; import com.example.solidconnection.siteuser.domain.SiteUser; +import com.example.solidconnection.siteuser.repository.SiteUserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,6 +23,7 @@ import static com.example.solidconnection.custom.exception.ErrorCode.CAN_NOT_UPDATE_DEPRECATED_COMMENT; import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_COMMENT_LEVEL; import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_POST_ACCESS; +import static com.example.solidconnection.custom.exception.ErrorCode.USER_NOT_FOUND; @Service @RequiredArgsConstructor @@ -29,6 +31,7 @@ public class CommentService { private final CommentRepository commentRepository; private final PostRepository postRepository; + private final SiteUserRepository siteUserRepository; @Transactional(readOnly = true) public List findCommentsByPostId(SiteUser siteUser, Long postId) { @@ -43,15 +46,23 @@ private Boolean isOwner(Comment comment, SiteUser siteUser) { } @Transactional - public CommentCreateResponse createComment(SiteUser siteUser, Long postId, CommentCreateRequest commentCreateRequest) { - Post post = postRepository.getById(postId); + public CommentCreateResponse createComment(SiteUser siteUser, CommentCreateRequest commentCreateRequest) { + Post post = postRepository.getById(commentCreateRequest.postId()); Comment parentComment = null; if (commentCreateRequest.parentId() != null) { parentComment = commentRepository.getById(commentCreateRequest.parentId()); validateCommentDepth(parentComment); } - Comment createdComment = commentRepository.save(commentCreateRequest.toEntity(siteUser, post, parentComment)); + + /* + * todo: siteUser를 영속 상태로 만들 수 있도록 컨트롤러에서 siteUserId 를 넘겨줄 것인지, + * siteUser 에 postList 를 FetchType.EAGER 로 설정할 것인지, + * post 와 siteUser 사이의 양방향을 끊을 것인지 생각해봐야한다. + */ + SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + Comment comment = commentCreateRequest.toEntity(siteUser1, post, parentComment); + Comment createdComment = commentRepository.save(comment); return CommentCreateResponse.from(createdComment); } @@ -64,8 +75,7 @@ private void validateCommentDepth(Comment parentComment) { } @Transactional - public CommentUpdateResponse updateComment(SiteUser siteUser, Long postId, Long commentId, CommentUpdateRequest commentUpdateRequest) { - Post post = postRepository.getById(postId); + public CommentUpdateResponse updateComment(SiteUser siteUser, Long commentId, CommentUpdateRequest commentUpdateRequest) { Comment comment = commentRepository.getById(commentId); validateDeprecated(comment); validateOwnership(comment, siteUser); @@ -82,8 +92,7 @@ private void validateDeprecated(Comment comment) { } @Transactional - public CommentDeleteResponse deleteCommentById(SiteUser siteUser, Long postId, Long commentId) { - Post post = postRepository.getById(postId); + public CommentDeleteResponse deleteCommentById(SiteUser siteUser, Long commentId) { Comment comment = commentRepository.getById(commentId); validateOwnership(comment, siteUser); diff --git a/src/main/java/com/example/solidconnection/community/post/controller/PostController.java b/src/main/java/com/example/solidconnection/community/post/controller/PostController.java index a2479f08b..ee422930a 100644 --- a/src/main/java/com/example/solidconnection/community/post/controller/PostController.java +++ b/src/main/java/com/example/solidconnection/community/post/controller/PostController.java @@ -1,7 +1,5 @@ package com.example.solidconnection.community.post.controller; -import com.example.solidconnection.community.post.dto.PostListResponse; -import com.example.solidconnection.custom.resolver.AuthorizedUser; import com.example.solidconnection.community.post.dto.PostCreateRequest; import com.example.solidconnection.community.post.dto.PostCreateResponse; import com.example.solidconnection.community.post.dto.PostDeleteResponse; @@ -13,6 +11,7 @@ import com.example.solidconnection.community.post.service.PostCommandService; import com.example.solidconnection.community.post.service.PostLikeService; import com.example.solidconnection.community.post.service.PostQueryService; +import com.example.solidconnection.custom.resolver.AuthorizedUser; import com.example.solidconnection.siteuser.domain.SiteUser; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -33,41 +32,29 @@ @RestController @RequiredArgsConstructor -@RequestMapping("/communities") +@RequestMapping("/posts") public class PostController { private final PostQueryService postQueryService; private final PostCommandService postCommandService; private final PostLikeService postLikeService; - @GetMapping("/{code}") - public ResponseEntity findPostsByCodeAndCategory( - @PathVariable(value = "code") String code, - @RequestParam(value = "category", defaultValue = "전체") String category) { - - List postsByCodeAndPostCategory = postQueryService - .findPostsByCodeAndPostCategory(code, category); - return ResponseEntity.ok().body(postsByCodeAndPostCategory); - } - - @PostMapping(value = "/{code}/posts") + @PostMapping public ResponseEntity createPost( @AuthorizedUser SiteUser siteUser, - @PathVariable("code") String code, @Valid @RequestPart("postCreateRequest") PostCreateRequest postCreateRequest, @RequestParam(value = "file", required = false) List imageFile ) { if (imageFile == null) { imageFile = Collections.emptyList(); } - PostCreateResponse post = postCommandService.createPost(siteUser, code, postCreateRequest, imageFile); + PostCreateResponse post = postCommandService.createPost(siteUser, postCreateRequest, imageFile); return ResponseEntity.ok().body(post); } - @PatchMapping(value = "/{code}/posts/{post_id}") + @PatchMapping(value = "/{post_id}") public ResponseEntity updatePost( @AuthorizedUser SiteUser siteUser, - @PathVariable("code") String code, @PathVariable("post_id") Long postId, @Valid @RequestPart("postUpdateRequest") PostUpdateRequest postUpdateRequest, @RequestParam(value = "file", required = false) List imageFile @@ -76,48 +63,44 @@ public ResponseEntity updatePost( imageFile = Collections.emptyList(); } PostUpdateResponse postUpdateResponse = postCommandService.updatePost( - siteUser, code, postId, postUpdateRequest, imageFile + siteUser, postId, postUpdateRequest, imageFile ); return ResponseEntity.ok().body(postUpdateResponse); } - @GetMapping("/{code}/posts/{post_id}") + @GetMapping("/{post_id}") public ResponseEntity findPostById( @AuthorizedUser SiteUser siteUser, - @PathVariable("code") String code, @PathVariable("post_id") Long postId ) { - PostFindResponse postFindResponse = postQueryService.findPostById(siteUser, code, postId); + PostFindResponse postFindResponse = postQueryService.findPostById(siteUser, postId); return ResponseEntity.ok().body(postFindResponse); } - @DeleteMapping(value = "/{code}/posts/{post_id}") + @DeleteMapping(value = "/{post_id}") public ResponseEntity deletePostById( @AuthorizedUser SiteUser siteUser, - @PathVariable("code") String code, @PathVariable("post_id") Long postId ) { - PostDeleteResponse postDeleteResponse = postCommandService.deletePostById(siteUser, code, postId); + PostDeleteResponse postDeleteResponse = postCommandService.deletePostById(siteUser, postId); return ResponseEntity.ok().body(postDeleteResponse); } - @PostMapping(value = "/{code}/posts/{post_id}/like") + @PostMapping(value = "/{post_id}/like") public ResponseEntity likePost( @AuthorizedUser SiteUser siteUser, - @PathVariable("code") String code, @PathVariable("post_id") Long postId ) { - PostLikeResponse postLikeResponse = postLikeService.likePost(siteUser, code, postId); + PostLikeResponse postLikeResponse = postLikeService.likePost(siteUser, postId); return ResponseEntity.ok().body(postLikeResponse); } - @DeleteMapping(value = "/{code}/posts/{post_id}/like") + @DeleteMapping(value = "/{post_id}/like") public ResponseEntity dislikePost( @AuthorizedUser SiteUser siteUser, - @PathVariable("code") String code, @PathVariable("post_id") Long postId ) { - PostDislikeResponse postDislikeResponse = postLikeService.dislikePost(siteUser, code, postId); + PostDislikeResponse postDislikeResponse = postLikeService.dislikePost(siteUser, postId); return ResponseEntity.ok().body(postDislikeResponse); } } diff --git a/src/main/java/com/example/solidconnection/community/post/dto/PostCreateRequest.java b/src/main/java/com/example/solidconnection/community/post/dto/PostCreateRequest.java index db271a80f..5e6590b20 100644 --- a/src/main/java/com/example/solidconnection/community/post/dto/PostCreateRequest.java +++ b/src/main/java/com/example/solidconnection/community/post/dto/PostCreateRequest.java @@ -9,6 +9,9 @@ import jakarta.validation.constraints.Size; public record PostCreateRequest( + @NotNull(message = "게시글 카테고리를 설정해주세요.") + String boardCode, + @NotNull(message = "게시글 카테고리를 설정해주세요.") String postCategory, diff --git a/src/main/java/com/example/solidconnection/community/post/service/PostCommandService.java b/src/main/java/com/example/solidconnection/community/post/service/PostCommandService.java index 1e66b52a4..b95cbcf1b 100644 --- a/src/main/java/com/example/solidconnection/community/post/service/PostCommandService.java +++ b/src/main/java/com/example/solidconnection/community/post/service/PostCommandService.java @@ -2,20 +2,20 @@ import com.example.solidconnection.community.board.domain.Board; import com.example.solidconnection.community.board.repository.BoardRepository; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.community.post.domain.PostImage; import com.example.solidconnection.community.post.domain.Post; +import com.example.solidconnection.community.post.domain.PostImage; import com.example.solidconnection.community.post.dto.PostCreateRequest; import com.example.solidconnection.community.post.dto.PostCreateResponse; import com.example.solidconnection.community.post.dto.PostDeleteResponse; import com.example.solidconnection.community.post.dto.PostUpdateRequest; import com.example.solidconnection.community.post.dto.PostUpdateResponse; import com.example.solidconnection.community.post.repository.PostRepository; +import com.example.solidconnection.custom.exception.CustomException; import com.example.solidconnection.s3.S3Service; import com.example.solidconnection.s3.UploadedFileUrlResponse; import com.example.solidconnection.service.RedisService; import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.type.BoardCode; +import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.type.ImgType; import com.example.solidconnection.type.PostCategory; import com.example.solidconnection.util.RedisUtils; @@ -29,9 +29,9 @@ import static com.example.solidconnection.custom.exception.ErrorCode.CAN_NOT_DELETE_OR_UPDATE_QUESTION; import static com.example.solidconnection.custom.exception.ErrorCode.CAN_NOT_UPLOAD_MORE_THAN_FIVE_IMAGES; -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_BOARD_CODE; import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_POST_ACCESS; import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_POST_CATEGORY; +import static com.example.solidconnection.custom.exception.ErrorCode.USER_NOT_FOUND; @Service @RequiredArgsConstructor @@ -42,18 +42,24 @@ public class PostCommandService { private final S3Service s3Service; private final RedisService redisService; private final RedisUtils redisUtils; + private final SiteUserRepository siteUserRepository; @Transactional - public PostCreateResponse createPost(SiteUser siteUser, String code, PostCreateRequest postCreateRequest, + public PostCreateResponse createPost(SiteUser siteUser, PostCreateRequest postCreateRequest, List imageFile) { // 유효성 검증 - String boardCode = validateCode(code); validatePostCategory(postCreateRequest.postCategory()); validateFileSize(imageFile); // 객체 생성 - Board board = boardRepository.getByCode(boardCode); - Post post = postCreateRequest.toEntity(siteUser, board); + Board board = boardRepository.getByCode(postCreateRequest.boardCode()); + /* + * todo: siteUser를 영속 상태로 만들 수 있도록 컨트롤러에서 siteUserId 를 넘겨줄 것인지, + * siteUser 에 postList 를 FetchType.EAGER 로 설정할 것인지, + * post 와 siteUser 사이의 양방향을 끊을 것인지 생각해봐야한다. + */ + SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + Post post = postCreateRequest.toEntity(siteUser1, board); // 이미지 처리 savePostImages(imageFile, post); Post createdPost = postRepository.save(post); @@ -62,10 +68,9 @@ public PostCreateResponse createPost(SiteUser siteUser, String code, PostCreateR } @Transactional - public PostUpdateResponse updatePost(SiteUser siteUser, String code, Long postId, PostUpdateRequest postUpdateRequest, + public PostUpdateResponse updatePost(SiteUser siteUser, Long postId, PostUpdateRequest postUpdateRequest, List imageFile) { // 유효성 검증 - String boardCode = validateCode(code); Post post = postRepository.getById(postId); validateOwnership(post, siteUser); validateQuestion(post); @@ -93,8 +98,7 @@ private void savePostImages(List imageFile, Post post) { } @Transactional - public PostDeleteResponse deletePostById(SiteUser siteUser, String code, Long postId) { - String boardCode = validateCode(code); + public PostDeleteResponse deletePostById(SiteUser siteUser, Long postId) { Post post = postRepository.getById(postId); validateOwnership(post, siteUser); validateQuestion(post); @@ -108,14 +112,6 @@ public PostDeleteResponse deletePostById(SiteUser siteUser, String code, Long po return new PostDeleteResponse(postId); } - private String validateCode(String code) { - try { - return String.valueOf(BoardCode.valueOf(code)); - } catch (IllegalArgumentException ex) { - throw new CustomException(INVALID_BOARD_CODE); - } - } - private void validateOwnership(Post post, SiteUser siteUser) { if (!post.getSiteUser().getId().equals(siteUser.getId())) { throw new CustomException(INVALID_POST_ACCESS); diff --git a/src/main/java/com/example/solidconnection/community/post/service/PostLikeService.java b/src/main/java/com/example/solidconnection/community/post/service/PostLikeService.java index 045c069cd..98d1a239f 100644 --- a/src/main/java/com/example/solidconnection/community/post/service/PostLikeService.java +++ b/src/main/java/com/example/solidconnection/community/post/service/PostLikeService.java @@ -1,21 +1,21 @@ package com.example.solidconnection.community.post.service; -import com.example.solidconnection.custom.exception.CustomException; import com.example.solidconnection.community.post.domain.Post; import com.example.solidconnection.community.post.domain.PostLike; import com.example.solidconnection.community.post.dto.PostDislikeResponse; import com.example.solidconnection.community.post.dto.PostLikeResponse; import com.example.solidconnection.community.post.repository.PostLikeRepository; import com.example.solidconnection.community.post.repository.PostRepository; +import com.example.solidconnection.custom.exception.CustomException; import com.example.solidconnection.siteuser.domain.SiteUser; -import com.example.solidconnection.type.BoardCode; +import com.example.solidconnection.siteuser.repository.SiteUserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import static com.example.solidconnection.custom.exception.ErrorCode.DUPLICATE_POST_LIKE; -import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_BOARD_CODE; +import static com.example.solidconnection.custom.exception.ErrorCode.USER_NOT_FOUND; @Service @RequiredArgsConstructor @@ -23,15 +23,21 @@ public class PostLikeService { private final PostRepository postRepository; private final PostLikeRepository postLikeRepository; + private final SiteUserRepository siteUserRepository; @Transactional(isolation = Isolation.READ_COMMITTED) - public PostLikeResponse likePost(SiteUser siteUser, String code, Long postId) { - String boardCode = validateCode(code); + public PostLikeResponse likePost(SiteUser siteUser, Long postId) { Post post = postRepository.getById(postId); validateDuplicatePostLike(post, siteUser); - PostLike postLike = new PostLike(); - postLike.setPostAndSiteUser(post, siteUser); + + /* + * todo: siteUser를 영속 상태로 만들 수 있도록 컨트롤러에서 siteUserId 를 넘겨줄 것인지, + * siteUser 에 postList 를 FetchType.EAGER 로 설정할 것인지, + * post 와 siteUser 사이의 양방향을 끊을 것인지 생각해봐야한다. + */ + SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + postLike.setPostAndSiteUser(post, siteUser1); postLikeRepository.save(postLike); postRepository.increaseLikeCount(post.getId()); @@ -39,8 +45,7 @@ public PostLikeResponse likePost(SiteUser siteUser, String code, Long postId) { } @Transactional(isolation = Isolation.READ_COMMITTED) - public PostDislikeResponse dislikePost(SiteUser siteUser, String code, Long postId) { - String boardCode = validateCode(code); + public PostDislikeResponse dislikePost(SiteUser siteUser, Long postId) { Post post = postRepository.getById(postId); PostLike postLike = postLikeRepository.getByPostAndSiteUser(post, siteUser); @@ -51,14 +56,6 @@ public PostDislikeResponse dislikePost(SiteUser siteUser, String code, Long post return PostDislikeResponse.from(postRepository.getById(postId)); // 실시간성을 위한 재조회 } - private String validateCode(String code) { - try { - return String.valueOf(BoardCode.valueOf(code)); - } catch (IllegalArgumentException ex) { - throw new CustomException(INVALID_BOARD_CODE); - } - } - private void validateDuplicatePostLike(Post post, SiteUser siteUser) { if (postLikeRepository.findPostLikeByPostAndSiteUser(post, siteUser).isPresent()) { throw new CustomException(DUPLICATE_POST_LIKE); diff --git a/src/main/java/com/example/solidconnection/community/post/service/PostQueryService.java b/src/main/java/com/example/solidconnection/community/post/service/PostQueryService.java index 1d7f292ea..66cbb5faa 100644 --- a/src/main/java/com/example/solidconnection/community/post/service/PostQueryService.java +++ b/src/main/java/com/example/solidconnection/community/post/service/PostQueryService.java @@ -53,9 +53,7 @@ public List findPostsByCodeAndPostCategory(String code, String } @Transactional(readOnly = true) - public PostFindResponse findPostById(SiteUser siteUser, String code, Long postId) { - String boardCode = validateCode(code); - + public PostFindResponse findPostById(SiteUser siteUser, Long postId) { Post post = postRepository.getByIdUsingEntityGraph(postId); Boolean isOwner = getIsOwner(post, siteUser); Boolean isLiked = getIsLiked(post, siteUser); diff --git a/src/main/java/com/example/solidconnection/score/controller/ScoreController.java b/src/main/java/com/example/solidconnection/score/controller/ScoreController.java index 6c54ab5fe..4ea560657 100644 --- a/src/main/java/com/example/solidconnection/score/controller/ScoreController.java +++ b/src/main/java/com/example/solidconnection/score/controller/ScoreController.java @@ -12,39 +12,43 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; @RestController -@RequestMapping("/score") +@RequestMapping("/scores") @RequiredArgsConstructor public class ScoreController { private final ScoreService scoreService; // 학점을 등록하는 api - @PostMapping("/gpa") + @PostMapping("/gpas") public ResponseEntity submitGpaScore( @AuthorizedUser SiteUser siteUser, - @Valid @RequestBody GpaScoreRequest gpaScoreRequest + @Valid @RequestPart("gpaScoreRequest") GpaScoreRequest gpaScoreRequest, + @RequestParam("file") MultipartFile file ) { - Long id = scoreService.submitGpaScore(siteUser, gpaScoreRequest); + Long id = scoreService.submitGpaScore(siteUser, gpaScoreRequest, file); return ResponseEntity.ok(id); } // 어학성적을 등록하는 api - @PostMapping("/languageTest") + @PostMapping("/language-tests") public ResponseEntity submitLanguageTestScore( @AuthorizedUser SiteUser siteUser, - @Valid @RequestBody LanguageTestScoreRequest languageTestScoreRequest + @Valid @RequestPart("languageTestScoreRequest") LanguageTestScoreRequest languageTestScoreRequest, + @RequestParam("file") MultipartFile file ) { - Long id = scoreService.submitLanguageTestScore(siteUser, languageTestScoreRequest); + Long id = scoreService.submitLanguageTestScore(siteUser, languageTestScoreRequest, file); return ResponseEntity.ok(id); } // 학점 상태를 확인하는 api - @GetMapping("/gpa") + @GetMapping("/gpas") public ResponseEntity getGpaScoreStatus( @AuthorizedUser SiteUser siteUser ) { @@ -53,7 +57,7 @@ public ResponseEntity getGpaScoreStatus( } // 어학 성적 상태를 확인하는 api - @GetMapping("/languageTest") + @GetMapping("/language-tests") public ResponseEntity getLanguageTestScoreStatus( @AuthorizedUser SiteUser siteUser ) { diff --git a/src/main/java/com/example/solidconnection/score/dto/GpaScoreRequest.java b/src/main/java/com/example/solidconnection/score/dto/GpaScoreRequest.java index 613ac5b54..beafbf2e3 100644 --- a/src/main/java/com/example/solidconnection/score/dto/GpaScoreRequest.java +++ b/src/main/java/com/example/solidconnection/score/dto/GpaScoreRequest.java @@ -1,7 +1,5 @@ package com.example.solidconnection.score.dto; -import com.example.solidconnection.application.domain.Gpa; -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; public record GpaScoreRequest( @@ -9,15 +7,6 @@ public record GpaScoreRequest( Double gpa, @NotNull(message = "학점 기준을 입력해주세요.") - Double gpaCriteria, - - @NotBlank(message = "대학 성적 증명서를 첨부해주세요.") - String gpaReportUrl) { - - public Gpa toGpa() { - return new Gpa( - this.gpa, - this.gpaCriteria, - this.gpaReportUrl); - } + Double gpaCriteria +) { } diff --git a/src/main/java/com/example/solidconnection/score/dto/LanguageTestScoreRequest.java b/src/main/java/com/example/solidconnection/score/dto/LanguageTestScoreRequest.java index 92522949e..de9329898 100644 --- a/src/main/java/com/example/solidconnection/score/dto/LanguageTestScoreRequest.java +++ b/src/main/java/com/example/solidconnection/score/dto/LanguageTestScoreRequest.java @@ -1,6 +1,5 @@ package com.example.solidconnection.score.dto; -import com.example.solidconnection.application.domain.LanguageTest; import com.example.solidconnection.type.LanguageTestType; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -10,16 +9,6 @@ public record LanguageTestScoreRequest( LanguageTestType languageTestType, @NotBlank(message = "어학 점수를 입력해주세요.") - String languageTestScore, - - @NotBlank(message = "어학 증명서를 첨부해주세요.") - String languageTestReportUrl) { - - public LanguageTest toLanguageTest() { - return new LanguageTest( - this.languageTestType, - this.languageTestScore, - this.languageTestReportUrl - ); - } + String languageTestScore +) { } diff --git a/src/main/java/com/example/solidconnection/score/service/ScoreService.java b/src/main/java/com/example/solidconnection/score/service/ScoreService.java index 45efb2aa1..66592d339 100644 --- a/src/main/java/com/example/solidconnection/score/service/ScoreService.java +++ b/src/main/java/com/example/solidconnection/score/service/ScoreService.java @@ -1,6 +1,10 @@ package com.example.solidconnection.score.service; +import com.example.solidconnection.application.domain.Gpa; import com.example.solidconnection.application.domain.LanguageTest; +import com.example.solidconnection.custom.exception.CustomException; +import com.example.solidconnection.s3.S3Service; +import com.example.solidconnection.s3.UploadedFileUrlResponse; import com.example.solidconnection.score.domain.GpaScore; import com.example.solidconnection.score.domain.LanguageTestScore; import com.example.solidconnection.score.dto.GpaScoreRequest; @@ -12,45 +16,70 @@ import com.example.solidconnection.score.repository.GpaScoreRepository; import com.example.solidconnection.score.repository.LanguageTestScoreRepository; import com.example.solidconnection.siteuser.domain.SiteUser; +import com.example.solidconnection.siteuser.repository.SiteUserRepository; +import com.example.solidconnection.type.ImgType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import static com.example.solidconnection.custom.exception.ErrorCode.USER_NOT_FOUND; + @Service @RequiredArgsConstructor public class ScoreService { private final GpaScoreRepository gpaScoreRepository; + private final S3Service s3Service; private final LanguageTestScoreRepository languageTestScoreRepository; + private final SiteUserRepository siteUserRepository; @Transactional - public Long submitGpaScore(SiteUser siteUser, GpaScoreRequest gpaScoreRequest) { - GpaScore newGpaScore = new GpaScore(gpaScoreRequest.toGpa(), siteUser); - newGpaScore.setSiteUser(siteUser); + public Long submitGpaScore(SiteUser siteUser, GpaScoreRequest gpaScoreRequest, MultipartFile file) { + UploadedFileUrlResponse uploadedFile = s3Service.uploadFile(file, ImgType.GPA); + Gpa gpa = new Gpa(gpaScoreRequest.gpa(), gpaScoreRequest.gpaCriteria(), uploadedFile.fileUrl()); + + /* + * todo: siteUser를 영속 상태로 만들 수 있도록 컨트롤러에서 siteUserId 를 넘겨줄 것인지, + * siteUser 에 gpaScoreList 를 FetchType.EAGER 로 설정할 것인지, + * gpa 와 siteUser 사이의 양방향을 끊을 것인지 생각해봐야한다. + */ + SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + GpaScore newGpaScore = new GpaScore(gpa, siteUser1); + newGpaScore.setSiteUser(siteUser1); GpaScore savedNewGpaScore = gpaScoreRepository.save(newGpaScore); // 저장 후 반환된 객체 return savedNewGpaScore.getId(); // 저장된 GPA Score의 ID 반환 } @Transactional - public Long submitLanguageTestScore(SiteUser siteUser, LanguageTestScoreRequest languageTestScoreRequest) { - LanguageTest languageTest = languageTestScoreRequest.toLanguageTest(); + public Long submitLanguageTestScore(SiteUser siteUser, LanguageTestScoreRequest languageTestScoreRequest, MultipartFile file) { + UploadedFileUrlResponse uploadedFile = s3Service.uploadFile(file, ImgType.LANGUAGE_TEST); + LanguageTest languageTest = new LanguageTest(languageTestScoreRequest.languageTestType(), + languageTestScoreRequest.languageTestScore(), uploadedFile.fileUrl()); - LanguageTestScore newScore = new LanguageTestScore( - languageTest, siteUser); - newScore.setSiteUser(siteUser); + /* + * todo: siteUser를 영속 상태로 만들 수 있도록 컨트롤러에서 siteUserId 를 넘겨줄 것인지, + * siteUser 에 languageTestScoreList 를 FetchType.EAGER 로 설정할 것인지, + * languageTest 와 siteUser 사이의 양방향을 끊을 것인지 생각해봐야한다. + */ + SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + LanguageTestScore newScore = new LanguageTestScore(languageTest, siteUser1); + newScore.setSiteUser(siteUser1); LanguageTestScore savedNewScore = languageTestScoreRepository.save(newScore); // 새로 저장한 객체 return savedNewScore.getId(); // 저장된 객체의 ID 반환 } @Transactional(readOnly = true) public GpaScoreStatusResponse getGpaScoreStatus(SiteUser siteUser) { + // todo: ditto + SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); List gpaScoreStatusList = - Optional.ofNullable(siteUser.getGpaScoreList()) + Optional.ofNullable(siteUser1.getGpaScoreList()) .map(scores -> scores.stream() .map(GpaScoreStatus::from) .collect(Collectors.toList())) @@ -60,8 +89,10 @@ public GpaScoreStatusResponse getGpaScoreStatus(SiteUser siteUser) { @Transactional(readOnly = true) public LanguageTestScoreStatusResponse getLanguageTestScoreStatus(SiteUser siteUser) { + // todo: ditto + SiteUser siteUser1 = siteUserRepository.findById(siteUser.getId()).orElseThrow(() -> new CustomException(USER_NOT_FOUND)); List languageTestScoreStatusList = - Optional.ofNullable(siteUser.getLanguageTestScoreList()) + Optional.ofNullable(siteUser1.getLanguageTestScoreList()) .map(scores -> scores.stream() .map(LanguageTestScoreStatus::from) .collect(Collectors.toList())) diff --git a/src/test/java/com/example/solidconnection/community/comment/service/CommentServiceTest.java b/src/test/java/com/example/solidconnection/community/comment/service/CommentServiceTest.java index fca6cd41e..ee74bb90b 100644 --- a/src/test/java/com/example/solidconnection/community/comment/service/CommentServiceTest.java +++ b/src/test/java/com/example/solidconnection/community/comment/service/CommentServiceTest.java @@ -9,9 +9,9 @@ import com.example.solidconnection.community.comment.dto.CommentUpdateResponse; import com.example.solidconnection.community.comment.dto.PostFindCommentResponse; import com.example.solidconnection.community.comment.repository.CommentRepository; -import com.example.solidconnection.custom.exception.CustomException; import com.example.solidconnection.community.post.domain.Post; import com.example.solidconnection.community.post.repository.PostRepository; +import com.example.solidconnection.custom.exception.CustomException; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.support.integration.BaseIntegrationTest; import com.example.solidconnection.type.PostCategory; @@ -110,12 +110,11 @@ class 댓글_생성_테스트 { void 댓글을_성공적으로_생성한다() { // given Post testPost = createPost(자유게시판, 테스트유저_1); - CommentCreateRequest request = new CommentCreateRequest("테스트 댓글", null); + CommentCreateRequest request = new CommentCreateRequest(testPost.getId(), "테스트 댓글", null); // when CommentCreateResponse response = commentService.createComment( 테스트유저_1, - testPost.getId(), request ); @@ -135,12 +134,11 @@ class 댓글_생성_테스트 { // given Post testPost = createPost(자유게시판, 테스트유저_1); Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); - CommentCreateRequest request = new CommentCreateRequest("테스트 대댓글", parentComment.getId()); + CommentCreateRequest request = new CommentCreateRequest(testPost.getId(), "테스트 대댓글", parentComment.getId()); // when CommentCreateResponse response = commentService.createComment( 테스트유저_2, - testPost.getId(), request ); @@ -161,13 +159,12 @@ class 댓글_생성_테스트 { Post testPost = createPost(자유게시판, 테스트유저_1); Comment parentComment = createComment(testPost, 테스트유저_1, "부모 댓글"); Comment childComment = createChildComment(testPost, 테스트유저_2, parentComment, "자식 댓글"); - CommentCreateRequest request = new CommentCreateRequest("테스트 대대댓글", childComment.getId()); + CommentCreateRequest request = new CommentCreateRequest(testPost.getId(), "테스트 대대댓글", childComment.getId()); // when & then assertThatThrownBy(() -> commentService.createComment( 테스트유저_1, - testPost.getId(), request )) .isInstanceOf(CustomException.class) @@ -179,13 +176,12 @@ class 댓글_생성_테스트 { // given Post testPost = createPost(자유게시판, 테스트유저_1); long invalidCommentId = 9999L; - CommentCreateRequest request = new CommentCreateRequest("테스트 대댓글", invalidCommentId); + CommentCreateRequest request = new CommentCreateRequest(testPost.getId(), "테스트 대댓글", invalidCommentId); // when & then assertThatThrownBy(() -> commentService.createComment( 테스트유저_1, - testPost.getId(), request )) .isInstanceOf(CustomException.class) @@ -206,7 +202,6 @@ class 댓글_수정_테스트 { // when CommentUpdateResponse response = commentService.updateComment( 테스트유저_1, - testPost.getId(), comment.getId(), request ); @@ -233,7 +228,6 @@ class 댓글_수정_테스트 { assertThatThrownBy(() -> commentService.updateComment( 테스트유저_2, - testPost.getId(), comment.getId(), request )) @@ -252,7 +246,6 @@ class 댓글_수정_테스트 { assertThatThrownBy(() -> commentService.updateComment( 테스트유저_1, - testPost.getId(), comment.getId(), request )) @@ -276,7 +269,6 @@ class 댓글_삭제_테스트 { // when CommentDeleteResponse response = commentService.deleteCommentById( 테스트유저_1, - testPost.getId(), comment.getId() ); @@ -301,7 +293,6 @@ class 댓글_삭제_테스트 { // when CommentDeleteResponse response = commentService.deleteCommentById( 테스트유저_1, - testPost.getId(), parentComment.getId() ); @@ -331,7 +322,6 @@ class 댓글_삭제_테스트 { // when CommentDeleteResponse response = commentService.deleteCommentById( 테스트유저_2, - testPost.getId(), childComment1.getId() ); @@ -362,7 +352,6 @@ class 댓글_삭제_테스트 { // when CommentDeleteResponse response = commentService.deleteCommentById( 테스트유저_2, - testPost.getId(), childComment.getId() ); @@ -384,7 +373,6 @@ class 댓글_삭제_테스트 { assertThatThrownBy(() -> commentService.deleteCommentById( 테스트유저_2, - testPost.getId(), comment.getId() )) .isInstanceOf(CustomException.class) diff --git a/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java b/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java index a8052a89c..328a1dc41 100644 --- a/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java +++ b/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java @@ -1,16 +1,16 @@ package com.example.solidconnection.community.post.service; import com.example.solidconnection.community.board.domain.Board; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.community.post.domain.PostImage; import com.example.solidconnection.community.post.domain.Post; +import com.example.solidconnection.community.post.domain.PostImage; import com.example.solidconnection.community.post.dto.PostCreateRequest; import com.example.solidconnection.community.post.dto.PostCreateResponse; import com.example.solidconnection.community.post.dto.PostDeleteResponse; import com.example.solidconnection.community.post.dto.PostUpdateRequest; import com.example.solidconnection.community.post.dto.PostUpdateResponse; -import com.example.solidconnection.community.post.repository.PostRepository; import com.example.solidconnection.community.post.repository.PostImageRepository; +import com.example.solidconnection.community.post.repository.PostRepository; +import com.example.solidconnection.custom.exception.CustomException; import com.example.solidconnection.s3.S3Service; import com.example.solidconnection.s3.UploadedFileUrlResponse; import com.example.solidconnection.service.RedisService; @@ -37,9 +37,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; -import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.any; import static org.mockito.BDDMockito.eq; +import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; @DisplayName("게시글 생성/수정/삭제 서비스 테스트") @@ -79,7 +79,6 @@ class 게시글_생성_테스트 { // when PostCreateResponse response = postCommandService.createPost( 테스트유저_1, - 자유게시판.getCode(), request, imageFiles ); @@ -108,7 +107,7 @@ class 게시글_생성_테스트 { // when & then assertThatThrownBy(() -> - postCommandService.createPost(테스트유저_1, 자유게시판.getCode(), request, imageFiles)) + postCommandService.createPost(테스트유저_1, request, imageFiles)) .isInstanceOf(CustomException.class) .hasMessage(INVALID_POST_CATEGORY.getMessage()); } @@ -121,7 +120,7 @@ class 게시글_생성_테스트 { // when & then assertThatThrownBy(() -> - postCommandService.createPost(테스트유저_1, 자유게시판.getCode(), request, imageFiles)) + postCommandService.createPost(테스트유저_1, request, imageFiles)) .isInstanceOf(CustomException.class) .hasMessage(INVALID_POST_CATEGORY.getMessage()); } @@ -134,7 +133,7 @@ class 게시글_생성_테스트 { // when & then assertThatThrownBy(() -> - postCommandService.createPost(테스트유저_1, 자유게시판.getCode(), request, imageFiles)) + postCommandService.createPost(테스트유저_1, request, imageFiles)) .isInstanceOf(CustomException.class) .hasMessage(CAN_NOT_UPLOAD_MORE_THAN_FIVE_IMAGES.getMessage()); } @@ -159,7 +158,6 @@ class 게시글_수정_테스트 { // when PostUpdateResponse response = postCommandService.updatePost( 테스트유저_1, - 자유게시판.getCode(), testPost.getId(), request, imageFiles @@ -190,7 +188,6 @@ class 게시글_수정_테스트 { assertThatThrownBy(() -> postCommandService.updatePost( 테스트유저_2, - 자유게시판.getCode(), testPost.getId(), request, imageFiles @@ -210,7 +207,6 @@ class 게시글_수정_테스트 { assertThatThrownBy(() -> postCommandService.updatePost( 테스트유저_1, - 자유게시판.getCode(), testPost.getId(), request, imageFiles @@ -230,7 +226,6 @@ class 게시글_수정_테스트 { assertThatThrownBy(() -> postCommandService.updatePost( 테스트유저_1, - 자유게시판.getCode(), testPost.getId(), request, imageFiles @@ -254,7 +249,6 @@ class 게시글_삭제_테스트 { // when PostDeleteResponse response = postCommandService.deletePostById( 테스트유저_1, - 자유게시판.getCode(), testPost.getId() ); @@ -276,7 +270,6 @@ class 게시글_삭제_테스트 { assertThatThrownBy(() -> postCommandService.deletePostById( 테스트유저_2, - 자유게시판.getCode(), testPost.getId() )) .isInstanceOf(CustomException.class) @@ -292,7 +285,6 @@ class 게시글_삭제_테스트 { assertThatThrownBy(() -> postCommandService.deletePostById( 테스트유저_1, - 자유게시판.getCode(), testPost.getId() )) .isInstanceOf(CustomException.class) @@ -302,6 +294,7 @@ class 게시글_삭제_테스트 { private PostCreateRequest createPostCreateRequest(String category) { return new PostCreateRequest( + 자유게시판.getCode(), category, "테스트 제목", "테스트 내용", diff --git a/src/test/java/com/example/solidconnection/community/post/service/PostLikeServiceTest.java b/src/test/java/com/example/solidconnection/community/post/service/PostLikeServiceTest.java index 1b1e1d2fd..23fa6bf50 100644 --- a/src/test/java/com/example/solidconnection/community/post/service/PostLikeServiceTest.java +++ b/src/test/java/com/example/solidconnection/community/post/service/PostLikeServiceTest.java @@ -45,7 +45,6 @@ class 게시글_좋아요_테스트 { // when PostLikeResponse response = postLikeService.likePost( 테스트유저_1, - 자유게시판.getCode(), testPost.getId() ); @@ -63,13 +62,12 @@ class 게시글_좋아요_테스트 { void 이미_좋아요한_게시글을_다시_좋아요하면_예외_응답을_반환한다() { // given Post testPost = createPost(자유게시판, 테스트유저_1); - postLikeService.likePost(테스트유저_1, 자유게시판.getCode(), testPost.getId()); + postLikeService.likePost(테스트유저_1, testPost.getId()); // when & then assertThatThrownBy(() -> postLikeService.likePost( 테스트유저_1, - 자유게시판.getCode(), testPost.getId() )) .isInstanceOf(CustomException.class) @@ -84,13 +82,12 @@ class 게시글_좋아요_취소_테스트 { void 게시글_좋아요를_성공적으로_취소한다() { // given Post testPost = createPost(자유게시판, 테스트유저_1); - PostLikeResponse beforeResponse = postLikeService.likePost(테스트유저_1, 자유게시판.getCode(), testPost.getId()); + PostLikeResponse beforeResponse = postLikeService.likePost(테스트유저_1, testPost.getId()); long beforeLikeCount = beforeResponse.likeCount(); // when PostDislikeResponse response = postLikeService.dislikePost( 테스트유저_1, - 자유게시판.getCode(), testPost.getId() ); @@ -113,7 +110,6 @@ class 게시글_좋아요_취소_테스트 { assertThatThrownBy(() -> postLikeService.dislikePost( 테스트유저_1, - 자유게시판.getCode(), testPost.getId() )) .isInstanceOf(CustomException.class) diff --git a/src/test/java/com/example/solidconnection/community/post/service/PostQueryServiceTest.java b/src/test/java/com/example/solidconnection/community/post/service/PostQueryServiceTest.java index 33246e981..fc7926698 100644 --- a/src/test/java/com/example/solidconnection/community/post/service/PostQueryServiceTest.java +++ b/src/test/java/com/example/solidconnection/community/post/service/PostQueryServiceTest.java @@ -112,7 +112,6 @@ class PostQueryServiceTest extends BaseIntegrationTest { // when PostFindResponse response = postQueryService.findPostById( 테스트유저_1, - 자유게시판.getCode(), testPost.getId() ); diff --git a/src/test/java/com/example/solidconnection/concurrency/PostLikeCountConcurrencyTest.java b/src/test/java/com/example/solidconnection/concurrency/PostLikeCountConcurrencyTest.java index 3903f31ff..52b9f24f0 100644 --- a/src/test/java/com/example/solidconnection/concurrency/PostLikeCountConcurrencyTest.java +++ b/src/test/java/com/example/solidconnection/concurrency/PostLikeCountConcurrencyTest.java @@ -103,8 +103,8 @@ private Post createPost(Board board, SiteUser siteUser) { SiteUser tmpSiteUser = siteUserRepository.save(createSiteUserByEmail(email)); executorService.submit(() -> { try { - postLikeService.likePost(tmpSiteUser, board.getCode(), post.getId()); - postLikeService.dislikePost(tmpSiteUser, board.getCode(), post.getId()); + postLikeService.likePost(tmpSiteUser, post.getId()); + postLikeService.dislikePost(tmpSiteUser, post.getId()); } finally { doneSignal.countDown(); } diff --git a/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java b/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java index fa2cf0b0b..868eac179 100644 --- a/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java +++ b/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java @@ -105,7 +105,7 @@ public void setUpUserAndToken() { ApplicationsResponse response = RestAssured.given().log().all() .header("Authorization", "Bearer " + accessToken) .when().log().all() - .get("/application") + .get("/applications") .then().log().all() .statusCode(200) .extract().as(ApplicationsResponse.class); @@ -151,7 +151,7 @@ public void setUpUserAndToken() { ApplicationsResponse response = RestAssured.given().log().all() .header("Authorization", "Bearer " + accessToken) .when().log().all() - .get("/application?region=" + 영미권.getCode()) + .get("/applications?region=" + 영미권.getCode()) .then().log().all() .statusCode(200) .extract().as(ApplicationsResponse.class); @@ -178,7 +178,7 @@ public void setUpUserAndToken() { ApplicationsResponse response = RestAssured.given().log().all() .header("Authorization", "Bearer " + accessToken) .when().log().all() - .get("/application?keyword=라") + .get("/applications?keyword=라") .then().log().all() .statusCode(200) .extract().as(ApplicationsResponse.class); @@ -204,7 +204,7 @@ public void setUpUserAndToken() { ApplicationsResponse response = RestAssured.given().log().all() .header("Authorization", "Bearer " + accessToken) .when().log().all() - .get("/application?keyword=일본") + .get("/applications?keyword=일본") .then().log().all() .statusCode(200) .extract().as(ApplicationsResponse.class); @@ -224,7 +224,7 @@ public void setUpUserAndToken() { ApplicationsResponse response = RestAssured.given().log().all() .header("Authorization", "Bearer " + accessToken) .when().log().all() - .get("/application") + .get("/applications") .then().log().all() .statusCode(200) .extract().as(ApplicationsResponse.class); @@ -253,7 +253,7 @@ public void setUpUserAndToken() { ApplicationsResponse response = RestAssured.given().log().all() .header("Authorization", "Bearer " + accessToken) .when().log().all() - .get("/application/competitors") + .get("/applications/competitors") .then().log().all() .statusCode(200) .extract().as(ApplicationsResponse.class); @@ -295,7 +295,7 @@ public void setUpUserAndToken() { ApplicationsResponse response = RestAssured.given().log().all() .header("Authorization", "Bearer " + user6AccessToken) .when().log().all() - .get("/application/competitors") + .get("/applications/competitors") .then().log().all() .statusCode(200) .extract().as(ApplicationsResponse.class); @@ -316,7 +316,7 @@ public void setUpUserAndToken() { ApplicationsResponse response = RestAssured.given().log().all() .header("Authorization", "Bearer " + adminAccessToken) .when().log().all() - .get("/application/competitors") + .get("/applications/competitors") .then().log().all() .statusCode(200) .extract().as(ApplicationsResponse.class); diff --git a/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java b/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java index 038aa91b6..0617e1c25 100644 --- a/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java +++ b/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java @@ -2,6 +2,8 @@ import com.example.solidconnection.application.domain.Gpa; import com.example.solidconnection.application.domain.LanguageTest; +import com.example.solidconnection.s3.S3Service; +import com.example.solidconnection.s3.UploadedFileUrlResponse; import com.example.solidconnection.score.domain.GpaScore; import com.example.solidconnection.score.domain.LanguageTestScore; import com.example.solidconnection.score.dto.GpaScoreRequest; @@ -16,6 +18,7 @@ import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.support.integration.BaseIntegrationTest; import com.example.solidconnection.type.Gender; +import com.example.solidconnection.type.ImgType; import com.example.solidconnection.type.LanguageTestType; import com.example.solidconnection.type.PreparationStatus; import com.example.solidconnection.type.Role; @@ -23,11 +26,14 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.mock.web.MockMultipartFile; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.BDDMockito.given; @DisplayName("점수 서비스 테스트") class ScoreServiceTest extends BaseIntegrationTest { @@ -44,6 +50,9 @@ class ScoreServiceTest extends BaseIntegrationTest { @Autowired private LanguageTestScoreRepository languageTestScoreRepository; + @MockBean + private S3Service s3Service; + @Test void GPA_점수_상태를_조회한다() { // given @@ -118,9 +127,12 @@ class ScoreServiceTest extends BaseIntegrationTest { // given SiteUser testUser = createSiteUser(); GpaScoreRequest request = createGpaScoreRequest(); + MockMultipartFile file = createFile(); + String fileUrl = "/gpa-report.pdf"; + given(s3Service.uploadFile(file, ImgType.GPA)).willReturn(new UploadedFileUrlResponse(fileUrl)); // when - long scoreId = scoreService.submitGpaScore(testUser, request); + long scoreId = scoreService.submitGpaScore(testUser, request, file); GpaScore savedScore = gpaScoreRepository.findById(scoreId).orElseThrow(); // then @@ -128,7 +140,8 @@ class ScoreServiceTest extends BaseIntegrationTest { () -> assertThat(savedScore.getId()).isEqualTo(scoreId), () -> assertThat(savedScore.getGpa().getGpa()).isEqualTo(request.gpa()), () -> assertThat(savedScore.getGpa().getGpaCriteria()).isEqualTo(request.gpaCriteria()), - () -> assertThat(savedScore.getVerifyStatus()).isEqualTo(VerifyStatus.PENDING) + () -> assertThat(savedScore.getVerifyStatus()).isEqualTo(VerifyStatus.PENDING), + () -> assertThat(savedScore.getGpa().getGpaReportUrl()).isEqualTo(fileUrl) ); } @@ -137,9 +150,12 @@ class ScoreServiceTest extends BaseIntegrationTest { // given SiteUser testUser = createSiteUser(); LanguageTestScoreRequest request = createLanguageTestScoreRequest(); + MockMultipartFile file = createFile(); + String fileUrl = "/gpa-report.pdf"; + given(s3Service.uploadFile(file, ImgType.LANGUAGE_TEST)).willReturn(new UploadedFileUrlResponse(fileUrl)); // when - long scoreId = scoreService.submitLanguageTestScore(testUser, request); + long scoreId = scoreService.submitLanguageTestScore(testUser, request, file); LanguageTestScore savedScore = languageTestScoreRepository.findById(scoreId).orElseThrow(); // then @@ -147,7 +163,8 @@ class ScoreServiceTest extends BaseIntegrationTest { () -> assertThat(savedScore.getId()).isEqualTo(scoreId), () -> assertThat(savedScore.getLanguageTest().getLanguageTestType()).isEqualTo(request.languageTestType()), () -> assertThat(savedScore.getLanguageTest().getLanguageTestScore()).isEqualTo(request.languageTestScore()), - () -> assertThat(savedScore.getVerifyStatus()).isEqualTo(VerifyStatus.PENDING) + () -> assertThat(savedScore.getVerifyStatus()).isEqualTo(VerifyStatus.PENDING), + () -> assertThat(savedScore.getLanguageTest().getLanguageTestReportUrl()).isEqualTo(fileUrl) ); } @@ -185,16 +202,23 @@ private LanguageTestScore createLanguageTestScore(SiteUser siteUser, LanguageTes private GpaScoreRequest createGpaScoreRequest() { return new GpaScoreRequest( 3.5, - 4.5, - "/gpa-report.pdf" + 4.5 ); } private LanguageTestScoreRequest createLanguageTestScoreRequest() { return new LanguageTestScoreRequest( LanguageTestType.TOEFL_IBT, - "100", - "/gpa-report.pdf" + "100" + ); + } + + private MockMultipartFile createFile() { + return new MockMultipartFile( + "image", + "test.jpg", + "image/jpeg", + "test image content".getBytes() ); } }