diff --git a/pochak/src/main/java/com/apps/pochak/comment/domain/repository/CommentRepository.java b/pochak/src/main/java/com/apps/pochak/comment/domain/repository/CommentRepository.java index a5755299..9ea1553b 100644 --- a/pochak/src/main/java/com/apps/pochak/comment/domain/repository/CommentRepository.java +++ b/pochak/src/main/java/com/apps/pochak/comment/domain/repository/CommentRepository.java @@ -3,12 +3,18 @@ import com.apps.pochak.comment.domain.Comment; import com.apps.pochak.post.domain.Post; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; - import java.util.Optional; public interface CommentRepository extends JpaRepository { + + @Modifying + @Query("update Comment c set c.status = 'DELETED' " + + "where c.post = :post ") + void bulkDeleteByPost(@Param("post") final Post post); + @Query("select c from Comment c " + "join fetch c.member " + "where c.post = :post " + diff --git a/pochak/src/main/java/com/apps/pochak/global/apiPayload/code/status/ErrorStatus.java b/pochak/src/main/java/com/apps/pochak/global/apiPayload/code/status/ErrorStatus.java index 7b1842cc..057e4ce9 100644 --- a/pochak/src/main/java/com/apps/pochak/global/apiPayload/code/status/ErrorStatus.java +++ b/pochak/src/main/java/com/apps/pochak/global/apiPayload/code/status/ErrorStatus.java @@ -49,8 +49,9 @@ public enum ErrorStatus implements BaseErrorCode { INVALID_MEMBER_HANDLE(BAD_REQUEST, "MEMBER4001", "유효하지 않은 멤버의 handle입니다."), // Post - INVALID_POST_ID(BAD_REQUEST, "POST4001", "유효하지 않은 POST ID 입니다."), - PRIVATE_POST(BAD_REQUEST, "POST4002", "공개되지 않은 게시물입니다. 접근 권한이 없습니다."), + INVALID_POST_ID(BAD_REQUEST, "POST4001", "유효하지 않은 게시물 아이디입니다."), + NOT_YOUR_POST(UNAUTHORIZED, "POST4002", "해당 게시물의 삭제 권한이 없습니다."), + PRIVATE_POST(UNAUTHORIZED, "POST4003", "공개되지 않은 게시물입니다. 접근 권한이 없습니다."), // Tag diff --git a/pochak/src/main/java/com/apps/pochak/post/controller/PostController.java b/pochak/src/main/java/com/apps/pochak/post/controller/PostController.java index 214fe58c..d4c18883 100644 --- a/pochak/src/main/java/com/apps/pochak/post/controller/PostController.java +++ b/pochak/src/main/java/com/apps/pochak/post/controller/PostController.java @@ -8,6 +8,10 @@ import com.apps.pochak.post.service.PostService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -21,6 +25,12 @@ public class PostController { private final PostService postService; private final LikeService likeService; + @DeleteMapping("/{postId}") + public ApiResponse deletePost(@PathVariable final Long postId) { + postService.deletePost(postId); + return ApiResponse.onSuccess(null); + } + @GetMapping("/{postId}") public ApiResponse getPostDetail( @PathVariable("postId") final Long postId @@ -36,6 +46,5 @@ public ApiResponse uploadPost( ) { postService.savePost(postImage, request); return ApiResponse.onSuccess(null); - } } diff --git a/pochak/src/main/java/com/apps/pochak/post/service/PostService.java b/pochak/src/main/java/com/apps/pochak/post/service/PostService.java index dc9e4f6a..25d13e45 100644 --- a/pochak/src/main/java/com/apps/pochak/post/service/PostService.java +++ b/pochak/src/main/java/com/apps/pochak/post/service/PostService.java @@ -1,6 +1,11 @@ package com.apps.pochak.post.service; - +import com.apps.pochak.comment.domain.repository.CommentRepository; +import com.apps.pochak.global.apiPayload.exception.GeneralException; +import com.apps.pochak.login.jwt.JwtService; +import com.apps.pochak.member.domain.Member; +import com.apps.pochak.post.domain.Post; +import com.apps.pochak.post.domain.repository.PostRepository; import com.apps.pochak.alarm.domain.TagApprovalAlarm; import com.apps.pochak.alarm.domain.repository.AlarmRepository; import com.apps.pochak.comment.domain.Comment; @@ -29,6 +34,9 @@ import static com.apps.pochak.global.apiPayload.code.status.ErrorStatus.PRIVATE_POST; import static com.apps.pochak.global.s3.DirName.POST; +import static com.apps.pochak.global.apiPayload.code.status.ErrorStatus.INVALID_POST_ID; +import static com.apps.pochak.global.apiPayload.code.status.ErrorStatus.NOT_YOUR_POST; + @Service @RequiredArgsConstructor public class PostService { @@ -43,6 +51,17 @@ public class PostService { private final S3Service s3Service; private final JwtService jwtService; + @Transactional + public void deletePost(final Long postId) { + final Member loginMember = jwtService.getLoginMember(); + final Post post = postRepository.findById(postId).orElseThrow(() -> new GeneralException(INVALID_POST_ID)); + if (!post.getOwner().getId().equals(loginMember.getId())) { + throw new GeneralException(NOT_YOUR_POST); + } + postRepository.delete(post); + commentRepository.bulkDeleteByPost(post); + } + public PostDetailResponse getPostDetail(final Long postId) { final Member loginMember = jwtService.getLoginMember(); final Post post = postRepository.findPostById(postId);