From ca0e607c1f4852de484440451be88ebda3f00421 Mon Sep 17 00:00:00 2001 From: Taehun88 Date: Wed, 12 Feb 2025 20:41:21 +0900 Subject: [PATCH 1/2] feat:delete project --- .../prdoit/controller/ProjectController.java | 12 ++++++++++++ .../prdoit/model/ProjectLevelContentTable.java | 5 ++++- .../com/example/prdoit/model/ProjectTable.java | 4 +++- .../prdoit/service/project/ProjectService.java | 2 ++ .../service/project/ProjectServiceImpl.java | 15 +++++++++++++++ 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/prdoit/controller/ProjectController.java b/src/main/java/com/example/prdoit/controller/ProjectController.java index a5e4bfe..12b343f 100644 --- a/src/main/java/com/example/prdoit/controller/ProjectController.java +++ b/src/main/java/com/example/prdoit/controller/ProjectController.java @@ -123,6 +123,18 @@ public ResponseEntity getBurndownList(@PathVariable String projectId, @P } } + @DeleteMapping("/{projectId}") + public ResponseEntity deleteProject(@PathVariable String projectId) { + log.info("[deleteProject] 프로젝트 삭제 요청"); + try{ + projectService.deleteProject(projectId); + return ResponseEntity.ok("프로젝트 삭제에 성공했습니다."); + } catch (RuntimeException e){ + log.error("[deleteProject] {}", e.getMessage()); + return ResponseEntity.badRequest().body("프로젝트 삭제에 실패했습니다."); + } + } + /* @PutMapping("/product") public ResponseEntity putBacklog(@RequestBody BacklogPutDto backlogPutDto) { diff --git a/src/main/java/com/example/prdoit/model/ProjectLevelContentTable.java b/src/main/java/com/example/prdoit/model/ProjectLevelContentTable.java index 1111202..ced6314 100644 --- a/src/main/java/com/example/prdoit/model/ProjectLevelContentTable.java +++ b/src/main/java/com/example/prdoit/model/ProjectLevelContentTable.java @@ -27,5 +27,8 @@ public class ProjectLevelContentTable { @ManyToOne @JoinColumn(name = "projectId") private ProjectTable projectId; - + + @OneToMany(mappedBy = "levelContentId", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) + @JsonIgnore + private List backlogList; } diff --git a/src/main/java/com/example/prdoit/model/ProjectTable.java b/src/main/java/com/example/prdoit/model/ProjectTable.java index ded09af..76fa126 100644 --- a/src/main/java/com/example/prdoit/model/ProjectTable.java +++ b/src/main/java/com/example/prdoit/model/ProjectTable.java @@ -44,5 +44,7 @@ public class ProjectTable { @JoinColumn(name = "id") private IdTable id; - + @OneToMany(mappedBy = "projectId", cascade = CascadeType.REMOVE, orphanRemoval = true, fetch = FetchType.EAGER) + @JsonIgnore + private List projectLevelContentList; } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectService.java b/src/main/java/com/example/prdoit/service/project/ProjectService.java index 4d71133..2e08e90 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectService.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectService.java @@ -25,4 +25,6 @@ public interface ProjectService { void deleteProjectContent(ContentDeleteDto contentDeleteDto); BacklogAddDto getBacklog(String projectId, String backlogTaskId); + + void deleteProject(String projectId); } diff --git a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java index 17c1ab7..cc221aa 100644 --- a/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java +++ b/src/main/java/com/example/prdoit/service/project/ProjectServiceImpl.java @@ -227,6 +227,21 @@ public BacklogAddDto getBacklog(String projectId, String backlogTaskId) { } + @Override + public void deleteProject(String projectId) { + log.info("[deleteProject] 프로젝트 삭제 시작"); + ProjectTable projectTable = projectTableRepository.findById(projectId).orElseThrow(() -> new CustomException("존재하지 않는 프로젝트입니다.")); + try { + projectTableRepository.delete(projectTable); + } catch (CustomException e) { + log.error(e.getMessage()); + throw new CustomException(e.getMessage()); + } catch (RuntimeException e) { + log.error(e.getMessage()); + throw e; + } + } + // internal method //ContentDto를 받아서 ProjectLevelContentTable을 생성 public ProjectLevelContentTable createContent(String projectId, int projectLevel, String projectContent) { From a48fdb928f150396cf985030b617946b4f69c3aa Mon Sep 17 00:00:00 2001 From: pureumq Date: Wed, 19 Feb 2025 12:26:33 +0900 Subject: [PATCH 2/2] feat --- .../prdoit/controller/CommentController.java | 51 ++++++++ .../prdoit/dto/comment/CommentPatchDto.java | 17 +++ .../dto/comment/CommentReplyPatchDto.java | 17 +++ .../dto/comment/CommentReplyRequestDto.java | 18 +++ .../dto/comment/CommentReplyResponseDto.java | 18 +++ .../prdoit/dto/comment/CommentRequestDto.java | 18 +++ .../dto/comment/CommentResponseDto.java | 20 +++ .../service/comment/CommentService.java | 18 +++ .../service/comment/CommentServiceImpl.java | 120 ++++++++++++++++++ 9 files changed, 297 insertions(+) create mode 100644 src/main/java/com/example/prdoit/controller/CommentController.java create mode 100644 src/main/java/com/example/prdoit/dto/comment/CommentPatchDto.java create mode 100644 src/main/java/com/example/prdoit/dto/comment/CommentReplyPatchDto.java create mode 100644 src/main/java/com/example/prdoit/dto/comment/CommentReplyRequestDto.java create mode 100644 src/main/java/com/example/prdoit/dto/comment/CommentReplyResponseDto.java create mode 100644 src/main/java/com/example/prdoit/dto/comment/CommentRequestDto.java create mode 100644 src/main/java/com/example/prdoit/dto/comment/CommentResponseDto.java create mode 100644 src/main/java/com/example/prdoit/service/comment/CommentService.java create mode 100644 src/main/java/com/example/prdoit/service/comment/CommentServiceImpl.java diff --git a/src/main/java/com/example/prdoit/controller/CommentController.java b/src/main/java/com/example/prdoit/controller/CommentController.java new file mode 100644 index 0000000..89bed6d --- /dev/null +++ b/src/main/java/com/example/prdoit/controller/CommentController.java @@ -0,0 +1,51 @@ +package com.example.prdoit.controller; + +import com.example.prdoit.dto.comment.*; +import com.example.prdoit.service.comment.CommentService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/comments") +public class CommentController { + + private final CommentService commentService; + + // 1. 댓글 조회 + @GetMapping("/{contentId}") + public ResponseEntity> getComments(@PathVariable String contentId) { + return ResponseEntity.ok(commentService.getCommentList(contentId)); + } + + // 2. 댓글 작성 + @PostMapping + public ResponseEntity createComment(@RequestBody CommentRequestDto commentRequestDto) { + commentService.postComment(commentRequestDto); + return ResponseEntity.ok("댓글이 성공적으로 작성되었습니다!"); + } + + // 3. 대댓글 작성 + @PostMapping("/reply") + public ResponseEntity createReply(@RequestBody CommentReplyRequestDto commentReplyRequestDto) { + commentService.postCommentReply(commentReplyRequestDto); + return ResponseEntity.ok("대댓글이 성공적으로 작성되었습니다!"); + } + + // 4. 댓글 수정 + @PatchMapping + public ResponseEntity updateComment(@RequestBody CommentPatchDto commentPatchDto) { + commentService.patchComment(commentPatchDto); + return ResponseEntity.ok("댓글이 성공적으로 수정되었습니다!"); + } + + // 5.대댓글 수정 + @PatchMapping("/reply") + public ResponseEntity updateReply(@RequestBody CommentReplyPatchDto commentReplyPatchDto) { + commentService.patchCommentReply(commentReplyPatchDto); + return ResponseEntity.ok("대댓글이 성공적으로 수정되었습니다!"); + } +} diff --git a/src/main/java/com/example/prdoit/dto/comment/CommentPatchDto.java b/src/main/java/com/example/prdoit/dto/comment/CommentPatchDto.java new file mode 100644 index 0000000..dabb6e7 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/comment/CommentPatchDto.java @@ -0,0 +1,17 @@ +package com.example.prdoit.dto.comment; + +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentPatchDto { + + private int commentId; // 수정할 댓글 ID + private String commentContent; // 수정된 댓글 내용 + private LocalDateTime commentDate; // 수정된 날짜 +} diff --git a/src/main/java/com/example/prdoit/dto/comment/CommentReplyPatchDto.java b/src/main/java/com/example/prdoit/dto/comment/CommentReplyPatchDto.java new file mode 100644 index 0000000..339a517 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/comment/CommentReplyPatchDto.java @@ -0,0 +1,17 @@ +package com.example.prdoit.dto.comment; + +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentReplyPatchDto { + + private int commentReplyId; // 수정할 대댓글 ID + private String commentReplyContent; // 수정된 대댓글 내용 + private LocalDateTime commentReplyDate; // 수정된 날짜 +} diff --git a/src/main/java/com/example/prdoit/dto/comment/CommentReplyRequestDto.java b/src/main/java/com/example/prdoit/dto/comment/CommentReplyRequestDto.java new file mode 100644 index 0000000..53e4532 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/comment/CommentReplyRequestDto.java @@ -0,0 +1,18 @@ +package com.example.prdoit.dto.comment; + +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentReplyRequestDto { + + private int commentId; // 대댓글이 달릴 원본 댓글 ID + private String commentReplyContent; // 대댓글 내용 + private String commentReplyNickname; // 대댓글 작성자 닉네임 + private LocalDateTime commentReplyDate; // 대댓글 작성 날짜 +} diff --git a/src/main/java/com/example/prdoit/dto/comment/CommentReplyResponseDto.java b/src/main/java/com/example/prdoit/dto/comment/CommentReplyResponseDto.java new file mode 100644 index 0000000..ff2649d --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/comment/CommentReplyResponseDto.java @@ -0,0 +1,18 @@ +package com.example.prdoit.dto.comment; + +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentReplyResponseDto { + + private int commentReplyId; // 대댓글 ID + private String commentReplyContent; // 대댓글 내용 + private String commentReplyNickname; // 작성자 닉네임 + private LocalDateTime commentReplyDate; // 대댓글 작성 날짜 +} diff --git a/src/main/java/com/example/prdoit/dto/comment/CommentRequestDto.java b/src/main/java/com/example/prdoit/dto/comment/CommentRequestDto.java new file mode 100644 index 0000000..f74a319 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/comment/CommentRequestDto.java @@ -0,0 +1,18 @@ +package com.example.prdoit.dto.comment; + +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentRequestDto { + + private String contentId; // 댓글 달릴 게시글 ID + private String commentContent; // 댓글 내용 + private String commentNickname; // 댓글 작성자 닉네임 + private LocalDateTime commentDate; // 댓글 작성 날짜 +} diff --git a/src/main/java/com/example/prdoit/dto/comment/CommentResponseDto.java b/src/main/java/com/example/prdoit/dto/comment/CommentResponseDto.java new file mode 100644 index 0000000..8068c06 --- /dev/null +++ b/src/main/java/com/example/prdoit/dto/comment/CommentResponseDto.java @@ -0,0 +1,20 @@ +package com.example.prdoit.dto.comment; + +import lombok.*; + +import java.time.LocalDateTime; +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentResponseDto { + + private int commentId; // 댓글 ID + private String commentContent; // 댓글 내용 + private String commentNickname; // 작성자 닉네임 + private LocalDateTime commentDate; // 댓글 작성 날짜 + private List commentReplyResponseDtoList; // 대댓글 리스트 +} diff --git a/src/main/java/com/example/prdoit/service/comment/CommentService.java b/src/main/java/com/example/prdoit/service/comment/CommentService.java new file mode 100644 index 0000000..ab6a0ef --- /dev/null +++ b/src/main/java/com/example/prdoit/service/comment/CommentService.java @@ -0,0 +1,18 @@ +package com.example.prdoit.service.comment; + +import com.example.prdoit.dto.comment.*; + +import java.util.List; + +public interface CommentService { + + List getCommentList(String contentId); + + void postComment(CommentRequestDto commentRequestDto); + + void postCommentReply(CommentReplyRequestDto commentReplyRequestDto); + + void patchComment(CommentPatchDto commentPatchDto); + + void patchCommentReply(CommentReplyPatchDto commentReplyPatchDto); +} diff --git a/src/main/java/com/example/prdoit/service/comment/CommentServiceImpl.java b/src/main/java/com/example/prdoit/service/comment/CommentServiceImpl.java new file mode 100644 index 0000000..5b20c61 --- /dev/null +++ b/src/main/java/com/example/prdoit/service/comment/CommentServiceImpl.java @@ -0,0 +1,120 @@ +package com.example.prdoit.service.comment; + +import com.example.prdoit.dto.comment.*; +import com.example.prdoit.exception.CustomException; +import com.example.prdoit.model.CommentCommentTable; +import com.example.prdoit.model.CommentTable; +import com.example.prdoit.model.ContentTable; +import com.example.prdoit.repository.CommentCommentTableRepository; +import com.example.prdoit.repository.CommentTableRepository; +import com.example.prdoit.repository.ContentTableRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Slf4j +@RequiredArgsConstructor +@Transactional +public class CommentServiceImpl implements CommentService { + + private final CommentTableRepository commentTableRepository; + private final CommentCommentTableRepository commentCommentTableRepository; + private final ContentTableRepository contentTableRepository; + + // 1. 댓글 목록 조회 (GET) + @Override + public List getCommentList(String contentId) { + log.info("[getCommentList] 댓글 목록 조회 시작 - Content ID: {}", contentId); + + ContentTable contentTable = contentTableRepository.findById(contentId) + .orElseThrow(() -> new CustomException("해당 게시글이 없습니다. ID = " + contentId)); + + return contentTable.getCommentTable().stream() + .map(comment -> CommentResponseDto.builder() + .commentId(comment.getCommentId()) + .commentContent(comment.getCommentContent()) + .commentNickname(comment.getCommentNickname()) + .commentDate(comment.getCommentDate()) + .commentReplyResponseDtoList(comment.getCommentCommentTable().stream() + .map(reply -> CommentReplyResponseDto.builder() + .commentReplyId(reply.getCommentCommentId()) + .commentReplyContent(reply.getCommentCommentContent()) + .commentReplyNickname(reply.getUserNickname()) + .commentReplyDate(reply.getCommentCommentDate()) + .build()) + .collect(Collectors.toList())) + .build()) + .collect(Collectors.toList()); + } + + // 2. 댓글 작성 (POST) + @Override + public void postComment(CommentRequestDto commentRequestDto) { + log.info("[postComment] 댓글 등록 시작 - Content ID: {}", commentRequestDto.getContentId()); + + ContentTable contentTable = contentTableRepository.findById(commentRequestDto.getContentId()) + .orElseThrow(() -> new CustomException("해당 게시글이 없습니다.")); + + commentTableRepository.save(CommentTable.builder() + .commentContent(commentRequestDto.getCommentContent()) + .commentNickname(commentRequestDto.getCommentNickname()) + .commentDate(commentRequestDto.getCommentDate()) + .contentId(contentTable) + .build()); + + log.info("[postComment] 댓글 등록을 완료했습니다."); + } + + // 3. 대댓글 작성 (POST) + @Override + public void postCommentReply(CommentReplyRequestDto commentReplyRequestDto) { + log.info("[postCommentReply] 대댓글 등록 시작"); + + CommentTable parentComment = commentTableRepository.findById(commentReplyRequestDto.getCommentId()) + .orElseThrow(() -> new CustomException("해당 댓글이 없습니다.")); + + commentCommentTableRepository.save(CommentCommentTable.builder() + .commentCommentContent(commentReplyRequestDto.getCommentReplyContent()) + .userNickname(commentReplyRequestDto.getCommentReplyNickname()) + .commentCommentDate(commentReplyRequestDto.getCommentReplyDate()) + .commentId(parentComment) + .build()); + + log.info("[postCommentReply] 대댓글 등록을 완료했습니다."); + } + + // 4. 댓글 수정 (PATCH) + @Override + public void patchComment(CommentPatchDto commentPatchDto) { + log.info("[patchComment] 댓글 수정 시작 - Comment ID: {}", commentPatchDto.getCommentId()); + + CommentTable comment = commentTableRepository.findById(commentPatchDto.getCommentId()) + .orElseThrow(() -> new CustomException("해당 댓글이 없습니다.")); + + comment.setCommentContent(commentPatchDto.getCommentContent()); + comment.setCommentDate(commentPatchDto.getCommentDate()); + commentTableRepository.save(comment); + + log.info("[patchComment] 댓글 수정이 완료되었습니다."); + } + + // 5. 대댓글 수정 (PATCH) + @Override + public void patchCommentReply(CommentReplyPatchDto commentReplyPatchDto) { + log.info("[patchCommentReply] 대댓글 수정 시작 - CommentReply ID: {}", commentReplyPatchDto.getCommentReplyId()); + + CommentCommentTable reply = commentCommentTableRepository.findById(commentReplyPatchDto.getCommentReplyId()) + .orElseThrow(() -> new CustomException("해당 대댓글이 없습니다.")); + + reply.setCommentCommentContent(commentReplyPatchDto.getCommentReplyContent()); + reply.setCommentCommentDate(commentReplyPatchDto.getCommentReplyDate()); + commentCommentTableRepository.save(reply); + + log.info("[patchCommentReply] 대댓글 수정이 완료되었습니다."); + } +}