diff --git a/src/main/java/store/itpick/backend/common/response/status/BaseExceptionResponseStatus.java b/src/main/java/store/itpick/backend/common/response/status/BaseExceptionResponseStatus.java index 50ff7cb..545fa5f 100644 --- a/src/main/java/store/itpick/backend/common/response/status/BaseExceptionResponseStatus.java +++ b/src/main/java/store/itpick/backend/common/response/status/BaseExceptionResponseStatus.java @@ -72,6 +72,8 @@ public enum BaseExceptionResponseStatus implements ResponseStatus { COMMENT_NOT_FOUND(6005,HttpStatus.BAD_REQUEST.value(), "해당 댓글이 존재하지 않습니다."), KEYWORD_NOT_FOUND(6006,HttpStatus.BAD_REQUEST.value(), "해당 키워드가 존재하지 않습니다."), INVALID_GET_DEBATE_VALUE(6007,HttpStatus.BAD_REQUEST.value(), "토론 상세 정보 요청에서 잘못된 값이 존재합니다."), + INVALID_USER_ID(6008,HttpStatus.BAD_REQUEST.value(), "다른 유저의 토론을 지울 수 없습니다."), + DELETED_DEBATE(6009,HttpStatus.BAD_REQUEST.value(), "이미 삭제된 토론입니다."), diff --git a/src/main/java/store/itpick/backend/controller/DebateController.java b/src/main/java/store/itpick/backend/controller/DebateController.java index 516498f..763c889 100644 --- a/src/main/java/store/itpick/backend/controller/DebateController.java +++ b/src/main/java/store/itpick/backend/controller/DebateController.java @@ -116,4 +116,11 @@ public BaseResponse> getRecentViewedDebate(@RequestHead return new BaseResponse<>(debateResponse); } + + + @DeleteMapping("/{debateId}") + public BaseResponse deleteDebate(@PreAuthorize long userId, @PathVariable Long debateId){ + debateService.deleteDebate(debateId,userId); + return new BaseResponse<>(null); + } } diff --git a/src/main/java/store/itpick/backend/dto/user/GetMyPageResponse.java b/src/main/java/store/itpick/backend/dto/user/GetMyPageResponse.java index 3606942..dd24dc9 100644 --- a/src/main/java/store/itpick/backend/dto/user/GetMyPageResponse.java +++ b/src/main/java/store/itpick/backend/dto/user/GetMyPageResponse.java @@ -35,6 +35,7 @@ public static class MyDebate { private String title; private String keyword; private String duration; + private Long debateId; private Long hits; private Long comments; } @@ -46,6 +47,7 @@ public static class InvolvedDebate { private String title; private String keyword; private String duration; + private Long debateId; private Long hits; private Long comments; } diff --git a/src/main/java/store/itpick/backend/repository/DebateRepository.java b/src/main/java/store/itpick/backend/repository/DebateRepository.java index 7502ce9..f117f4c 100644 --- a/src/main/java/store/itpick/backend/repository/DebateRepository.java +++ b/src/main/java/store/itpick/backend/repository/DebateRepository.java @@ -1,6 +1,7 @@ package store.itpick.backend.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import org.springframework.data.repository.query.Param; @@ -31,4 +32,11 @@ public interface DebateRepository extends JpaRepository { "WHERE uvc.user = :user") List findDebatesByUserVoteChoice(@Param("user") User user); + @Modifying + @Query("UPDATE Debate d SET d.status = 'deleted' WHERE d.debateId = :debate_id") + void softDeleteById(@Param("debate_id") Long debate_id); + + Optional getDebateByDebateId(Long debateId); + + } diff --git a/src/main/java/store/itpick/backend/service/DebateService.java b/src/main/java/store/itpick/backend/service/DebateService.java index 4f985c4..177f6b9 100644 --- a/src/main/java/store/itpick/backend/service/DebateService.java +++ b/src/main/java/store/itpick/backend/service/DebateService.java @@ -151,6 +151,8 @@ public GetDebateResponse getDebate(Long debateId, String token) { Debate debate = debateRepository.findById(debateId) .orElseThrow(() -> new DebateException(DEBATE_NOT_FOUND)); + if(debate.getStatus().equals("deleted")) throw new DebateException(DEBATE_NOT_FOUND); + // 최근 본 토론 기록 생성 및 저장 saveRecentViewedDebate(userId, debate); @@ -220,7 +222,7 @@ public GetDebateResponse getDebate(Long debateId, String token) { .userVoteOptionText(userVoteOptionText) .build(); } - + @Transactional public List GetDebatesByKeyword(Long keywordID, String sort){ List debates=null; @@ -233,12 +235,14 @@ public List GetDebatesByKeyword(Long keywordID, String sort) List debateList = new ArrayList<>(); for (Debate debate : debates) { - String title= debate.getTitle(); - String content =debate.getContent(); - String mediaUrl =debate.getImageUrl(); - Long hit = debate.getHits(); - Long comment = (long) debate.getComment().size(); - debateList.add(new DebateByKeywordDTO(title,content,mediaUrl,hit,comment)); + if(debate.getStatus().equals("active")){ + String title= debate.getTitle(); + String content =debate.getContent(); + String mediaUrl =debate.getImageUrl(); + Long hit = debate.getHits(); + Long comment = (long) debate.getComment().size(); + debateList.add(new DebateByKeywordDTO(title,content,mediaUrl,hit,comment)); + } } return debateList; @@ -274,9 +278,32 @@ public List getRecentViewedDebate(String token){ // Debate를 DTO로 변환 return debates.stream() + .filter(debate -> "active".equals(debate.getStatus())) .map(debate -> new DebateByKeywordDTO(debate.getTitle(), debate.getContent(), debate.getImageUrl(),debate.getHits(), (long) debate.getComment().size())) .collect(Collectors.toList()); } + @Transactional + public void deleteDebate(Long debateId, long userId) { + Optional debate = debateRepository.getDebateByDebateId(debateId); + + if (debate.isEmpty()) { + throw new DebateException(DEBATE_NOT_FOUND); + } + + if (!debate.get().getUser().getUserId().equals(userId)) { + throw new DebateException(INVALID_USER_ID); + } + + if(debate.get().getStatus().equals("deleted")){ + throw new DebateException(DELETED_DEBATE); + } + + + debateRepository.softDeleteById(debateId); + + + } + } diff --git a/src/main/java/store/itpick/backend/service/UserService.java b/src/main/java/store/itpick/backend/service/UserService.java index df1dcb1..33b63a7 100644 --- a/src/main/java/store/itpick/backend/service/UserService.java +++ b/src/main/java/store/itpick/backend/service/UserService.java @@ -194,6 +194,7 @@ public List getMyDebate(long userId) { // 최근 순으로 정렬 List sortedDebates = myDebateList.stream() + .filter(debate -> "active".equals(debate.getStatus())) .sorted((d1, d2) -> d2.getCreateAt().compareTo(d1.getCreateAt())) .toList(); @@ -205,6 +206,7 @@ public List getMyDebate(long userId) { .keyword(myDebate.getKeyword().getKeyword()) .duration(getTimeAgo(myDebate.getCreateAt())) .hits(myDebate.getHits()) + .debateId(myDebate.getDebateId()) .comments(debateRepository.countCommentsByDebate(myDebate)) .build() ); @@ -226,6 +228,7 @@ public List getInvolvedDebate(long userId) { // 최근 순으로 정렬 List sortedDebates = allDebates.stream() + .filter(debate -> "active".equals(debate.getStatus())) .sorted((d1, d2) -> d2.getCreateAt().compareTo(d1.getCreateAt())) .toList(); @@ -236,6 +239,7 @@ public List getInvolvedDebate(long userId) { .keyword(involvedDebate.getKeyword().getKeyword()) .duration(getTimeAgo(involvedDebate.getCreateAt())) .hits(involvedDebate.getHits()) + .debateId(involvedDebate.getDebateId()) .comments(debateRepository.countCommentsByDebate(involvedDebate)) .build() );