diff --git a/back/src/main/java/com/back/domain/post/comment/controller/PostCommentController.java b/back/src/main/java/com/back/domain/post/comment/controller/PostCommentController.java new file mode 100644 index 00000000..5fcc5af3 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/comment/controller/PostCommentController.java @@ -0,0 +1,33 @@ +package com.back.domain.post.comment.controller; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.post.comment.dto.CommentCreateRequest; +import com.back.domain.post.comment.service.PostCommentService; +import com.back.global.rq.Rq; +import com.back.global.rsData.RsData; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/post/comment") +@RequiredArgsConstructor +public class PostCommentController { + @Autowired + private Rq rq; + @Autowired + private PostCommentService postCommentService; + + @Operation(summary = "댓글 생성") + @PostMapping("/{post_id}") + public RsData createComment(@PathVariable Long post_id, + @Valid @RequestBody CommentCreateRequest commentCreateRequest + ) { + Member member = rq.getActor(); + postCommentService.createComment(member, post_id, commentCreateRequest); + + return new RsData<>("200", "댓글 작성 완료" , null); + } +} diff --git a/back/src/main/java/com/back/domain/post/comment/dto/CommentCreateRequest.java b/back/src/main/java/com/back/domain/post/comment/dto/CommentCreateRequest.java new file mode 100644 index 00000000..95286991 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/comment/dto/CommentCreateRequest.java @@ -0,0 +1,10 @@ +package com.back.domain.post.comment.dto; + +import lombok.Data; + +@Data +public class CommentCreateRequest { + private Long postId; + private String role; + private String comment; +} diff --git a/back/src/main/java/com/back/domain/post/comment/entity/PostComment.java b/back/src/main/java/com/back/domain/post/comment/entity/PostComment.java new file mode 100644 index 00000000..208e1210 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/comment/entity/PostComment.java @@ -0,0 +1,26 @@ +package com.back.domain.post.comment.entity; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.post.post.entity.Post; +import com.back.global.jpa.BaseEntity; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.ManyToOne; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +public class PostComment extends BaseEntity { + @ManyToOne(fetch = FetchType.LAZY) + private Post post; + + private String content; + + @ManyToOne(fetch = FetchType.LAZY) + private Member member; + + private String role; + +} diff --git a/back/src/main/java/com/back/domain/post/comment/repository/PostCommentRepository.java b/back/src/main/java/com/back/domain/post/comment/repository/PostCommentRepository.java new file mode 100644 index 00000000..1c2ab975 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/comment/repository/PostCommentRepository.java @@ -0,0 +1,9 @@ +package com.back.domain.post.comment.repository; + +import com.back.domain.post.comment.entity.PostComment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PostCommentRepository extends JpaRepository { +} diff --git a/back/src/main/java/com/back/domain/post/comment/service/PostCommentService.java b/back/src/main/java/com/back/domain/post/comment/service/PostCommentService.java new file mode 100644 index 00000000..0f75febb --- /dev/null +++ b/back/src/main/java/com/back/domain/post/comment/service/PostCommentService.java @@ -0,0 +1,35 @@ +package com.back.domain.post.comment.service; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.post.comment.dto.CommentCreateRequest; +import com.back.domain.post.comment.entity.PostComment; +import com.back.domain.post.comment.repository.PostCommentRepository; +import com.back.domain.post.post.entity.Post; +import com.back.domain.post.post.repository.PostRepository; +import com.back.global.exception.ServiceException; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PostCommentService { + private final PostRepository postRepository; + private final PostCommentRepository postCommentRepository; + + @Transactional + public void createComment(Member member, Long postId, CommentCreateRequest commentCreateRequest) { + Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + + PostComment postComment = new PostComment(); + + postComment.setContent(commentCreateRequest.getComment()); + postComment.setMember(member); + postComment.setRole(String.valueOf(member.getRole())); + + post.addComment(postComment); + + postCommentRepository.save(postComment); + + } +} diff --git a/back/src/main/java/com/back/domain/post/controller/InformationPostController.java b/back/src/main/java/com/back/domain/post/controller/InformationPostController.java deleted file mode 100644 index 9616272e..00000000 --- a/back/src/main/java/com/back/domain/post/controller/InformationPostController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.back.domain.post.controller; - -import com.back.domain.member.member.entity.Member; -import com.back.domain.post.dto.PostAllResponse; -import com.back.domain.post.dto.PostCreateRequest; -import com.back.domain.post.dto.PostCreateResponse; -import com.back.domain.post.dto.PostSingleResponse; -import com.back.domain.post.entity.Post; -import com.back.domain.post.rq.ApiResponse; -import com.back.domain.post.service.PostService; -import com.back.global.auth.CurrentUser; -import io.swagger.v3.oas.annotations.Operation; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("post/infor") -@RequiredArgsConstructor -public class InformationPostController { - private final PostService postService; - - - @Operation(summary = "게시글 생성") - @PostMapping - public ResponseEntity> createPost( - @RequestBody PostCreateRequest postCreateRequest, - @CurrentUser Member member - ) { - String authorName = member.getName(); - Post post = postService.createPost(postCreateRequest, authorName); - PostCreateResponse postCreateResponse = PostCreateResponse.from(post); - ApiResponse response = new ApiResponse<>("게시글이 성공적으로 생성되었습니다. " , postCreateResponse); - return ResponseEntity.ok(response); - } - - @Operation(summary = "게시글 다건 조회") - @GetMapping - public ResponseEntity>> getAllPost() { - List postAllResponse = postService.getAllPostResponse(); - - - ApiResponse> response = new ApiResponse<>("게시글 다건 조회 성공", postAllResponse); - return ResponseEntity.ok(response); - } - - @Operation(summary = "게시글 단건 조회") - @GetMapping("/{post_id}") - public ResponseEntity> getSinglePost(@PathVariable long post_id) { - Post post = postService.findById(post_id); - - PostSingleResponse postSingleResponse = new PostSingleResponse(post); - - ApiResponse response = new ApiResponse<>("게시글 단건 조회 성공", postSingleResponse); - return ResponseEntity.ok(response); - } -} diff --git a/back/src/main/java/com/back/domain/post/dto/PostCreateRequest.java b/back/src/main/java/com/back/domain/post/dto/PostCreateRequest.java deleted file mode 100644 index 84684fd6..00000000 --- a/back/src/main/java/com/back/domain/post/dto/PostCreateRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.back.domain.post.dto; - -import lombok.Data; - -@Data -public class PostCreateRequest { - private Long memberId; - private String postType; - private String title; - private String content; - -} diff --git a/back/src/main/java/com/back/domain/post/entity/Post.java b/back/src/main/java/com/back/domain/post/entity/Post.java deleted file mode 100644 index fa12a4c8..00000000 --- a/back/src/main/java/com/back/domain/post/entity/Post.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.back.domain.post.entity; - -import com.back.global.jpa.BaseEntity; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Entity -@NoArgsConstructor -@Getter -@Setter -public class Post extends BaseEntity { - private String title; - private String content; - private String authorName; - - @Enumerated(EnumType.STRING) - private PostType postType; - - public enum PostType { - INFORMATIONPOST, - PRACTICEPOST, - QUESTIONPOST - } - - private int viewCount; - - private int liked; - -} diff --git a/back/src/main/java/com/back/domain/post/entity/PracticePost.java b/back/src/main/java/com/back/domain/post/entity/PracticePost.java deleted file mode 100644 index 6c9940a6..00000000 --- a/back/src/main/java/com/back/domain/post/entity/PracticePost.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.back.domain.post.entity; - -import jakarta.persistence.Entity; -import lombok.NoArgsConstructor; - -@Entity -@NoArgsConstructor -public class PracticePost extends Post{ - private Boolean isMento; - private String carrer; -} diff --git a/back/src/main/java/com/back/domain/post/entity/QuestionPost.java b/back/src/main/java/com/back/domain/post/entity/QuestionPost.java deleted file mode 100644 index 5a9c49f8..00000000 --- a/back/src/main/java/com/back/domain/post/entity/QuestionPost.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.back.domain.post.entity; - -import jakarta.persistence.Entity; - -@Entity -public class QuestionPost extends Post{ - private Boolean isResolve; -} diff --git a/back/src/main/java/com/back/domain/post/post/controller/InformationPostController.java b/back/src/main/java/com/back/domain/post/post/controller/InformationPostController.java new file mode 100644 index 00000000..679b7ad9 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/post/controller/InformationPostController.java @@ -0,0 +1,101 @@ +package com.back.domain.post.post.controller; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.post.post.dto.*; +import com.back.domain.post.post.entity.Post; +import com.back.domain.post.post.service.PostService; +import com.back.global.auth.CurrentUser; +import com.back.global.rq.Rq; +import com.back.global.rsData.RsData; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("post/infor") +@RequiredArgsConstructor +public class InformationPostController { + private final PostService postService; + private final Rq rq; + + + @Operation(summary = "게시글 생성") + @PostMapping + public RsData createPost( + @Valid @RequestBody PostCreateRequest postCreateRequest + ) { + Member member = rq.getActor(); + Post post = postService.createPost(postCreateRequest, member); + PostCreateResponse postCreateResponse = PostCreateResponse.from(post); + + return new RsData<>("200", "게시글이 성공적으로 생성되었습니다.", postCreateResponse); + } + + @Operation(summary = "게시글 다건 조회") + @GetMapping + public RsData> getAllPost() { + List postAllResponse = postService.getAllPostResponse(); + + + return new RsData<>("200", "게시글 다건 조회 성공", postAllResponse); + } + + @Operation(summary = "게시글 단건 조회") + @GetMapping("/{post_id}") + public RsData getSinglePost(@PathVariable long post_id) { + Post post = postService.findById(post_id); + + PostSingleResponse postSingleResponse = new PostSingleResponse(post); + + return new RsData<>("200", "게시글 단건 조회 성공", postSingleResponse); + } + + @Operation(summary = "게시글 삭제") + @DeleteMapping("/{post_id}") + public RsData removePost(@PathVariable long post_id) { + Member member = rq.getActor(); + + postService.removePost(post_id, member); + + return new RsData<>("200", "게시글 삭제 성공", null); + } + + @Operation(summary = "게시글 수정") + @PutMapping("/{post_id}") + public RsData updatePost(@PathVariable long post_id + ,@CurrentUser Member member + ,@Valid @RequestBody PostCreateRequest postCreateRequest) { + + postService.updatePost(post_id, member, postCreateRequest); + + return new RsData<>("200", "게시글 수정 성공", null); + } + + @Operation(summary = "게시글 좋아요 + ") + @PostMapping("/{post_id}/liked") + public RsData likePost(@PathVariable long post_id) { + postService.likePost(post_id); + + return new RsData<>("200", "게시글 좋아요 성공", null); + } + + @Operation(summary = "게시글 좋아요 (Show)") + @GetMapping("/{post_id}/liked") + public RsData getlike(@PathVariable long post_id) { + int likeCount = postService.showLikeCount(post_id); + PostLikedResponse postLikedResponse = new PostLikedResponse(likeCount); + + return new RsData<>("200", "게시글 좋아요 조회 성공", postLikedResponse); + } + + @Operation(summary = "게시글 싫어요") + @PostMapping("/{post_id}/disliked") + public RsData disLikePost(@PathVariable long post_id) { + postService.disLikePost(post_id); + + return new RsData<>("200", "게시글 싫어요 성공", null); + } +} diff --git a/back/src/main/java/com/back/domain/post/dto/PostAllResponse.java b/back/src/main/java/com/back/domain/post/post/dto/PostAllResponse.java similarity index 86% rename from back/src/main/java/com/back/domain/post/dto/PostAllResponse.java rename to back/src/main/java/com/back/domain/post/post/dto/PostAllResponse.java index 7760b45e..ca25dcce 100644 --- a/back/src/main/java/com/back/domain/post/dto/PostAllResponse.java +++ b/back/src/main/java/com/back/domain/post/post/dto/PostAllResponse.java @@ -1,6 +1,6 @@ -package com.back.domain.post.dto; +package com.back.domain.post.post.dto; -import com.back.domain.post.entity.Post; +import com.back.domain.post.post.entity.Post; import lombok.Data; import java.time.LocalDateTime; diff --git a/back/src/main/java/com/back/domain/post/post/dto/PostCreateRequest.java b/back/src/main/java/com/back/domain/post/post/dto/PostCreateRequest.java new file mode 100644 index 00000000..1ff1838c --- /dev/null +++ b/back/src/main/java/com/back/domain/post/post/dto/PostCreateRequest.java @@ -0,0 +1,14 @@ +package com.back.domain.post.post.dto; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class PostCreateRequest { + private Long memberId; + private String postType; + @NotBlank(message = "제목은 null 혹은 공백일 수 없습니다.") + private String title; + @NotBlank(message = "제목은 null 혹은 공백일 수 없습니다.") + private String content; +} diff --git a/back/src/main/java/com/back/domain/post/dto/PostCreateResponse.java b/back/src/main/java/com/back/domain/post/post/dto/PostCreateResponse.java similarity index 80% rename from back/src/main/java/com/back/domain/post/dto/PostCreateResponse.java rename to back/src/main/java/com/back/domain/post/post/dto/PostCreateResponse.java index c3b5505b..da16a1d2 100644 --- a/back/src/main/java/com/back/domain/post/dto/PostCreateResponse.java +++ b/back/src/main/java/com/back/domain/post/post/dto/PostCreateResponse.java @@ -1,6 +1,6 @@ -package com.back.domain.post.dto; +package com.back.domain.post.post.dto; -import com.back.domain.post.entity.Post; +import com.back.domain.post.post.entity.Post; import lombok.Data; @Data diff --git a/back/src/main/java/com/back/domain/post/post/dto/PostLikedResponse.java b/back/src/main/java/com/back/domain/post/post/dto/PostLikedResponse.java new file mode 100644 index 00000000..95ac2847 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/post/dto/PostLikedResponse.java @@ -0,0 +1,9 @@ +package com.back.domain.post.post.dto; + +public class PostLikedResponse { + int liked; + + public PostLikedResponse(int liked) { + this.liked= liked; + } +} diff --git a/back/src/main/java/com/back/domain/post/post/dto/PostModifyRequest.java b/back/src/main/java/com/back/domain/post/post/dto/PostModifyRequest.java new file mode 100644 index 00000000..0ff0b8c7 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/post/dto/PostModifyRequest.java @@ -0,0 +1,9 @@ +package com.back.domain.post.post.dto; + +import lombok.Data; + +@Data +public class PostModifyRequest { + String title; + String content; +} diff --git a/back/src/main/java/com/back/domain/post/dto/PostSingleResponse.java b/back/src/main/java/com/back/domain/post/post/dto/PostSingleResponse.java similarity index 86% rename from back/src/main/java/com/back/domain/post/dto/PostSingleResponse.java rename to back/src/main/java/com/back/domain/post/post/dto/PostSingleResponse.java index 4e40ce19..6c079709 100644 --- a/back/src/main/java/com/back/domain/post/dto/PostSingleResponse.java +++ b/back/src/main/java/com/back/domain/post/post/dto/PostSingleResponse.java @@ -1,6 +1,6 @@ -package com.back.domain.post.dto; +package com.back.domain.post.post.dto; -import com.back.domain.post.entity.Post; +import com.back.domain.post.post.entity.Post; import lombok.Data; import java.time.LocalDateTime; diff --git a/back/src/main/java/com/back/domain/post/post/entity/Post.java b/back/src/main/java/com/back/domain/post/post/entity/Post.java new file mode 100644 index 00000000..8370f49f --- /dev/null +++ b/back/src/main/java/com/back/domain/post/post/entity/Post.java @@ -0,0 +1,62 @@ +package com.back.domain.post.post.entity; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.post.comment.entity.PostComment; +import com.back.global.jpa.BaseEntity; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@NoArgsConstructor +@Getter +@Setter +public class Post extends BaseEntity { + @NotNull(message = "제목은 null일 수 없습니다.") + private String title; + @NotNull + private String content; + @NotNull + private String authorName; + + @ManyToOne(fetch = FetchType.LAZY) + private Member member; + + @Enumerated(EnumType.STRING) + private PostType postType; + + public enum PostType { + INFORMATIONPOST, + PRACTICEPOST, + QUESTIONPOST + } + + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) + private List comments = new ArrayList<>(); + + private int viewCount; + + private int liked; + + private Boolean isMento; + private String carrer; + + private Boolean isResolve; + + + + public void addComment(PostComment comment) { + comments.add(comment); + comment.setPost(this); + } + + public void removeComment(PostComment comment) { + comments.remove(comment); + comment.setPost(null); + } +} diff --git a/back/src/main/java/com/back/domain/post/repository/PostRepository.java b/back/src/main/java/com/back/domain/post/post/repository/PostRepository.java similarity index 67% rename from back/src/main/java/com/back/domain/post/repository/PostRepository.java rename to back/src/main/java/com/back/domain/post/post/repository/PostRepository.java index 628d0fa8..d48774c3 100644 --- a/back/src/main/java/com/back/domain/post/repository/PostRepository.java +++ b/back/src/main/java/com/back/domain/post/post/repository/PostRepository.java @@ -1,9 +1,10 @@ -package com.back.domain.post.repository; +package com.back.domain.post.post.repository; -import com.back.domain.post.entity.Post; +import com.back.domain.post.post.entity.Post; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface PostRepository extends JpaRepository { + } diff --git a/back/src/main/java/com/back/domain/post/post/rq/ApiResponse.java b/back/src/main/java/com/back/domain/post/post/rq/ApiResponse.java new file mode 100644 index 00000000..7af57293 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/post/rq/ApiResponse.java @@ -0,0 +1,15 @@ +package com.back.domain.post.post.rq; + +import lombok.Getter; + +@Getter +public class ApiResponse { + private String msg; + private T data; + + + public ApiResponse(String msg, T data) { + this.msg = msg; + this.data = data; + } +} diff --git a/back/src/main/java/com/back/domain/post/post/service/PostService.java b/back/src/main/java/com/back/domain/post/post/service/PostService.java new file mode 100644 index 00000000..fe37fe37 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/post/service/PostService.java @@ -0,0 +1,111 @@ +package com.back.domain.post.post.service; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.post.post.dto.PostAllResponse; +import com.back.domain.post.post.dto.PostCreateRequest; +import com.back.domain.post.post.entity.Post; +import com.back.domain.post.post.repository.PostRepository; +import com.back.global.exception.ServiceException; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class PostService { + + private final PostRepository postRepository; + + public List getAllPosts() { + List posts = postRepository.findAll(); + + return posts; + } + + + public Post createPost(PostCreateRequest postCreateRequest, Member member) { + String postTypeStr = postCreateRequest.getPostType(); + + validPostType(postTypeStr); + + + + Post.PostType postType = Post.PostType.valueOf(postTypeStr); + + Post post = new Post(); + post.setTitle(postCreateRequest.getTitle()); + post.setContent(postCreateRequest.getContent()); + post.setAuthorName(member.getName()); + post.setMember(member); + post.setPostType(postType); + + postRepository.save(post); + + return post; + } + + private void validPostType(String postTypeStr) { + boolean eq = false; + + String[] validType = new String[3]; + validType[0] = "INFORMATIONPOST"; + validType[1] = "PRACTICEPOST"; + validType[2] = "QUESTIONPOST"; + + for(String x : validType) if(x.equals(postTypeStr)) eq = true; + + if(!eq) throw new ServiceException("400-2", "유효하지 않은 PostType입니다."); + } + + + public Post findById(Long postId) { + Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + return post; + } + + public List getAllPostResponse() { + return postRepository.findAll().stream() + .map(PostAllResponse::new) + .toList(); + } + + public void removePost(Long postId, Member member) { + Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + Long authorId = post.getMember().getId(); + if(authorId != member.getId()) throw new ServiceException("400", "삭제 권한이 없습니다."); + + postRepository.delete(post); + } + + public void updatePost(long postId, Member member, @Valid PostCreateRequest postCreateRequest) { + Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + Long authorId = post.getMember().getId(); + if(authorId != member.getId()) throw new ServiceException("400", "수정 권한이 없습니다."); + + post.setTitle(postCreateRequest.getTitle()); + post.setContent(postCreateRequest.getContent()); + + postRepository.save(post); + } + + public void likePost(long postId) { + Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + + post.setLiked(post.getLiked()+1); + } + + public void disLikePost(long postId) { + Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + + post.setLiked(post.getLiked()-1); + } + + public int showLikeCount(long postId) { + Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + + int count = post.getLiked(); + return count; + } +} diff --git a/back/src/main/java/com/back/domain/post/rq/ApiResponse.java b/back/src/main/java/com/back/domain/post/rq/ApiResponse.java deleted file mode 100644 index d999348b..00000000 --- a/back/src/main/java/com/back/domain/post/rq/ApiResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.back.domain.post.rq; - -import lombok.Getter; - -@Getter -public class ApiResponse { - private String message; - private T data; - - - public ApiResponse(String message, T data) { - this.message= message; - this.data = data; - } -} diff --git a/back/src/main/java/com/back/domain/post/service/PostService.java b/back/src/main/java/com/back/domain/post/service/PostService.java deleted file mode 100644 index 0f69cf8c..00000000 --- a/back/src/main/java/com/back/domain/post/service/PostService.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.back.domain.post.service; - -import com.back.domain.post.dto.PostAllResponse; -import com.back.domain.post.dto.PostCreateRequest; -import com.back.domain.post.entity.Post; -import com.back.domain.post.repository.PostRepository; -import com.back.global.exception.ServiceException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@RequiredArgsConstructor -public class PostService { - - private final PostRepository postRepository; - - public List getAllPosts() { - List posts = postRepository.findAll(); - - return posts; - } - - - public Post createPost(PostCreateRequest postCreateRequest, String authorName) { - Post post = new Post(); - post.setTitle(postCreateRequest.getTitle()); - post.setContent(postCreateRequest.getContent()); - post.setAuthorName(authorName); - String postTypeStr = postCreateRequest.getPostType(); - Post.PostType postType; - - switch(postTypeStr) { - case "INFORMATIONPOST": - postType = Post.PostType.INFORMATIONPOST; - break; - case "PRACTICEPOST": - postType = Post.PostType.PRACTICEPOST; - break; - case "QUESTIONPOST": - postType = Post.PostType.QUESTIONPOST; - break; - default: - throw new ServiceException("400-2", "유효하지 않은 PostType입니다."); - } - - post.setPostType(postType); - - postRepository.save(post); - - return post; - } - - public Post findById(Long id) { - return postRepository.findById(id).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); - } - - public List getAllPostResponse() { - return postRepository.findAll().stream() - .map(PostAllResponse::new) - .toList(); - } -} diff --git a/back/src/main/java/com/back/global/init/PostInitData.java b/back/src/main/java/com/back/global/init/PostInitData.java new file mode 100644 index 00000000..ac3f67cc --- /dev/null +++ b/back/src/main/java/com/back/global/init/PostInitData.java @@ -0,0 +1,77 @@ +package com.back.global.init; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.member.member.service.MemberService; +import com.back.domain.post.post.entity.Post; +import com.back.domain.post.post.repository.PostRepository; +import com.back.global.exception.ServiceException; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +@Profile("test") +@Component +@RequiredArgsConstructor +@Slf4j +public class PostInitData implements ApplicationRunner { + private final PostRepository postRepository; + private final MemberService memberService; + + + @Override + public void run(ApplicationArguments args) throws Exception { + log.info("postinit데이터 생성"); + initPostData(); + + + log.info("postRepo개수는 " + postRepository.count()); + + log.info("postinit데이터 생성 완료"); + } + + + + @Transactional + protected void initPostData() { + if (postRepository.count() > 0) return; + Member member2 = memberService.joinMentee("user2", "사용자1", "password123",""); + Member member3 = memberService.joinMentee("user3", "사용자1", "password123", ""); + Member member4 = memberService.joinMentee("user4", "사용자1", "password123", ""); + Member member5 = memberService.joinMentee("user5", "사용자1", "password123", ""); + // 여러 종류의 게시글 생성 + createPost("정보글 제목", "정보글 내용", member2, Post.PostType.INFORMATIONPOST); + createPost("연습글 제목", "연습글 내용", member3, Post.PostType.PRACTICEPOST); + createPost("질문글 제목", "질문글 내용", member4, Post.PostType.QUESTIONPOST); + } + + private void createPost(String title, String content, Member member, Post.PostType type) { + validPostType(String.valueOf(type)); + + Post post = new Post(); + post.setTitle(title); + post.setContent(content); + post.setAuthorName("테스트유저"); + post.setPostType(type); + post.setMember(member); + + postRepository.save(post); + } + + + private void validPostType(String postTypeStr) { + boolean eq = false; + + String[] validType = new String[3]; + validType[0] = "INFORMATIONPOST"; + validType[1] = "PRACTICEPOST"; + validType[2] = "QUESTIONPOST"; + + for(String x : validType) if(x.equals(postTypeStr)) eq = true; + + if(!eq) throw new ServiceException("400-2", "유효하지 않은 PostType입니다."); + } +} diff --git a/back/src/main/java/com/back/global/security/CustomAuthenticationFilter.java b/back/src/main/java/com/back/global/security/CustomAuthenticationFilter.java index 5f66e8a7..27b732be 100644 --- a/back/src/main/java/com/back/global/security/CustomAuthenticationFilter.java +++ b/back/src/main/java/com/back/global/security/CustomAuthenticationFilter.java @@ -37,6 +37,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse try { work(request, response, filterChain); } catch (Exception e) { + log.error("CustomAuthenticationFilter에서 예외 발생: ",e); RsData rsData = new RsData<>("401-1", "인증 오류가 발생했습니다."); response.setContentType("application/json;charset=UTF-8"); response.setStatus(rsData.statusCode()); diff --git a/back/src/test/java/com/back/domain/news/comment/entity/CommentTest.java b/back/src/test/java/com/back/domain/news/comment/entity/PostCommentTest.java similarity index 99% rename from back/src/test/java/com/back/domain/news/comment/entity/CommentTest.java rename to back/src/test/java/com/back/domain/news/comment/entity/PostCommentTest.java index 24706b3a..85b0d703 100644 --- a/back/src/test/java/com/back/domain/news/comment/entity/CommentTest.java +++ b/back/src/test/java/com/back/domain/news/comment/entity/PostCommentTest.java @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; -class CommentTest { +class PostCommentTest { @Test @DisplayName("사용자, 뉴스, 내용으로 댓글 객체 생성") void commentCreationTest() { @@ -104,4 +104,4 @@ void commentUpdateTestWithInvalidContent() { assertThat(e).isInstanceOf(IllegalArgumentException.class); } } -} \ No newline at end of file +} diff --git a/back/src/test/java/com/back/domain/news/comment/service/CommentServiceTest.java b/back/src/test/java/com/back/domain/news/comment/service/PostCommentServiceTest.java similarity index 99% rename from back/src/test/java/com/back/domain/news/comment/service/CommentServiceTest.java rename to back/src/test/java/com/back/domain/news/comment/service/PostCommentServiceTest.java index 6e1abca5..e43b3512 100644 --- a/back/src/test/java/com/back/domain/news/comment/service/CommentServiceTest.java +++ b/back/src/test/java/com/back/domain/news/comment/service/PostCommentServiceTest.java @@ -24,7 +24,7 @@ import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) -class CommentServiceTest { +class PostCommentServiceTest { @Mock private CommentRepository commentRepository; @@ -245,4 +245,4 @@ void deleteComment_WrongNews_ThrowsException() { verify(commentRepository, times(1)).findById(commentId); verify(commentRepository, never()).delete(any(Comment.class)); } -} \ No newline at end of file +} diff --git a/back/src/test/java/com/back/domain/post/comment/PostCommentControllerTest.java b/back/src/test/java/com/back/domain/post/comment/PostCommentControllerTest.java new file mode 100644 index 00000000..309131ac --- /dev/null +++ b/back/src/test/java/com/back/domain/post/comment/PostCommentControllerTest.java @@ -0,0 +1,100 @@ +package com.back.domain.post.comment; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.member.member.service.MemberService; +import com.back.domain.post.comment.controller.PostCommentController; +import com.back.domain.post.comment.entity.PostComment; +import com.back.domain.post.comment.repository.PostCommentRepository; +import com.back.domain.post.comment.service.PostCommentService; +import com.back.global.security.SecurityUser; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; + +import java.util.List; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@ActiveProfiles("test") +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +public class PostCommentControllerTest { + + @Autowired + private PostCommentService postCommentService; + + @Autowired + private PostCommentRepository postCommentRepository; + + @Autowired + private MemberService memberService; + + @Autowired + private MockMvc mvc; + + @BeforeEach + void setUp() { + Member member = memberService.joinMentee("user1", "사용자1", "password123", "" ); + + // SecurityContext에 인증 정보 설정 + SecurityUser securityUser = new SecurityUser( + member.getId(), + member.getEmail(), + member.getPassword(), + member.getName(), + List.of(new SimpleGrantedAuthority("ROLE_" + member.getRole().name())) + ); + + Authentication auth = new UsernamePasswordAuthenticationToken( + securityUser, + null, + securityUser.getAuthorities() + ); + + SecurityContextHolder.getContext().setAuthentication(auth); + } + + @Test + @DisplayName("댓글 생성") + void t1() throws Exception { + ResultActions resultActions = mvc + .perform( + post("/post/comment/{post_id}", 1L) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "memberId": 123, + "postId": 1, + "role": "mentor", + "comment": "댓글 내용" + } + """.stripIndent()) + ) + .andDo(print()); + + // 실제 생성된 게시글 조회 (실제 DB에서) + PostComment createdPost = postCommentRepository.findById(1L).get(); + + resultActions + .andExpect(handler().handlerType(PostCommentController.class)) + .andExpect(handler().methodName("createComment")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.msg").value("댓글 작성 완료")); + } + +} diff --git a/back/src/test/java/com/back/domain/post/controller/InformationPostControllerTest.java b/back/src/test/java/com/back/domain/post/controller/InformationPostControllerTest.java deleted file mode 100644 index ee751913..00000000 --- a/back/src/test/java/com/back/domain/post/controller/InformationPostControllerTest.java +++ /dev/null @@ -1,179 +0,0 @@ -package com.back.domain.post.controller; - -import com.back.domain.member.member.entity.Member; -import com.back.domain.member.member.service.MemberService; -import com.back.domain.post.entity.Post; -import com.back.domain.post.service.PostService; -import com.back.global.security.SecurityUser; -import jakarta.transaction.Transactional; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; - -import java.util.List; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - - -@ActiveProfiles("test") -@SpringBootTest -@AutoConfigureMockMvc -@Transactional -public class InformationPostControllerTest { - - @Autowired - private PostService postService; - -// @MockBean -// private PostService postMockService; - - @Autowired - private MemberService memberService; - - @Autowired - private MockMvc mvc; - - @BeforeEach - void setUp() { - Member member = memberService.join("user1", "사용자1", "password123", Member.Role.MENTEE); - - // SecurityContext에 인증 정보 설정 - SecurityUser securityUser = new SecurityUser( - member.getId(), - member.getEmail(), - member.getPassword(), - member.getName(), - List.of(new SimpleGrantedAuthority("ROLE_" + member.getRole().name())) - ); - - Authentication auth = new UsernamePasswordAuthenticationToken( - securityUser, - null, - securityUser.getAuthorities() - ); - - SecurityContextHolder.getContext().setAuthentication(auth); - } - - @Test - @DisplayName("게시글 생성") - void t1() throws Exception { - ResultActions resultActions = mvc - .perform( - post("/post/infor") - .contentType(MediaType.APPLICATION_JSON) - .content(""" - { - "memberId": 1, - "postType": "INFORMATIONPOST", - "title": "테스트 제목", - "content": "테스트 내용" - } - """.stripIndent()) - ) - .andDo(print()); - - // 실제 생성된 게시글 조회 (실제 DB에서) - Post createdPost = postService.findById(1L); - - resultActions - .andExpect(handler().handlerType(InformationPostController.class)) - .andExpect(handler().methodName("createPost")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.message").value("게시글이 성공적으로 생성되었습니다. ")) - .andExpect(jsonPath("$.data").exists()) - .andExpect(jsonPath("$.data.postId").value(createdPost.getId())) - .andExpect(jsonPath("$.data.title").value(createdPost.getTitle())); - } - - @Test - @DisplayName("일치하지 않는 postType") - void t2() throws Exception { - ResultActions resultActions = mvc - .perform( - post("/post/infor") - .contentType(MediaType.APPLICATION_JSON) - .content(""" - { - "memberId": 3, - "postType": "INFORMATIONPOST12", - "title": "테스트 제목", - "content": "테스트 내용" - } - """.stripIndent()) - ) - .andDo(print()); - - resultActions - .andExpect(handler().handlerType(InformationPostController.class)) - .andExpect(handler().methodName("createPost")) - .andExpect(status().isBadRequest()) - .andExpect(jsonPath("$.resultCode").value("400-2")) - .andExpect(jsonPath("$.msg").value("유효하지 않은 PostType입니다.")); - } - - @Test - @DisplayName("게시글 다건조회") - void t3() throws Exception { - ResultActions resultActions = mvc - .perform( - get("/post/infor") - ) - .andDo(print()); - - - resultActions - .andExpect(handler().handlerType(InformationPostController.class)) - .andExpect(handler().methodName("getAllPost")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.data").isArray()) - .andExpect(jsonPath("$.message").value("게시글 다건 조회 성공")) - .andExpect(jsonPath("$.data").exists()); - } - -// @Test -// @DisplayName("게시글 단건조회") -// void t4() throws Exception { -// Post mockPost = new Post(); -// -// // 리플렉션으로 ID 설정 -// Field idField = BaseEntity.class.getDeclaredField("id"); -// idField.setAccessible(true); -// idField.set(mockPost, 1L); -// -// mockPost.setTitle("테스트 제목"); -// mockPost.setContent("테스트 내용"); -// mockPost.setAuthorName("테스트유저"); -// mockPost.setPostType(Post.PostType.INFORMATIONPOST); -// -// when(postService.findById(1L)).thenReturn(mockPost); -// -// ResultActions resultActions = mvc -// .perform( -// get("/post/infor/{post_id}", 1L) -// ) -// .andDo(print()); -// -// -// resultActions -// .andExpect(handler().handlerType(InformationPostController.class)) -// .andExpect(handler().methodName("getSinglePost")) -// .andExpect(status().isOk()) -// .andExpect(jsonPath("$.message").value("게시글 단건 조회 성공")) -// .andExpect(jsonPath("$.data").exists()); -// } -} diff --git a/back/src/test/java/com/back/domain/post/post/controller/InformationPostControllerTest.java b/back/src/test/java/com/back/domain/post/post/controller/InformationPostControllerTest.java new file mode 100644 index 00000000..9a4af6c9 --- /dev/null +++ b/back/src/test/java/com/back/domain/post/post/controller/InformationPostControllerTest.java @@ -0,0 +1,336 @@ +package com.back.domain.post.post.controller; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.member.member.service.MemberService; +import com.back.domain.post.post.entity.Post; +import com.back.domain.post.post.service.PostService; +import com.back.global.security.SecurityUser; +import jakarta.transaction.Transactional; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; + +import java.util.List; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + + +@ActiveProfiles("test") +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +public class InformationPostControllerTest { + + @Autowired + private PostService postService; + + @Autowired + private MemberService memberService; + + @Autowired + private MockMvc mvc; + + @BeforeEach + void setUp() { + Member member = memberService.joinMentee("user1", "사용자1", "password123", ""); + + // SecurityContext에 인증 정보 설정 + SecurityUser securityUser = new SecurityUser( + member.getId(), + member.getEmail(), + member.getPassword(), + member.getName(), + List.of(new SimpleGrantedAuthority("ROLE_" + member.getRole().name())) + ); + + Authentication auth = new UsernamePasswordAuthenticationToken( + securityUser, + null, + securityUser.getAuthorities() + ); + + SecurityContextHolder.getContext().setAuthentication(auth); + } + + @Test + @DisplayName("게시글 생성") + void t1() throws Exception { + ResultActions resultActions = mvc + .perform( + post("/post/infor") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "memberId": 1, + "postType": "QUESTIONPOST", + "title": "테스트 제목", + "content": "테스트 내용" + } + """.stripIndent()) + ) + .andDo(print()); + + // 실제 생성된 게시글 조회 (실제 DB에서) + Post createdPost = postService.findById(4L); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("createPost")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.msg").value("게시글이 성공적으로 생성되었습니다.")) + .andExpect(jsonPath("$.data").exists()) + .andExpect(jsonPath("$.data.postId").value(createdPost.getId())) + .andExpect(jsonPath("$.data.title").value(createdPost.getTitle())); + } + + @Test + @DisplayName("게시글 생성 실패 - 제목 null") + void t6() throws Exception { + ResultActions resultActions = mvc + .perform( + post("/post/infor") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "memberId": 1, + "postType": "INFORMATIONPOST", + "title": "", + "content": "테스트 내용" + } + """.stripIndent()) + ) + .andDo(print()); + + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("createPost")) + + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.msg").value("title-NotBlank-제목은 null 혹은 공백일 수 없습니다.")); + } + + @Test + @DisplayName("일치하지 않는 postType") + void t2() throws Exception { + ResultActions resultActions = mvc + .perform( + post("/post/infor") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "memberId": 3, + "postType": "INFORMATIONPOST12", + "title": "테스트 제목", + "content": "테스트 내용" + } + """.stripIndent()) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("createPost")) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.resultCode").value("400-2")) + .andExpect(jsonPath("$.msg").value("유효하지 않은 PostType입니다.")); + } + + @Test + @DisplayName("게시글 다건조회") + void t3() throws Exception { + ResultActions resultActions = mvc + .perform( + get("/post/infor") + ) + .andDo(print()); + + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("getAllPost")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.data").isArray()) + .andExpect(jsonPath("$.msg").value("게시글 다건 조회 성공")) + .andExpect(jsonPath("$.data").exists()); + } + + @Test + @DisplayName("게시글 단건조회") + void t4() throws Exception { + ResultActions resultActions = mvc + .perform( + get("/post/infor/{post_id}", 1L) + ) + .andDo(print()); + + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("getSinglePost")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.msg").value("게시글 단건 조회 성공")) + .andExpect(jsonPath("$.data.id").value(1L)) + .andExpect(jsonPath("$.data.title").value("정보글 제목")) + .andExpect(jsonPath("$.data").exists()); + } + + @Test + @DisplayName("게시글 단건조회 실패 - 유효하지 않은 Id") + void t5() throws Exception { + ResultActions resultActions = mvc + .perform( + get("/post/infor/{post_id}", 999L) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("getSinglePost")) + .andExpect(jsonPath("$.resultCode").value("400")) + .andExpect(jsonPath("$.msg").value("해당 Id의 게시글이 없습니다.")); + } + + @Test + @DisplayName("게시글 삭제") + void t7() throws Exception { + mvc.perform( + post("/post/infor") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "memberId": 1, + "postType": "INFORMATIONPOST", + "title": "삭제용 제목", + "content": "삭제용 내용" + } + """) + ); + + + ResultActions resultActions = mvc + .perform( + delete("/post/infor/{post_id}", 5L) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("removePost")) + .andExpect(jsonPath("$.resultCode").value("200")) + .andExpect(jsonPath("$.msg").value("게시글 삭제 성공")); + } + + @Test + @DisplayName("게시글 삭제 실패 - 권한 없는 사용자") + void t8() throws Exception { + ResultActions resultActions = mvc + .perform( + delete("/post/infor/{post_id}", 3L) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("removePost")) + .andExpect(jsonPath("$.resultCode").value("400")) + .andExpect(jsonPath("$.msg").value("삭제 권한이 없습니다.")); + } + + @Test + @DisplayName("게시글 수정") + void t9() throws Exception { + mvc.perform( + post("/post/infor") + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "memberId": 1, + "postType": "INFORMATIONPOST", + "title": "삭제용 제목", + "content": "삭제용 내용" + } + """) + ); + + + ResultActions resultActions = mvc + .perform( + put("/post/infor/{post_id}", 6L) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "title": "수정용 제목", + "content": "수정용 내용" + } + """) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("updatePost")) + .andExpect(jsonPath("$.resultCode").value("200")) + .andExpect(jsonPath("$.msg").value("게시글 수정 성공")); + } + + @Test + @DisplayName("게시글 수정 실패 - 권한 없는 사용자") + void t10() throws Exception { + ResultActions resultActions = mvc + .perform( + put("/post/infor/{post_id}", 2L) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "title": "수정용 제목", + "content": "수정용 내용" + } + """) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("updatePost")) + .andExpect(jsonPath("$.resultCode").value("400")) + .andExpect(jsonPath("$.msg").value("수정 권한이 없습니다.")); + } + + @Test + @DisplayName("게시글 수정 실패 - title blank") + void t11() throws Exception { + ResultActions resultActions = mvc + .perform( + put("/post/infor/{post_id}", 6L) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "title": "", + "content": "수정용 내용" + } + """) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("updatePost")) + .andExpect(jsonPath("$.resultCode").value("400-1")) + .andExpect(jsonPath("$.msg").value("title-NotBlank-제목은 null 혹은 공백일 수 없습니다.")); + } + +}