From d032f4ce6cc78e554f4c489ce68bc358cfe1e769 Mon Sep 17 00:00:00 2001 From: mingsound <62479120+mingsound21@users.noreply.github.com> Date: Tue, 31 Jan 2023 01:20:13 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[MOD]=20=EB=8C=93=EA=B8=80=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/error/enums/ErrorMessage.java | 5 +++- .../comment/controller/CommentController.java | 8 +++--- .../comment/dto/CommentCreateRequestDto.java | 4 +-- .../domain/comment/entity/Comment.java | 4 +++ .../comment/service/CommentService.java | 27 ++++++++++++++----- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/modugarden/common/error/enums/ErrorMessage.java b/src/main/java/com/modugarden/common/error/enums/ErrorMessage.java index eacfc49..3e97c87 100644 --- a/src/main/java/com/modugarden/common/error/enums/ErrorMessage.java +++ b/src/main/java/com/modugarden/common/error/enums/ErrorMessage.java @@ -34,7 +34,10 @@ public enum ErrorMessage { FORBIDDEN_USER(FORBIDDEN, false ,"접근 권한이 없습니다."), TOKEN_IS_NULL(BAD_REQUEST, false, "토큰이 없습니다." ), WRONG_BOARD_DELETE(NOT_FOUND,false,"해당 큐레이션을 삭제할 수 없습니다."), - WRONG_BOARD(NOT_FOUND,false,"해당 큐레이션을 찾을 수 없습니다."); + WRONG_BOARD(NOT_FOUND,false,"해당 큐레이션을 찾을 수 없습니다."), + WRONG_REISSUE_TOKEN_ACCESS(BAD_REQUEST, false, "RefreshToken 탈취가 의심됩니다. 재 로그인해주세요."), + FCM_TOKEN_NOT_FOUND(BAD_REQUEST, false, "해당 FCM 토큰이 없습니다."), + WRONG_PARENT_COMMENT_ID(BAD_REQUEST, false, "올바르지 않은 부모 댓글 입니다."); private final int code; private final boolean isSuccess; diff --git a/src/main/java/com/modugarden/domain/comment/controller/CommentController.java b/src/main/java/com/modugarden/domain/comment/controller/CommentController.java index 82e097c..0b97807 100644 --- a/src/main/java/com/modugarden/domain/comment/controller/CommentController.java +++ b/src/main/java/com/modugarden/domain/comment/controller/CommentController.java @@ -28,13 +28,13 @@ public SliceResponseDto commentList(@PathVariable Long b // 댓글, 대댓글 작성 @PostMapping("/{board_id}/comments") - public BaseResponseDto write(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody CommentCreateRequestDto dto) { - return new BaseResponseDto<>(commentService.write(modugardenUser.getUser(), dto)); + public BaseResponseDto write(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody CommentCreateRequestDto dto, @PathVariable Long board_id) { + return new BaseResponseDto<>(commentService.write(modugardenUser.getUser(), board_id, dto)); } // 댓글 삭제 - @PatchMapping("/{board_id}/comments/{comment_id}") +/* @PatchMapping("/{board_id}/comments/{comment_id}") public BaseResponseDto delete(@AuthenticationPrincipal ModugardenUser modugardenUser) { return new BaseResponseDto<>(commentService.delete2(modugardenUser.getUser())); - } + }*/ } diff --git a/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java b/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java index 9a676c3..9705cc6 100644 --- a/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java +++ b/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java @@ -11,9 +11,7 @@ @AllArgsConstructor @NoArgsConstructor public class CommentCreateRequestDto { - private Long commentId; @Size(max= 40) private String content; - private Long parentId; - private Long boardId; + private Long parentId; // null이면 부모인겨 } diff --git a/src/main/java/com/modugarden/domain/comment/entity/Comment.java b/src/main/java/com/modugarden/domain/comment/entity/Comment.java index b14550a..48c0010 100644 --- a/src/main/java/com/modugarden/domain/comment/entity/Comment.java +++ b/src/main/java/com/modugarden/domain/comment/entity/Comment.java @@ -41,4 +41,8 @@ public Comment(String content, Long parentId, Board board, User user) { this.user = user; } + public void updateParentIdOfParentComment(){ + this.parentId = this.commentId; + } + } diff --git a/src/main/java/com/modugarden/domain/comment/service/CommentService.java b/src/main/java/com/modugarden/domain/comment/service/CommentService.java index c810c2b..0667cec 100644 --- a/src/main/java/com/modugarden/domain/comment/service/CommentService.java +++ b/src/main/java/com/modugarden/domain/comment/service/CommentService.java @@ -16,6 +16,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import static com.modugarden.common.error.enums.ErrorMessage.WRONG_PARENT_COMMENT_ID; +import static com.modugarden.common.error.enums.ErrorMessage.WRONG_POST; + @Service @Transactional(readOnly = true) @RequiredArgsConstructor @@ -33,10 +36,20 @@ public Slice commentList(Long boardId, User user, Pageab } //댓글, 대댓글 작성 @Transactional - public CommentCreateResponseDto write(User user, CommentCreateRequestDto dto){ - Board board = boardRepository.findById(dto.getBoardId()).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_POST)); - Comment newComment = new Comment(dto.getContent(), dto.getParentId(), board, user); - commentRepository.save(newComment); + public CommentCreateResponseDto write(User user, Long boardId, CommentCreateRequestDto dto){ + Board board = boardRepository.findById(boardId).orElseThrow(() -> new BusinessException(WRONG_POST)); + Comment newComment; + + if(dto.getParentId() == null){ // 부모 댓글 작성 + newComment = new Comment(dto.getContent(), 0L , board, user); // parentId에 일단 아무값이나 채우기(DB에서 not null 조건 있어서) + commentRepository.save(newComment);// newComment.getCommentId -> 자동생성된 값이 있음. + newComment.updateParentIdOfParentComment(); + }else{ + commentRepository.findById(dto.getParentId()).orElseThrow(() -> new BusinessException(WRONG_PARENT_COMMENT_ID));// 존재하는 부모댓글인지 확인 + + newComment = new Comment(dto.getContent(), dto.getParentId(), board, user); + commentRepository.save(newComment); + } return new CommentCreateResponseDto(newComment.getCommentId()); } // //댓글 삭제 @@ -48,12 +61,12 @@ public CommentCreateResponseDto write(User user, CommentCreateRequestDto dto){ // return new CommentCreateResponseDto(deleteComment.getCommentId()); // } //댓글 삭제2 - @Transactional + /* @Transactional public CommentCreateResponseDto delete2(User user){ CommentCreateRequestDto dto = new CommentCreateRequestDto(); - Board board = boardRepository.findById(dto.getBoardId()).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_POST)); + Board board = boardRepository.findById(dto.getBoardId()).orElseThrow(() -> new BusinessException(WRONG_POST)); Comment deleteComment = new Comment(dto.getContent(), dto.getParentId(), board, user); commentRepository.delete(deleteComment); return new CommentCreateResponseDto(deleteComment.getCommentId()); - } + }*/ } From ee2f2cde0607dac5fd9778f7c712ee1b7803d4f9 Mon Sep 17 00:00:00 2001 From: mingsound <62479120+mingsound21@users.noreply.github.com> Date: Tue, 31 Jan 2023 01:27:16 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[FEAT/#108]=20fcm=20=ED=86=A0=ED=81=B0=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5,=20=EC=88=98=EC=A0=95,=20=EC=A1=B0=ED=9A=8C,?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/fcm/controller/FcmController.java | 50 ++++++++++++++++ .../dto/request/AddFcmTokenRequestDto.java | 12 ++++ .../dto/request/DeleteFcmTokenRequestDto.java | 12 ++++ .../dto/request/UpdateFcmTokenRequestDto.java | 14 +++++ .../dto/response/AddFcmTokenResponseDto.java | 11 ++++ .../response/DeleteFcmTokenResponseDto.java | 10 ++++ .../response/GetAllFcmTokenResponseDto.java | 13 ++++ .../response/UpdateFcmTokenResponseDto.java | 10 ++++ .../domain/fcm/entity/FcmToken.java | 35 +++++++++++ .../domain/fcm/repository/FcmRepository.java | 16 +++++ .../domain/fcm/service/FcmService.java | 59 +++++++++++++++++++ 11 files changed, 242 insertions(+) create mode 100644 src/main/java/com/modugarden/domain/fcm/controller/FcmController.java create mode 100644 src/main/java/com/modugarden/domain/fcm/dto/request/AddFcmTokenRequestDto.java create mode 100644 src/main/java/com/modugarden/domain/fcm/dto/request/DeleteFcmTokenRequestDto.java create mode 100644 src/main/java/com/modugarden/domain/fcm/dto/request/UpdateFcmTokenRequestDto.java create mode 100644 src/main/java/com/modugarden/domain/fcm/dto/response/AddFcmTokenResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/fcm/dto/response/DeleteFcmTokenResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/fcm/dto/response/GetAllFcmTokenResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/fcm/dto/response/UpdateFcmTokenResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/fcm/entity/FcmToken.java create mode 100644 src/main/java/com/modugarden/domain/fcm/repository/FcmRepository.java create mode 100644 src/main/java/com/modugarden/domain/fcm/service/FcmService.java diff --git a/src/main/java/com/modugarden/domain/fcm/controller/FcmController.java b/src/main/java/com/modugarden/domain/fcm/controller/FcmController.java new file mode 100644 index 0000000..25fbf7d --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/controller/FcmController.java @@ -0,0 +1,50 @@ +package com.modugarden.domain.fcm.controller; + + +import com.modugarden.common.response.BaseResponseDto; +import com.modugarden.domain.auth.entity.ModugardenUser; +import com.modugarden.domain.fcm.dto.request.AddFcmTokenRequestDto; +import com.modugarden.domain.fcm.dto.request.DeleteFcmTokenRequestDto; +import com.modugarden.domain.fcm.dto.request.UpdateFcmTokenRequestDto; +import com.modugarden.domain.fcm.dto.response.AddFcmTokenResponseDto; +import com.modugarden.domain.fcm.dto.response.DeleteFcmTokenResponseDto; +import com.modugarden.domain.fcm.dto.response.GetAllFcmTokenResponseDto; +import com.modugarden.domain.fcm.dto.response.UpdateFcmTokenResponseDto; +import com.modugarden.domain.fcm.service.FcmService; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/fcm") +public class FcmController { + + private final FcmService fcmService; + + @PostMapping() + public BaseResponseDto addFcmToken(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody @Valid AddFcmTokenRequestDto requestDto){ + AddFcmTokenResponseDto responseDto = fcmService.addFcmToken(requestDto, modugardenUser.getUser()); + return new BaseResponseDto<>(responseDto); + } + + @PatchMapping + public BaseResponseDto updateFcmToken(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody @Valid UpdateFcmTokenRequestDto requestDto){ + UpdateFcmTokenResponseDto responseDto = fcmService.updateFcmToken(requestDto); + return new BaseResponseDto(responseDto); + } + + @GetMapping + public BaseResponseDto getFcmTokens(@AuthenticationPrincipal ModugardenUser modugardenUser){ + GetAllFcmTokenResponseDto fcmTokens = fcmService.getFcmTokens(modugardenUser.getUser()); + return new BaseResponseDto<>(fcmTokens); + } + + @DeleteMapping + public BaseResponseDto deleteFcmToken(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody @Valid DeleteFcmTokenRequestDto requestDto){ + DeleteFcmTokenResponseDto responseDto = fcmService.deleteFcmToken(requestDto); + return new BaseResponseDto(responseDto); + } +} diff --git a/src/main/java/com/modugarden/domain/fcm/dto/request/AddFcmTokenRequestDto.java b/src/main/java/com/modugarden/domain/fcm/dto/request/AddFcmTokenRequestDto.java new file mode 100644 index 0000000..33c76d5 --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/dto/request/AddFcmTokenRequestDto.java @@ -0,0 +1,12 @@ +package com.modugarden.domain.fcm.dto.request; + +import lombok.Getter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Getter +public class AddFcmTokenRequestDto { + @NotBlank(message = "추가할 fcm 토큰은 필수 입력 값입니다.") + private String fcmToken; +} diff --git a/src/main/java/com/modugarden/domain/fcm/dto/request/DeleteFcmTokenRequestDto.java b/src/main/java/com/modugarden/domain/fcm/dto/request/DeleteFcmTokenRequestDto.java new file mode 100644 index 0000000..1189743 --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/dto/request/DeleteFcmTokenRequestDto.java @@ -0,0 +1,12 @@ +package com.modugarden.domain.fcm.dto.request; + +import lombok.Getter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Getter +public class DeleteFcmTokenRequestDto { + @NotBlank(message = "삭제할 fcm 토큰은 필수 입력 값입니다.") + private String fcmToken; +} diff --git a/src/main/java/com/modugarden/domain/fcm/dto/request/UpdateFcmTokenRequestDto.java b/src/main/java/com/modugarden/domain/fcm/dto/request/UpdateFcmTokenRequestDto.java new file mode 100644 index 0000000..fdbe4e9 --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/dto/request/UpdateFcmTokenRequestDto.java @@ -0,0 +1,14 @@ +package com.modugarden.domain.fcm.dto.request; + +import lombok.Getter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Getter +public class UpdateFcmTokenRequestDto { + @NotBlank(message = "수정 전 fcm 토큰은 필수 입력 값입니다.") + private String beforeFcmToken; + @NotBlank(message = "수정 후 fcm 토큰은 필수 입력 값입니다.") + private String updateFcmToken; +} diff --git a/src/main/java/com/modugarden/domain/fcm/dto/response/AddFcmTokenResponseDto.java b/src/main/java/com/modugarden/domain/fcm/dto/response/AddFcmTokenResponseDto.java new file mode 100644 index 0000000..61b12a4 --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/dto/response/AddFcmTokenResponseDto.java @@ -0,0 +1,11 @@ +package com.modugarden.domain.fcm.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class AddFcmTokenResponseDto { + private String fcmToken; + private Long userId; // 유저 관련해서 무슨 정보가 필요한가?? 여쭤볼것 +} diff --git a/src/main/java/com/modugarden/domain/fcm/dto/response/DeleteFcmTokenResponseDto.java b/src/main/java/com/modugarden/domain/fcm/dto/response/DeleteFcmTokenResponseDto.java new file mode 100644 index 0000000..80e2d20 --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/dto/response/DeleteFcmTokenResponseDto.java @@ -0,0 +1,10 @@ +package com.modugarden.domain.fcm.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class DeleteFcmTokenResponseDto { + private String fcmToken; +} diff --git a/src/main/java/com/modugarden/domain/fcm/dto/response/GetAllFcmTokenResponseDto.java b/src/main/java/com/modugarden/domain/fcm/dto/response/GetAllFcmTokenResponseDto.java new file mode 100644 index 0000000..65c39db --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/dto/response/GetAllFcmTokenResponseDto.java @@ -0,0 +1,13 @@ +package com.modugarden.domain.fcm.dto.response; + +import com.modugarden.domain.fcm.entity.FcmToken; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +@Getter +@AllArgsConstructor +public class GetAllFcmTokenResponseDto { + List fcmTokens; +} diff --git a/src/main/java/com/modugarden/domain/fcm/dto/response/UpdateFcmTokenResponseDto.java b/src/main/java/com/modugarden/domain/fcm/dto/response/UpdateFcmTokenResponseDto.java new file mode 100644 index 0000000..5063a8f --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/dto/response/UpdateFcmTokenResponseDto.java @@ -0,0 +1,10 @@ +package com.modugarden.domain.fcm.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class UpdateFcmTokenResponseDto { + private String fcmToken; +} diff --git a/src/main/java/com/modugarden/domain/fcm/entity/FcmToken.java b/src/main/java/com/modugarden/domain/fcm/entity/FcmToken.java new file mode 100644 index 0000000..52aef25 --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/entity/FcmToken.java @@ -0,0 +1,35 @@ +package com.modugarden.domain.fcm.entity; + +import com.modugarden.domain.user.entity.User; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class FcmToken { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String fcmToken; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + + public FcmToken(String fcmToken, User user) { + this.fcmToken = fcmToken; + this.user = user; + } + + public void update(String fcmToken){ + this.fcmToken = fcmToken; + } +} diff --git a/src/main/java/com/modugarden/domain/fcm/repository/FcmRepository.java b/src/main/java/com/modugarden/domain/fcm/repository/FcmRepository.java new file mode 100644 index 0000000..ed78f63 --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/repository/FcmRepository.java @@ -0,0 +1,16 @@ +package com.modugarden.domain.fcm.repository; + +import com.modugarden.domain.fcm.entity.FcmToken; +import com.modugarden.domain.user.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface FcmRepository extends JpaRepository { + + List findByUser(User user); + Optional findByFcmToken(String fcmToken); + + Optional deleteByFcmToken(String fcmToken); +} diff --git a/src/main/java/com/modugarden/domain/fcm/service/FcmService.java b/src/main/java/com/modugarden/domain/fcm/service/FcmService.java new file mode 100644 index 0000000..fa48b8c --- /dev/null +++ b/src/main/java/com/modugarden/domain/fcm/service/FcmService.java @@ -0,0 +1,59 @@ +package com.modugarden.domain.fcm.service; + +import com.modugarden.common.error.exception.custom.BusinessException; +import com.modugarden.domain.fcm.dto.request.AddFcmTokenRequestDto; +import com.modugarden.domain.fcm.dto.request.DeleteFcmTokenRequestDto; +import com.modugarden.domain.fcm.dto.request.UpdateFcmTokenRequestDto; +import com.modugarden.domain.fcm.dto.response.AddFcmTokenResponseDto; +import com.modugarden.domain.fcm.dto.response.DeleteFcmTokenResponseDto; +import com.modugarden.domain.fcm.dto.response.GetAllFcmTokenResponseDto; +import com.modugarden.domain.fcm.dto.response.UpdateFcmTokenResponseDto; +import com.modugarden.domain.fcm.entity.FcmToken; +import com.modugarden.domain.fcm.repository.FcmRepository; +import com.modugarden.domain.user.entity.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.modugarden.common.error.enums.ErrorMessage.FCM_TOKEN_NOT_FOUND; + +@RequiredArgsConstructor +@Transactional +@Service +public class FcmService { + + private final FcmRepository fcmRepository; + + public AddFcmTokenResponseDto addFcmToken(AddFcmTokenRequestDto requestDto, User user){ + FcmToken newFcmToken = new FcmToken(requestDto.getFcmToken(), user); + fcmRepository.save(newFcmToken); + + return new AddFcmTokenResponseDto(newFcmToken.getFcmToken(), user.getId()); + } + + public UpdateFcmTokenResponseDto updateFcmToken(UpdateFcmTokenRequestDto requestDto){ + FcmToken fcmToken = fcmRepository.findByFcmToken(requestDto.getBeforeFcmToken()).orElseThrow(() -> new BusinessException(FCM_TOKEN_NOT_FOUND)); + fcmToken.update(requestDto.getUpdateFcmToken()); + + return new UpdateFcmTokenResponseDto(requestDto.getUpdateFcmToken()); + } + + public DeleteFcmTokenResponseDto deleteFcmToken(DeleteFcmTokenRequestDto requestDto){ + FcmToken fcmToken = fcmRepository.findByFcmToken(requestDto.getFcmToken()).orElseThrow(() -> new BusinessException(FCM_TOKEN_NOT_FOUND)); + fcmRepository.delete(fcmToken); + + return new DeleteFcmTokenResponseDto(fcmToken.getFcmToken()); + } + + public GetAllFcmTokenResponseDto getFcmTokens(User user){ + List fcmTokens = fcmRepository.findByUser(user); + List result = fcmTokens.stream().map(fcm -> fcm.getFcmToken()).collect(Collectors.toList()); + + return new GetAllFcmTokenResponseDto(result); + } +} From 2dc72e189d879ee1e622ff6cce649eca30a53e16 Mon Sep 17 00:00:00 2001 From: mingsound <62479120+mingsound21@users.noreply.github.com> Date: Tue, 31 Jan 2023 21:42:33 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[FIX]=20merge=20conflict=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/error/enums/ErrorMessage.java | 14 +- .../board/controller/BoardController.java | 84 ++++++++++- .../request/BoardCreateImageReqeuestDto.java | 3 + .../dto/request/BoardCreateRequestDto.java | 2 +- .../response/BoardGetMyLikeResponseDto.java | 14 ++ .../BoardGetMyStorageResponseDto.java | 14 ++ .../response/BoardGetStorageResponseDto.java | 38 +++++ .../dto/response/BoardSearchResponseDto.java | 36 +++++ .../dto/response/BoardStorageResponseDto.java | 11 ++ .../dto/response/BoardUserGetResponseDto.java | 2 + .../modugarden/domain/board/entity/Board.java | 6 +- .../domain/board/entity/BoardImage.java | 5 +- .../repository/BoardImageRepository.java | 11 +- .../board/repository/BoardRepository.java | 10 ++ .../domain/board/service/BoardService.java | 140 ++++++++++++++++-- .../comment/controller/CommentController.java | 40 ----- .../comment/dto/CommentCreateRequestDto.java | 17 --- .../dto/request/CommentCreateRequestDto.java | 21 +++ .../dto/request/CommentDeleteRequestDto.java | 14 ++ .../CommentCreateResponseDto.java | 2 +- .../response/CommentDeleteResponseDto.java | 10 ++ .../CommentListResponseDto.java | 7 +- .../domain/comment/entity/Comment.java | 3 +- .../comment/repository/CommentRepository.java | 17 --- .../comment/service/CommentService.java | 72 --------- .../controller/CurationController.java | 4 +- .../curation/service/CurationService.java | 16 +- .../follow/controller/FollowController.java | 4 +- .../domain/follow/service/FollowService.java | 3 +- .../like/repository/LikeBoardRepository.java | 7 +- ...itory.java => LikeCurationRepository.java} | 2 +- .../report/controller/ReportController.java | 3 - .../domain/storage/entity/BoardStorage.java | 8 + .../repository/BoardStorageRepository.java | 16 ++ 34 files changed, 455 insertions(+), 201 deletions(-) create mode 100644 src/main/java/com/modugarden/domain/board/dto/response/BoardGetMyLikeResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/board/dto/response/BoardGetMyStorageResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/board/dto/response/BoardGetStorageResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/board/dto/response/BoardSearchResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/board/dto/response/BoardStorageResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/comment/dto/request/CommentCreateRequestDto.java create mode 100644 src/main/java/com/modugarden/domain/comment/dto/request/CommentDeleteRequestDto.java rename src/main/java/com/modugarden/domain/comment/dto/{ => response}/CommentCreateResponseDto.java (85%) create mode 100644 src/main/java/com/modugarden/domain/comment/dto/response/CommentDeleteResponseDto.java rename src/main/java/com/modugarden/domain/comment/dto/{ => response}/CommentListResponseDto.java (66%) rename src/main/java/com/modugarden/domain/like/repository/{LikeRepository.java => LikeCurationRepository.java} (85%) create mode 100644 src/main/java/com/modugarden/domain/storage/entity/repository/BoardStorageRepository.java diff --git a/src/main/java/com/modugarden/common/error/enums/ErrorMessage.java b/src/main/java/com/modugarden/common/error/enums/ErrorMessage.java index 3e97c87..56e8946 100644 --- a/src/main/java/com/modugarden/common/error/enums/ErrorMessage.java +++ b/src/main/java/com/modugarden/common/error/enums/ErrorMessage.java @@ -7,7 +7,6 @@ @Getter public enum ErrorMessage { - SUCCESS(OK, true, "요청에 성공하였습니다."), INTERVAL_SERVER_ERROR(INTERNAL_SERVER_ERROR, false,"요청을 처리하는 과정에서 서버가 예상하지 못한 오류가 발생하였습니다."), USER_NOT_FOUND(NOT_FOUND, false, "해당 회원을 찾을 수 없습니다."), @@ -33,11 +32,16 @@ public enum ErrorMessage { UNAUTHORIZED_USER(UNAUTHORIZED, false, "인증되지 않은 유저입니다."), FORBIDDEN_USER(FORBIDDEN, false ,"접근 권한이 없습니다."), TOKEN_IS_NULL(BAD_REQUEST, false, "토큰이 없습니다." ), - WRONG_BOARD_DELETE(NOT_FOUND,false,"해당 큐레이션을 삭제할 수 없습니다."), - WRONG_BOARD(NOT_FOUND,false,"해당 큐레이션을 찾을 수 없습니다."), + WRONG_COMMENT(NOT_FOUND,false,"해당 댓글을 찾을 수 없습니다."), + WRONG_PARENT_COMMENT_ID(BAD_REQUEST, false, "올바르지 않은 부모 댓글 입니다."), + WRONG_BOARD_DELETE(NOT_FOUND,false,"해당 포스트를 삭제할 수 없습니다."), + WRONG_BOARD(NOT_FOUND,false,"해당 포스트를 찾을 수 없습니다."), + WRONG_BOARD_STORAGE(NOT_FOUND,false,"이미 포스트가 저장되어 있습니다."), + WRONG_BOARD_LIST(NOT_FOUND,false,"해당 포스트 리스트를 찾을 수 없습니다."), + WRONG_NICKNAME(BAD_REQUEST, false, "닉네임을 입력해야 합니다."), + WRONG_REISSUE_TOKEN_ACCESS(BAD_REQUEST, false, "RefreshToken 탈취가 의심됩니다. 재 로그인해주세요."), - FCM_TOKEN_NOT_FOUND(BAD_REQUEST, false, "해당 FCM 토큰이 없습니다."), - WRONG_PARENT_COMMENT_ID(BAD_REQUEST, false, "올바르지 않은 부모 댓글 입니다."); + FCM_TOKEN_NOT_FOUND(BAD_REQUEST, false, "해당 FCM 토큰이 없습니다."); private final int code; private final boolean isSuccess; diff --git a/src/main/java/com/modugarden/domain/board/controller/BoardController.java b/src/main/java/com/modugarden/domain/board/controller/BoardController.java index 9bcf733..ec86466 100644 --- a/src/main/java/com/modugarden/domain/board/controller/BoardController.java +++ b/src/main/java/com/modugarden/domain/board/controller/BoardController.java @@ -6,8 +6,7 @@ import com.modugarden.domain.board.dto.request.BoardCreateRequestDto; import com.modugarden.domain.board.dto.response.*; import com.modugarden.domain.board.service.BoardService; -import com.modugarden.domain.curation.dto.response.CurationDeleteResponseDto; -import com.modugarden.domain.curation.dto.response.CurationLikeResponseDto; +import com.modugarden.domain.curation.dto.response.CurationSearchResponseDto; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -18,6 +17,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.validation.Valid; +import javax.validation.constraints.Size; import java.io.IOException; import java.util.List; @@ -42,11 +42,18 @@ public BaseResponseDto createBoard(@RequestPart @Valid B @ApiOperation(value = "게시물 상세보기 페이지 - 포스트 좋아요 달기", notes = "특정 포스트에 좋아요 누른다.") @PostMapping("/boards/{board_id}/like") public BaseResponseDto createLikeBoard(@PathVariable Long board_id, - @AuthenticationPrincipal ModugardenUser user) { + @AuthenticationPrincipal ModugardenUser user) { BoardLikeResponseDto boardLikeResponse = boardService.createLikeBoard(board_id, user); return new BaseResponseDto<>(boardLikeResponse); } + //포스트 보관 api + @ApiOperation(value = "게시물 상세보기 페이지 - 큐레이션 보관", notes = "큐레이션을 보관한다.") + @PostMapping("/boards/{board_id}/storage") + public BaseResponseDto storeBoard(@PathVariable Long board_id, @AuthenticationPrincipal ModugardenUser user) { + return new BaseResponseDto<>(boardService.storeBoard(user, board_id)); + } + //포스트 하나 조회 api @ApiOperation(value = "게시물 상세보기 페이지 - 포스트 하나 조회", notes = "특정 포스트 한개를 조회 한다.") @GetMapping("/boards/{board_id}") @@ -57,8 +64,60 @@ public BaseResponseDto getBoard(@PathVariable Long board_id //회원 포스트 조회 api @ApiOperation(value = "게시물 상세보기 페이지 - 회원 포스트 조회", notes = "특정 회원의 모든 포스트를 조회 한다.") @GetMapping("/boards/users/{user_id}") - public SliceResponseDto getUserCuration(@PathVariable Long user_id, Pageable pageable) { - return new SliceResponseDto<>(boardService.getUserCuration(user_id, pageable)); + public SliceResponseDto getUserBoard(@PathVariable Long user_id, Pageable pageable) { + return new SliceResponseDto<>(boardService.getUserBoard(user_id, pageable)); + } + + //제목 포스트 검색 api + @ApiOperation(value = "탐색 피드 - 제목 포스트 검색", notes = "제목 으로 포스트 검색") + @GetMapping("/boards/search") + public SliceResponseDto searchBoard(@RequestParam @Size(max=50) String title, Pageable pageable) { + return new SliceResponseDto<>(boardService.searchBoard(title, pageable)); + } + + //카테고리,날짜별 큐레이션 조회 api + @ApiOperation(value = "탐색 피드 - 카테고리 별 포스트 검색", notes = "카테고리별로 포스트 검색") + @GetMapping("/boards") + public SliceResponseDto getFeedCuration(@RequestParam String category, Pageable pageable) { + return new SliceResponseDto<>(boardService.getFeed(category, pageable)); + } + + + //포스트 좋아요 개수 조회 api + @ApiOperation(value = "게시물 상세보기 페이지 - 포스트 좋아요 조회", notes = "특정 포스트의 좋아요 조회한다.") + @GetMapping("/boards/like/{boards_id}") + public BaseResponseDto getLikeBoard(@PathVariable Long boards_id) { + return new BaseResponseDto<>(boardService.getLikeBoard(boards_id)); + } + + //내 프로필 포스트 조회 api + @ApiOperation(value = "프로필 페이지 - 포스트 조회", notes = "로그인한 사용자의 포스트를 조회한다.") + @GetMapping("/boards/me") + public SliceResponseDto getMyBoard(@AuthenticationPrincipal ModugardenUser user, Pageable pageable) { + return new SliceResponseDto<>(boardService.getMyBoard(user.getUserId(), pageable)); + } + + //내 프로필 큐레이션 좋아요 여부 조회 + @ApiOperation(value = "프로필 페이지 - 포스트 좋아요 여부 조회", notes = "특정 포스트 좋아요 여부 조회한다.") + @GetMapping("/boards/me/like/{board_id}") + public BaseResponseDto getMyLikeBoard(@PathVariable Long board_id, + @AuthenticationPrincipal ModugardenUser user) { + return new BaseResponseDto<>(boardService.getMyLikeBoard(board_id, user)); + } + + //내 프로필 저장한 포스트 조회 + @ApiOperation(value = "프로필 페이지 - 저장한 포스트 조회", notes = "로그인한 사용자의 저장 포스트를 조회한다.") + @GetMapping("/boards/me/storage") + public SliceResponseDto getStorageBoard(@AuthenticationPrincipal ModugardenUser user, Pageable pageable) { + return new SliceResponseDto<>(boardService.getStorageBoard(user.getUserId(), pageable)); + } + + //내 프로필 포스트 보관 여부 조회 + @ApiOperation(value = "프로필 페이지 - 큐레이션 보관 여부 조회", notes = "특정 큐레이션 보관 여부 조회한다.") + @GetMapping("/boards/me/storage/{board_id}") + public BaseResponseDto getMyStorageBoard(@PathVariable Long board_id, + @AuthenticationPrincipal ModugardenUser user) { + return new BaseResponseDto<>(boardService.getMyStorageBoard(board_id, user)); } //포스트 삭제 api @@ -70,4 +129,19 @@ public BaseResponseDto deleteBoard(@PathVariable Long bo return new BaseResponseDto<>(boardDeleteResponseDto); } + //포스트 좋아요 취소 api + @ApiOperation(value = "게시물 상세보기 페이지 - 포스트 좋아요 취소", notes = "특정 포스트에 좋아요 취소한다.") + @DeleteMapping("/boards/{board_id}/unlike") + public BaseResponseDto createUnlikeBoard(@PathVariable Long board_id, + @AuthenticationPrincipal ModugardenUser user) { + BoardLikeResponseDto boardLikeResponseDto = boardService.createUnlikeBoard(board_id, user); + return new BaseResponseDto<>(boardLikeResponseDto); + } + + //포스트 보관 취소 api + @ApiOperation(value = "게시물 상세보기 페이지 - 포스트 보관 취소", notes = "보관된 포스트를 취소한다.") + @DeleteMapping("/boards/{board_id}/storage") + public BaseResponseDto storeCancelBoard(@PathVariable Long board_id, @AuthenticationPrincipal ModugardenUser user) { + return new BaseResponseDto<>(boardService.storeCancelBoard(user, board_id)); + } } diff --git a/src/main/java/com/modugarden/domain/board/dto/request/BoardCreateImageReqeuestDto.java b/src/main/java/com/modugarden/domain/board/dto/request/BoardCreateImageReqeuestDto.java index 54f0fa4..eee5264 100644 --- a/src/main/java/com/modugarden/domain/board/dto/request/BoardCreateImageReqeuestDto.java +++ b/src/main/java/com/modugarden/domain/board/dto/request/BoardCreateImageReqeuestDto.java @@ -18,6 +18,8 @@ public class BoardCreateImageReqeuestDto { private String content; // 내용 + private String location; // 위치 태그 + private Long userid; private Board board; // 해당하는 포스트 @@ -26,6 +28,7 @@ public BoardImage toEntity() { return BoardImage.builder() .image(image) .content(content) + .location(location) .userid(userid) .board(board) .build(); diff --git a/src/main/java/com/modugarden/domain/board/dto/request/BoardCreateRequestDto.java b/src/main/java/com/modugarden/domain/board/dto/request/BoardCreateRequestDto.java index f9518a1..cd23dc6 100644 --- a/src/main/java/com/modugarden/domain/board/dto/request/BoardCreateRequestDto.java +++ b/src/main/java/com/modugarden/domain/board/dto/request/BoardCreateRequestDto.java @@ -19,7 +19,7 @@ public class BoardCreateRequestDto { private List content; - private String location; // 위치 태그 + private List location; // 위치 태그 private String category; // 카테고리 } diff --git a/src/main/java/com/modugarden/domain/board/dto/response/BoardGetMyLikeResponseDto.java b/src/main/java/com/modugarden/domain/board/dto/response/BoardGetMyLikeResponseDto.java new file mode 100644 index 0000000..4c96e9f --- /dev/null +++ b/src/main/java/com/modugarden/domain/board/dto/response/BoardGetMyLikeResponseDto.java @@ -0,0 +1,14 @@ +package com.modugarden.domain.board.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class BoardGetMyLikeResponseDto { + private Long user_id; + private Long curation_id; + private boolean check; +} diff --git a/src/main/java/com/modugarden/domain/board/dto/response/BoardGetMyStorageResponseDto.java b/src/main/java/com/modugarden/domain/board/dto/response/BoardGetMyStorageResponseDto.java new file mode 100644 index 0000000..ea8bbd8 --- /dev/null +++ b/src/main/java/com/modugarden/domain/board/dto/response/BoardGetMyStorageResponseDto.java @@ -0,0 +1,14 @@ +package com.modugarden.domain.board.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class BoardGetMyStorageResponseDto { + private Long user_id; + private Long curation_id; + private boolean check; +} \ No newline at end of file diff --git a/src/main/java/com/modugarden/domain/board/dto/response/BoardGetStorageResponseDto.java b/src/main/java/com/modugarden/domain/board/dto/response/BoardGetStorageResponseDto.java new file mode 100644 index 0000000..075f053 --- /dev/null +++ b/src/main/java/com/modugarden/domain/board/dto/response/BoardGetStorageResponseDto.java @@ -0,0 +1,38 @@ +package com.modugarden.domain.board.dto.response; + +import com.modugarden.domain.board.entity.BoardImage; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class BoardGetStorageResponseDto { + private Long board_id; + private Long id; + private String title; + private Long like_num; + private LocalDateTime created_Date; + private String image; + private Long user_id; + private String user_nickname; + private String user_profile_image; + private String category_category; + + + public BoardGetStorageResponseDto(BoardImage boardImage) { + this.board_id = boardImage.getBoard().getId(); + this.id=boardImage.getId(); + this.title=boardImage.getBoard().getTitle(); + this.created_Date=boardImage.getBoard().getCreatedDate(); + this.image = boardImage.getImage(); + this.like_num = boardImage.getBoard().getLike_num(); + this.user_id=boardImage.getBoard().getUser().getId(); + this.user_nickname=boardImage.getBoard().getUser().getNickname(); + this.user_profile_image=boardImage.getBoard().getUser().getProfileImg(); + this.category_category=boardImage.getBoard().getCategory().getCategory(); + } +} diff --git a/src/main/java/com/modugarden/domain/board/dto/response/BoardSearchResponseDto.java b/src/main/java/com/modugarden/domain/board/dto/response/BoardSearchResponseDto.java new file mode 100644 index 0000000..da3e91b --- /dev/null +++ b/src/main/java/com/modugarden/domain/board/dto/response/BoardSearchResponseDto.java @@ -0,0 +1,36 @@ +package com.modugarden.domain.board.dto.response; + + +import com.modugarden.domain.board.entity.Board; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class BoardSearchResponseDto { + private Long id; + private String title; + private String preview_img; + private Long likeNum; + private LocalDateTime created_Date; + private Long user_id; + private String user_nickname; + private String user_profile_image; + private String category_category; + + + public BoardSearchResponseDto(Board board) { + this.id = board.getId(); + this.title = board.getTitle(); + this.preview_img = board.getPreview_img(); + this.likeNum = board.getLike_num(); + this.created_Date = board.getCreatedDate(); + this.user_id = board.getUser().getId(); + this.user_nickname = board.getUser().getNickname(); + this.user_profile_image = board.getUser().getProfileImg(); + this.category_category = board.getCategory().getCategory(); + } +} diff --git a/src/main/java/com/modugarden/domain/board/dto/response/BoardStorageResponseDto.java b/src/main/java/com/modugarden/domain/board/dto/response/BoardStorageResponseDto.java new file mode 100644 index 0000000..1c488f0 --- /dev/null +++ b/src/main/java/com/modugarden/domain/board/dto/response/BoardStorageResponseDto.java @@ -0,0 +1,11 @@ +package com.modugarden.domain.board.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class BoardStorageResponseDto { + private Long user_id; + private Long curation_id; +} diff --git a/src/main/java/com/modugarden/domain/board/dto/response/BoardUserGetResponseDto.java b/src/main/java/com/modugarden/domain/board/dto/response/BoardUserGetResponseDto.java index b503bcf..b575542 100644 --- a/src/main/java/com/modugarden/domain/board/dto/response/BoardUserGetResponseDto.java +++ b/src/main/java/com/modugarden/domain/board/dto/response/BoardUserGetResponseDto.java @@ -21,6 +21,7 @@ public class BoardUserGetResponseDto { private Long like_num; private LocalDateTime created_Date; private String image; + private String location; private Long user_id; private String user_nickname; private String user_profile_image; @@ -33,6 +34,7 @@ public BoardUserGetResponseDto(BoardImage boardImage) { this.title=boardImage.getBoard().getTitle(); this.created_Date=boardImage.getBoard().getCreatedDate(); this.image = boardImage.getImage(); + this.location = boardImage.getLocation(); this.like_num = boardImage.getBoard().getLike_num(); this.user_id=boardImage.getBoard().getUser().getId(); this.user_nickname=boardImage.getBoard().getUser().getNickname(); diff --git a/src/main/java/com/modugarden/domain/board/entity/Board.java b/src/main/java/com/modugarden/domain/board/entity/Board.java index aa30b58..f678319 100644 --- a/src/main/java/com/modugarden/domain/board/entity/Board.java +++ b/src/main/java/com/modugarden/domain/board/entity/Board.java @@ -24,7 +24,7 @@ public class Board extends BaseTimeEntity { private Long like_num; - private String location; + private String preview_img; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) @@ -35,11 +35,11 @@ public class Board extends BaseTimeEntity { private InterestCategory category; @Builder - public Board(Long id, String title,Long like_num, String location, User user, InterestCategory category) { + public Board(Long id, String title,Long like_num,String preview_img, User user, InterestCategory category) { this.id = id; this.title = title; + this.preview_img = preview_img; this.like_num = like_num; - this.location = location; this.user = user; this.category = category; } diff --git a/src/main/java/com/modugarden/domain/board/entity/BoardImage.java b/src/main/java/com/modugarden/domain/board/entity/BoardImage.java index c83e485..57885d7 100644 --- a/src/main/java/com/modugarden/domain/board/entity/BoardImage.java +++ b/src/main/java/com/modugarden/domain/board/entity/BoardImage.java @@ -22,6 +22,8 @@ public class BoardImage { private String content; + private String location; + private Long userid; @JsonIgnore @@ -32,10 +34,11 @@ public class BoardImage { @Builder - public BoardImage(Long id, String image, String content, Long userid, Board board) { + public BoardImage(Long id, String image, String content, String location, Long userid, Board board) { this.id = id; this.image = image; this.content = content; + this.location = location; this.userid = userid; this.board = board; } diff --git a/src/main/java/com/modugarden/domain/board/repository/BoardImageRepository.java b/src/main/java/com/modugarden/domain/board/repository/BoardImageRepository.java index 7b49471..cc033a7 100644 --- a/src/main/java/com/modugarden/domain/board/repository/BoardImageRepository.java +++ b/src/main/java/com/modugarden/domain/board/repository/BoardImageRepository.java @@ -1,11 +1,12 @@ package com.modugarden.domain.board.repository; -import com.modugarden.domain.board.entity.Board; +import com.modugarden.domain.board.dto.response.BoardGetStorageResponseDto; import com.modugarden.domain.board.entity.BoardImage; -import com.modugarden.domain.like.entity.LikeCuration; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.util.List; @@ -18,4 +19,10 @@ public interface BoardImageRepository extends JpaRepository { Optional deleteAllByBoard_Id(Long id); Slice findAllByUserid(Long user_id, Pageable pageable); + + + @Query(value = "SELECT bo FROM BoardImage bo \n" + + " LEFT JOIN BoardStorage bs ON bo.userid = bs.user.id\n" + + " WHERE bo.userid = bs.user.id") + Page QueryfindAllByUser_Id(Long user_id, Pageable pageable); } diff --git a/src/main/java/com/modugarden/domain/board/repository/BoardRepository.java b/src/main/java/com/modugarden/domain/board/repository/BoardRepository.java index 023c988..fc5fa1e 100644 --- a/src/main/java/com/modugarden/domain/board/repository/BoardRepository.java +++ b/src/main/java/com/modugarden/domain/board/repository/BoardRepository.java @@ -1,6 +1,9 @@ package com.modugarden.domain.board.repository; import com.modugarden.domain.board.entity.Board; +import com.modugarden.domain.category.entity.InterestCategory; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -11,4 +14,11 @@ public interface BoardRepository extends JpaRepository { Optional findById(Long boardId); Long countByUser_Id(Long user_id); + + //제목 검색 + Slice findAllByTitleLikeOrderByCreatedDateDesc(String title, Pageable pageable); + + //카테고리로 생성일자 순 조회 + Slice findAllByCategoryOrderByCreatedDateDesc(InterestCategory category, Pageable pageable); + } diff --git a/src/main/java/com/modugarden/domain/board/service/BoardService.java b/src/main/java/com/modugarden/domain/board/service/BoardService.java index 9210056..d40f9fd 100644 --- a/src/main/java/com/modugarden/domain/board/service/BoardService.java +++ b/src/main/java/com/modugarden/domain/board/service/BoardService.java @@ -15,7 +15,11 @@ import com.modugarden.domain.category.entity.InterestCategory; import com.modugarden.domain.category.repository.InterestCategoryRepository; +import com.modugarden.domain.curation.dto.response.CurationSearchResponseDto; +import com.modugarden.domain.curation.entity.Curation; import com.modugarden.domain.like.repository.LikeBoardRepository; +import com.modugarden.domain.storage.entity.BoardStorage; +import com.modugarden.domain.storage.entity.repository.BoardStorageRepository; import com.modugarden.domain.user.entity.User; import com.modugarden.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; @@ -36,6 +40,7 @@ public class BoardService { private final BoardImageRepository boardImageRepository; private final LikeBoardRepository likeBoardRepository; private final UserRepository userRepository; + private final BoardStorageRepository boardStorageRepository; private final InterestCategoryRepository interestCategoryRepository; private final FileService fileService; @@ -49,19 +54,31 @@ public BoardCreateResponseDto createBoard(BoardCreateRequestDto boardCreateReque InterestCategory interestCategory = interestCategoryRepository.findByCategory(boardCreateRequestDto.getCategory()).get(); - Board board = Board.builder() + + boolean index= false; + Board board= Board.builder() .title(boardCreateRequestDto.getTitle()) - .location(boardCreateRequestDto.getLocation()) - .like_num((long)0) + .like_num((long) 0) + .preview_img(" ") .user(user.getUser()) .category(interestCategory) .build(); - boardRepository.save(board); - for(MultipartFile multipartFile : file) { String profileImageUrl = fileService.uploadFile(multipartFile, user.getUserId(), "boardImage"); - BoardCreateImageReqeuestDto boardCreateImageReqeuestDto = new BoardCreateImageReqeuestDto(profileImageUrl, boardCreateRequestDto.getContent().get(file.indexOf(multipartFile)),user.getUserId(), board); + if(!index) { + board = Board.builder() + .title(boardCreateRequestDto.getTitle()) + .like_num((long) 0) + .preview_img(profileImageUrl) + .user(user.getUser()) + .category(interestCategory) + .build(); + + boardRepository.save(board); + index=true; + } + BoardCreateImageReqeuestDto boardCreateImageReqeuestDto = new BoardCreateImageReqeuestDto(profileImageUrl, boardCreateRequestDto.getContent().get(file.indexOf(multipartFile)),boardCreateRequestDto.getLocation().get(file.indexOf(multipartFile)),user.getUserId(), board); boardImageRepository.save(boardCreateImageReqeuestDto.toEntity()); } @@ -75,7 +92,7 @@ public BoardLikeResponseDto createLikeBoard(Long board_id, ModugardenUser user) User users = userRepository.findById(user.getUserId()).orElseThrow(() -> new BusinessException(ErrorMessage.USER_NOT_FOUND)); if (likeBoardRepository.findByUserAndBoard(users, board).isEmpty()) { - Board modifyBoard = new Board(board.getId(), board.getTitle(), board.getLike_num()+1, board.getLocation(), board.getUser(),board.getCategory()); + Board modifyBoard = new Board(board.getId(), board.getTitle(), board.getLike_num()+1,board.getPreview_img(),board.getUser(),board.getCategory()); BoardLikeRequestDto boardLikeRequestDto = new BoardLikeRequestDto(users, modifyBoard); likeBoardRepository.save(boardLikeRequestDto.toEntity()); @@ -84,6 +101,17 @@ public BoardLikeResponseDto createLikeBoard(Long board_id, ModugardenUser user) return new BoardLikeResponseDto(board.getId(), board.getLike_num()); } + //포스트 보관 + public BoardStorageResponseDto storeBoard(ModugardenUser user, Long board_id) { + Board board = boardRepository.findById(board_id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_BOARD)); + if(boardStorageRepository.findByUserAndBoard(user.getUser(),board).isPresent()) + throw new BusinessException(ErrorMessage.WRONG_BOARD_STORAGE); + + BoardStorage boardStorage = new BoardStorage(user.getUser(), board); + boardStorageRepository.save(boardStorage); + return new BoardStorageResponseDto(boardStorage.getUser().getId(),boardStorage.getBoard().getId()); + } + //포스트 하나 조회 api public BoardGetResponseDto getBoard(long id) { Board board = boardRepository.findById(id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_CURATION)); @@ -92,12 +120,77 @@ public BoardGetResponseDto getBoard(long id) { } //회원 포스트 조회 - public Slice getUserCuration(long user_id, Pageable pageable) { + public Slice getUserBoard(long user_id, Pageable pageable) { Slice imageList = boardImageRepository.findAllByUserid(user_id,pageable); return imageList.map(BoardUserGetResponseDto::new); } + //포스트 조회 + public Slice searchBoard(String title, Pageable pageable) { + Slice board = boardRepository.findAllByTitleLikeOrderByCreatedDateDesc('%' + title + '%', pageable); + if (board.isEmpty()) + throw new BusinessException(ErrorMessage.WRONG_BOARD_LIST); + + return board.map(BoardSearchResponseDto::new); + } + + //카테고리,날짜별 포스트 조회 + public Slice getFeed(String category, Pageable pageable) { + InterestCategory interestCategory = interestCategoryRepository.findByCategory(category).get(); + Slice getFeedCurationList = boardRepository.findAllByCategoryOrderByCreatedDateDesc(interestCategory, pageable); + + if (getFeedCurationList.isEmpty()) + throw new BusinessException(ErrorMessage.WRONG_BOARD_LIST); + + return getFeedCurationList.map(BoardSearchResponseDto::new); + } + + //포스트 좋아요 개수 조회 + public BoardLikeResponseDto getLikeBoard(long id) { + Board board = boardRepository.findById(id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_CURATION)); + return new BoardLikeResponseDto(board.getId(), board.getLike_num()); + } + + //내 프로필 포스트 조회 api + public Slice getMyBoard(long user_id, Pageable pageable) { + Slice postList = boardImageRepository.findAllByUserid(user_id, pageable); + if (postList.isEmpty()) + throw new BusinessException(ErrorMessage.WRONG_BOARD_LIST); + return postList.map(BoardUserGetResponseDto::new); + } + + //내 프로필 포스트 좋아요 조회 api + public BoardGetMyLikeResponseDto getMyLikeBoard(long board_id, ModugardenUser users) { + Board board = boardRepository.findById(board_id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_BOARD)); + + if(likeBoardRepository.findByUserAndBoard(users.getUser(), board).isPresent()) + return new BoardGetMyLikeResponseDto(users.getUserId(),board.getId(), true); + + return new BoardGetMyLikeResponseDto(users.getUserId(),board.getId(), false); + } + + //내 프로필 저장한 포스트 조회 + public Slice getStorageBoard(long user_id, Pageable pageable) { + Slice myBoardStorageList = boardImageRepository.QueryfindAllByUser_Id(user_id, pageable); + + if (myBoardStorageList.isEmpty()) + throw new BusinessException(ErrorMessage.WRONG_BOARD_LIST); + + return myBoardStorageList; + } + + //내 프로필 큐레이션 보관 여부 조회 api + public BoardGetMyStorageResponseDto getMyStorageBoard(long board_id, ModugardenUser users) { + Board board = boardRepository.findById(board_id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_CURATION)); + + if(boardStorageRepository.findByUserAndBoard(users.getUser(), board).isPresent()) + return new BoardGetMyStorageResponseDto(users.getUserId(),board.getId(), true); + + return new BoardGetMyStorageResponseDto(users.getUserId(),board.getId(), false); + } + + //포스트 삭제 @Transactional public BoardDeleteResponseDto deleteBoard(long id, ModugardenUser user) { Board board = boardRepository.findById(id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_CURATION_DELETE)); @@ -106,9 +199,9 @@ public BoardDeleteResponseDto deleteBoard(long id, ModugardenUser user) { //이미지 모두 삭제 boardImageRepository.deleteAllByBoard_Id(id); // 보관 모두 삭제 -// curationStorageRepository.deleteAllByCuration_Id(curation.getId()); + boardStorageRepository.deleteAllByBoard_Id(id); // 좋아요 모두 삭제 -// likeRepository.deleteAllByCuration_Id(curation.getId()); + likeBoardRepository.deleteAllByBoard_Id(id); boardRepository.delete(board); } else @@ -117,4 +210,31 @@ public BoardDeleteResponseDto deleteBoard(long id, ModugardenUser user) { return new BoardDeleteResponseDto(board.getId()); } + //포스트 좋아요 취소 + @Transactional + public BoardLikeResponseDto createUnlikeBoard(Long board_id, ModugardenUser user) { + Board board = boardRepository.findById(board_id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_BOARD)); + User users = userRepository.findById(user.getUserId()).orElseThrow(() -> new BusinessException(ErrorMessage.USER_NOT_FOUND)); + + likeBoardRepository.findByUserAndBoard(users, board) + .ifPresent(it -> { + Board modifyBoard = new Board(board.getId(), board.getTitle(), board.getLike_num()-1,board.getPreview_img(), board.getUser(),board.getCategory()); + likeBoardRepository.delete(it); + boardRepository.save(modifyBoard); + }); + + return new BoardLikeResponseDto(board.getId(), board.getLike_num()); + } + + //포스트 보관 취소 + public BoardStorageResponseDto storeCancelBoard(ModugardenUser user, Long board_id) { + Board board = boardRepository.findById(board_id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_BOARD)); + + boardStorageRepository.findByUserAndBoard(user.getUser(),board).ifPresent( + boardStorageRepository::delete + ); + + return new BoardStorageResponseDto(board.getUser().getId(), board.getId()); + } + } diff --git a/src/main/java/com/modugarden/domain/comment/controller/CommentController.java b/src/main/java/com/modugarden/domain/comment/controller/CommentController.java index 0b97807..e69de29 100644 --- a/src/main/java/com/modugarden/domain/comment/controller/CommentController.java +++ b/src/main/java/com/modugarden/domain/comment/controller/CommentController.java @@ -1,40 +0,0 @@ -package com.modugarden.domain.comment.controller; - -import com.modugarden.common.response.BaseResponseDto; -import com.modugarden.common.response.SliceResponseDto; -import com.modugarden.domain.auth.entity.ModugardenUser; -import com.modugarden.domain.comment.dto.CommentCreateRequestDto; -import com.modugarden.domain.comment.dto.CommentCreateResponseDto; -import com.modugarden.domain.comment.dto.CommentListResponseDto; -import com.modugarden.domain.comment.service.CommentService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.*; - -// 컨트롤러에서 서비스 호출, 서비스에서 레퍼지토리를 호출 -@RequiredArgsConstructor -@RestController -@RequestMapping("/boards") -public class CommentController { - private final CommentService commentService; - - // 댓글 조회 - @GetMapping("/{board_id}/comments") - public SliceResponseDto commentList(@PathVariable Long boardId, @AuthenticationPrincipal ModugardenUser modugardenUser, Pageable pageable) { - return new SliceResponseDto<>(commentService.commentList(boardId, modugardenUser.getUser(), pageable)); - } - - // 댓글, 대댓글 작성 - @PostMapping("/{board_id}/comments") - public BaseResponseDto write(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody CommentCreateRequestDto dto, @PathVariable Long board_id) { - return new BaseResponseDto<>(commentService.write(modugardenUser.getUser(), board_id, dto)); - } - - // 댓글 삭제 -/* @PatchMapping("/{board_id}/comments/{comment_id}") - public BaseResponseDto delete(@AuthenticationPrincipal ModugardenUser modugardenUser) { - return new BaseResponseDto<>(commentService.delete2(modugardenUser.getUser())); - }*/ -} diff --git a/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java b/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java index 9705cc6..e69de29 100644 --- a/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java +++ b/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java @@ -1,17 +0,0 @@ -package com.modugarden.domain.comment.dto; - -import com.modugarden.domain.comment.entity.Comment; -import lombok.*; - -import javax.validation.constraints.Size; - - -@Getter -@Data -@AllArgsConstructor -@NoArgsConstructor -public class CommentCreateRequestDto { - @Size(max= 40) - private String content; - private Long parentId; // null이면 부모인겨 -} diff --git a/src/main/java/com/modugarden/domain/comment/dto/request/CommentCreateRequestDto.java b/src/main/java/com/modugarden/domain/comment/dto/request/CommentCreateRequestDto.java new file mode 100644 index 0000000..a9c65e3 --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/dto/request/CommentCreateRequestDto.java @@ -0,0 +1,21 @@ +package com.modugarden.domain.comment.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + + +@Getter +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CommentCreateRequestDto { + @NotBlank(message = "댓글은 필수 입력 값입니다.") + @Size(max= 40) + private String content; + private Long parentId; +} diff --git a/src/main/java/com/modugarden/domain/comment/dto/request/CommentDeleteRequestDto.java b/src/main/java/com/modugarden/domain/comment/dto/request/CommentDeleteRequestDto.java new file mode 100644 index 0000000..707ce3c --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/dto/request/CommentDeleteRequestDto.java @@ -0,0 +1,14 @@ +package com.modugarden.domain.comment.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CommentDeleteRequestDto { + private Long commentId; +} diff --git a/src/main/java/com/modugarden/domain/comment/dto/CommentCreateResponseDto.java b/src/main/java/com/modugarden/domain/comment/dto/response/CommentCreateResponseDto.java similarity index 85% rename from src/main/java/com/modugarden/domain/comment/dto/CommentCreateResponseDto.java rename to src/main/java/com/modugarden/domain/comment/dto/response/CommentCreateResponseDto.java index 6667bc2..f73839c 100644 --- a/src/main/java/com/modugarden/domain/comment/dto/CommentCreateResponseDto.java +++ b/src/main/java/com/modugarden/domain/comment/dto/response/CommentCreateResponseDto.java @@ -1,4 +1,4 @@ -package com.modugarden.domain.comment.dto; +package com.modugarden.domain.comment.dto.response; import com.modugarden.domain.board.entity.Board; import com.modugarden.domain.comment.entity.Comment; diff --git a/src/main/java/com/modugarden/domain/comment/dto/response/CommentDeleteResponseDto.java b/src/main/java/com/modugarden/domain/comment/dto/response/CommentDeleteResponseDto.java new file mode 100644 index 0000000..1faa893 --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/dto/response/CommentDeleteResponseDto.java @@ -0,0 +1,10 @@ +package com.modugarden.domain.comment.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class CommentDeleteResponseDto { + private Long commentId; +} diff --git a/src/main/java/com/modugarden/domain/comment/dto/CommentListResponseDto.java b/src/main/java/com/modugarden/domain/comment/dto/response/CommentListResponseDto.java similarity index 66% rename from src/main/java/com/modugarden/domain/comment/dto/CommentListResponseDto.java rename to src/main/java/com/modugarden/domain/comment/dto/response/CommentListResponseDto.java index e9dfd1e..283da03 100644 --- a/src/main/java/com/modugarden/domain/comment/dto/CommentListResponseDto.java +++ b/src/main/java/com/modugarden/domain/comment/dto/response/CommentListResponseDto.java @@ -1,11 +1,8 @@ -package com.modugarden.domain.comment.dto; +package com.modugarden.domain.comment.dto.response; -import com.modugarden.domain.comment.entity.Comment; import lombok.AllArgsConstructor; import lombok.Getter; -import java.util.List; - @AllArgsConstructor @Getter public class CommentListResponseDto { @@ -13,4 +10,6 @@ public class CommentListResponseDto { private String nickname; private String profileImage; private String comment; + private Long commentId; + private Long parentId; } diff --git a/src/main/java/com/modugarden/domain/comment/entity/Comment.java b/src/main/java/com/modugarden/domain/comment/entity/Comment.java index 48c0010..cb08bd8 100644 --- a/src/main/java/com/modugarden/domain/comment/entity/Comment.java +++ b/src/main/java/com/modugarden/domain/comment/entity/Comment.java @@ -40,9 +40,8 @@ public Comment(String content, Long parentId, Board board, User user) { this.board = board; this.user = user; } - public void updateParentIdOfParentComment(){ this.parentId = this.commentId; } -} +} \ No newline at end of file diff --git a/src/main/java/com/modugarden/domain/comment/repository/CommentRepository.java b/src/main/java/com/modugarden/domain/comment/repository/CommentRepository.java index a08a102..e69de29 100644 --- a/src/main/java/com/modugarden/domain/comment/repository/CommentRepository.java +++ b/src/main/java/com/modugarden/domain/comment/repository/CommentRepository.java @@ -1,17 +0,0 @@ -package com.modugarden.domain.comment.repository; - -import com.modugarden.domain.comment.entity.Comment; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -@Repository -public interface CommentRepository extends JpaRepository { - //댓글 조회 - Slice findAllByBoard_IdOrderByCreatedDateDesc(@Param("board_Id") Long boardId, Pageable pageable); - //동해 오빠꺼 - Optional deleteAllByBoard_Id(Long id); -} diff --git a/src/main/java/com/modugarden/domain/comment/service/CommentService.java b/src/main/java/com/modugarden/domain/comment/service/CommentService.java index 0667cec..e69de29 100644 --- a/src/main/java/com/modugarden/domain/comment/service/CommentService.java +++ b/src/main/java/com/modugarden/domain/comment/service/CommentService.java @@ -1,72 +0,0 @@ -package com.modugarden.domain.comment.service; - -import com.modugarden.common.error.enums.ErrorMessage; -import com.modugarden.common.error.exception.custom.BusinessException; -import com.modugarden.domain.board.entity.Board; -import com.modugarden.domain.board.repository.BoardRepository; -import com.modugarden.domain.comment.dto.CommentCreateRequestDto; -import com.modugarden.domain.comment.dto.CommentCreateResponseDto; -import com.modugarden.domain.comment.dto.CommentListResponseDto; -import com.modugarden.domain.comment.entity.Comment; -import com.modugarden.domain.comment.repository.CommentRepository; -import com.modugarden.domain.user.entity.User; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import static com.modugarden.common.error.enums.ErrorMessage.WRONG_PARENT_COMMENT_ID; -import static com.modugarden.common.error.enums.ErrorMessage.WRONG_POST; - -@Service -@Transactional(readOnly = true) -@RequiredArgsConstructor -public class CommentService { - private final CommentRepository commentRepository; - private final BoardRepository boardRepository; - - //댓글 조회 - //부모 댓글로 조회후 부모댓글이 같다면 시간순으로 조회 - public Slice commentList(Long boardId, User user, Pageable pageable){ - Slice comments = commentRepository.findAllByBoard_IdOrderByCreatedDateDesc(boardId, pageable); - Slice result = comments - .map(c -> new CommentListResponseDto(c.getUser().getId(), c.getUser().getNickname(), c.getUser().getProfileImg(), c.getContent())); //commentId를 가져와야 하나? - return result; - } - //댓글, 대댓글 작성 - @Transactional - public CommentCreateResponseDto write(User user, Long boardId, CommentCreateRequestDto dto){ - Board board = boardRepository.findById(boardId).orElseThrow(() -> new BusinessException(WRONG_POST)); - Comment newComment; - - if(dto.getParentId() == null){ // 부모 댓글 작성 - newComment = new Comment(dto.getContent(), 0L , board, user); // parentId에 일단 아무값이나 채우기(DB에서 not null 조건 있어서) - commentRepository.save(newComment);// newComment.getCommentId -> 자동생성된 값이 있음. - newComment.updateParentIdOfParentComment(); - }else{ - commentRepository.findById(dto.getParentId()).orElseThrow(() -> new BusinessException(WRONG_PARENT_COMMENT_ID));// 존재하는 부모댓글인지 확인 - - newComment = new Comment(dto.getContent(), dto.getParentId(), board, user); - commentRepository.save(newComment); - } - return new CommentCreateResponseDto(newComment.getCommentId()); - } -// //댓글 삭제 -// public CommentCreateResponseDto delete(User user){ -// CommentCreateRequestDto dto = new CommentCreateRequestDto(); -// boardRepository.findById(dto.getBoardId()); -// Comment deleteComment = commentRepository.findById(dto.getParentId()).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_POST)); -// commentRepository.delete(deleteComment); -// return new CommentCreateResponseDto(deleteComment.getCommentId()); -// } - //댓글 삭제2 - /* @Transactional - public CommentCreateResponseDto delete2(User user){ - CommentCreateRequestDto dto = new CommentCreateRequestDto(); - Board board = boardRepository.findById(dto.getBoardId()).orElseThrow(() -> new BusinessException(WRONG_POST)); - Comment deleteComment = new Comment(dto.getContent(), dto.getParentId(), board, user); - commentRepository.delete(deleteComment); - return new CommentCreateResponseDto(deleteComment.getCommentId()); - }*/ -} diff --git a/src/main/java/com/modugarden/domain/curation/controller/CurationController.java b/src/main/java/com/modugarden/domain/curation/controller/CurationController.java index 16885fc..089be38 100644 --- a/src/main/java/com/modugarden/domain/curation/controller/CurationController.java +++ b/src/main/java/com/modugarden/domain/curation/controller/CurationController.java @@ -105,12 +105,12 @@ public BaseResponseDto getMyLikeCuration(@PathVari //내 프로필 저장한 큐레이션 조회 @ApiOperation(value = "프로필 페이지 - 저장한 큐레이션 조회", notes = "로그인한 사용자의 저장 큐레이션을 조회한다.") - @GetMapping("curations/me/storage") + @GetMapping("/curations/me/storage") public SliceResponseDto getStorageCuration(@AuthenticationPrincipal ModugardenUser user, Pageable pageable) { return new SliceResponseDto<>(curationService.getStorageCuration(user.getUserId(), pageable)); } - //내 프로필 큐레이션 좋아요 여부 조회 + //내 프로필 큐레이션 보관 여부 조회 @ApiOperation(value = "프로필 페이지 - 큐레이션 보관 여부 조회", notes = "특정 큐레이션 보관 여부 조회한다.") @GetMapping("/curations/me/storage/{curation_id}") public BaseResponseDto getMyStorageCuration(@PathVariable Long curation_id, diff --git a/src/main/java/com/modugarden/domain/curation/service/CurationService.java b/src/main/java/com/modugarden/domain/curation/service/CurationService.java index 8e87a4f..3ab28c4 100644 --- a/src/main/java/com/modugarden/domain/curation/service/CurationService.java +++ b/src/main/java/com/modugarden/domain/curation/service/CurationService.java @@ -11,7 +11,7 @@ import com.modugarden.domain.curation.dto.response.*; import com.modugarden.domain.curation.entity.Curation; import com.modugarden.domain.curation.repository.CurationRepository; -import com.modugarden.domain.like.repository.LikeRepository; +import com.modugarden.domain.like.repository.LikeCurationRepository; import com.modugarden.domain.storage.entity.CurationStorage; import com.modugarden.domain.storage.entity.repository.CurationStorageRepository; import com.modugarden.domain.user.entity.User; @@ -31,7 +31,7 @@ public class CurationService { private final CurationRepository curationRepository; private final UserRepository userRepository; - private final LikeRepository likeRepository; + private final LikeCurationRepository likeCurationRepository; private final FileService fileService; private final CurationStorageRepository curationStorageRepository; private final InterestCategoryRepository interestCategoryRepository; @@ -64,11 +64,11 @@ public CurationLikeResponseDto createLikeCuration(Long curation_id, ModugardenUs Curation curation = curationRepository.findById(curation_id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_CURATION)); User users = userRepository.findById(user.getUserId()).orElseThrow(() -> new BusinessException(ErrorMessage.USER_NOT_FOUND)); - if (likeRepository.findByUserAndCuration(users, curation).isEmpty()) { + if (likeCurationRepository.findByUserAndCuration(users, curation).isEmpty()) { Curation modifyCuration = new Curation(curation.getId(), curation.getTitle(), curation.getLink(), curation.getPreviewImage(), curation.getLikeNum() + 1, curation.getUser(), curation.getCategory()); CurationLikeRequestDto curationLikeRequestDto = new CurationLikeRequestDto(users, modifyCuration); - likeRepository.save(curationLikeRequestDto.toEntity()); + likeCurationRepository.save(curationLikeRequestDto.toEntity()); curationRepository.save(modifyCuration); } return new CurationLikeResponseDto(curation.getId(), curation.getLikeNum()); @@ -135,7 +135,7 @@ public Slice getMyCuration(long user_id, Pageable pa public CurationGetMyLikeResponseDto getMyLikeCuration(long curation_id,ModugardenUser users) { Curation curation = curationRepository.findById(curation_id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_CURATION)); - if(likeRepository.findByUserAndCuration(users.getUser(), curation).isPresent()) + if(likeCurationRepository.findByUserAndCuration(users.getUser(), curation).isPresent()) return new CurationGetMyLikeResponseDto(users.getUserId(),curation.getId(), true); return new CurationGetMyLikeResponseDto(users.getUserId(),curation.getId(), false); @@ -170,7 +170,7 @@ public CurationDeleteResponseDto delete(long id, ModugardenUser user) { // 보관 모두 삭제 curationStorageRepository.deleteAllByCuration_Id(curation.getId()); // 좋아요 모두 삭제 - likeRepository.deleteAllByCuration_Id(curation.getId()); + likeCurationRepository.deleteAllByCuration_Id(curation.getId()); curationRepository.delete(curation); } else @@ -185,10 +185,10 @@ public CurationLikeResponseDto createUnlikeCuration(Long curation_id, Modugarden Curation curation = curationRepository.findById(curation_id).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_CURATION)); User users = userRepository.findById(user.getUserId()).orElseThrow(() -> new BusinessException(ErrorMessage.USER_NOT_FOUND)); - likeRepository.findByUserAndCuration(users, curation) + likeCurationRepository.findByUserAndCuration(users, curation) .ifPresent(it -> { Curation modifyCuration = new Curation(curation.getId(), curation.getTitle(), curation.getLink(), curation.getPreviewImage(), curation.getLikeNum() - 1, curation.getUser(), curation.getCategory()); - likeRepository.delete(it); + likeCurationRepository.delete(it); curationRepository.save(modifyCuration); }); diff --git a/src/main/java/com/modugarden/domain/follow/controller/FollowController.java b/src/main/java/com/modugarden/domain/follow/controller/FollowController.java index be3202a..035826d 100644 --- a/src/main/java/com/modugarden/domain/follow/controller/FollowController.java +++ b/src/main/java/com/modugarden/domain/follow/controller/FollowController.java @@ -45,12 +45,12 @@ public BaseResponseDto profile(@PathVariable Long id, @Au //user가 following user을 following 함 //following user을 user가 follower 함 - //팔로워 명단조회 + //내 팔로워 명단조회 @GetMapping("/me/follower") public SliceResponseDto meFollowerList(@AuthenticationPrincipal ModugardenUser user, Pageable pageable) { return new SliceResponseDto<>(followService.meFollowerList(user.getUserId(), pageable)); } - //팔로잉 명단조회 + //내 팔로잉 명단조회 @GetMapping("/me/following") public SliceResponseDto meFollowingList( @AuthenticationPrincipal ModugardenUser user, Pageable pageable) { return new SliceResponseDto<>(followService.meFollowingList(user.getUserId(), pageable)); diff --git a/src/main/java/com/modugarden/domain/follow/service/FollowService.java b/src/main/java/com/modugarden/domain/follow/service/FollowService.java index 001464a..fd0fd6a 100644 --- a/src/main/java/com/modugarden/domain/follow/service/FollowService.java +++ b/src/main/java/com/modugarden/domain/follow/service/FollowService.java @@ -3,7 +3,6 @@ import com.modugarden.common.error.enums.ErrorMessage; import com.modugarden.common.error.exception.custom.BusinessException; import com.modugarden.domain.auth.entity.ModugardenUser; -import com.modugarden.domain.curation.entity.Curation; import com.modugarden.domain.follow.dto.FollowRecommendResponseDto; import com.modugarden.domain.follow.dto.FollowersResponseDto; import com.modugarden.domain.follow.dto.FollowingsResponseDto; @@ -22,7 +21,7 @@ import java.util.List; import static com.modugarden.common.error.enums.ErrorMessage.USER_NOT_FOUND; -//여기서는 인자에 @ 사용 안함 + @Transactional(readOnly = true) @RequiredArgsConstructor @Service diff --git a/src/main/java/com/modugarden/domain/like/repository/LikeBoardRepository.java b/src/main/java/com/modugarden/domain/like/repository/LikeBoardRepository.java index 7d1dfb4..585d48b 100644 --- a/src/main/java/com/modugarden/domain/like/repository/LikeBoardRepository.java +++ b/src/main/java/com/modugarden/domain/like/repository/LikeBoardRepository.java @@ -1,14 +1,15 @@ package com.modugarden.domain.like.repository; import com.modugarden.domain.board.entity.Board; -import com.modugarden.domain.curation.entity.Curation; import com.modugarden.domain.like.entity.LikeBoard; -import com.modugarden.domain.like.entity.LikeCuration; +import com.modugarden.domain.storage.entity.BoardStorage; import com.modugarden.domain.user.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface LikeBoardRepository extends JpaRepository { - Optional findByUserAndBoard(User user, Board board); + Optional findByUserAndBoard(User user, Board board); + + Optional deleteAllByBoard_Id(Long id); } diff --git a/src/main/java/com/modugarden/domain/like/repository/LikeRepository.java b/src/main/java/com/modugarden/domain/like/repository/LikeCurationRepository.java similarity index 85% rename from src/main/java/com/modugarden/domain/like/repository/LikeRepository.java rename to src/main/java/com/modugarden/domain/like/repository/LikeCurationRepository.java index d2576b4..fdab444 100644 --- a/src/main/java/com/modugarden/domain/like/repository/LikeRepository.java +++ b/src/main/java/com/modugarden/domain/like/repository/LikeCurationRepository.java @@ -9,7 +9,7 @@ import java.util.Optional; @Repository -public interface LikeRepository extends JpaRepository { +public interface LikeCurationRepository extends JpaRepository { Optional findByUserAndCuration(User user, Curation curation); Optional deleteAllByCuration_Id(Long id); } \ No newline at end of file diff --git a/src/main/java/com/modugarden/domain/report/controller/ReportController.java b/src/main/java/com/modugarden/domain/report/controller/ReportController.java index a2f8e5a..c4e99bb 100644 --- a/src/main/java/com/modugarden/domain/report/controller/ReportController.java +++ b/src/main/java/com/modugarden/domain/report/controller/ReportController.java @@ -2,13 +2,10 @@ import com.modugarden.common.response.BaseResponseDto; import com.modugarden.domain.auth.entity.ModugardenUser; -import com.modugarden.domain.comment.dto.CommentCreateRequestDto; -import com.modugarden.domain.comment.dto.CommentCreateResponseDto; import com.modugarden.domain.report.dto.response.ReportBoardResponseDto; import com.modugarden.domain.report.dto.response.ReportCommentResponseDto; import com.modugarden.domain.report.dto.response.ReportCurationResponseDto; import com.modugarden.domain.report.dto.response.ReportUserResponseDto; -import com.modugarden.domain.report.entity.enums.ReportType; import com.modugarden.domain.report.service.ReportService; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/modugarden/domain/storage/entity/BoardStorage.java b/src/main/java/com/modugarden/domain/storage/entity/BoardStorage.java index 4e74849..0dbacbb 100644 --- a/src/main/java/com/modugarden/domain/storage/entity/BoardStorage.java +++ b/src/main/java/com/modugarden/domain/storage/entity/BoardStorage.java @@ -4,6 +4,7 @@ import com.modugarden.domain.board.entity.Board; import com.modugarden.domain.user.entity.User; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -18,6 +19,7 @@ public class BoardStorage extends BaseTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) private User user; @@ -25,4 +27,10 @@ public class BoardStorage extends BaseTimeEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "board_id", nullable = false) private Board board; + + @Builder + public BoardStorage(User user, Board board) { + this.user = user; + this.board = board; + } } diff --git a/src/main/java/com/modugarden/domain/storage/entity/repository/BoardStorageRepository.java b/src/main/java/com/modugarden/domain/storage/entity/repository/BoardStorageRepository.java new file mode 100644 index 0000000..3727a36 --- /dev/null +++ b/src/main/java/com/modugarden/domain/storage/entity/repository/BoardStorageRepository.java @@ -0,0 +1,16 @@ +package com.modugarden.domain.storage.entity.repository; + +import com.modugarden.domain.board.entity.Board; +import com.modugarden.domain.board.entity.BoardImage; +import com.modugarden.domain.like.entity.LikeBoard; +import com.modugarden.domain.storage.entity.BoardStorage; +import com.modugarden.domain.user.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface BoardStorageRepository extends JpaRepository { + Optional findByUserAndBoard(User user, Board board); + + Optional deleteAllByBoard_Id(Long id); +} From 20e6bfaba4a150b138665b4b929a8523717be1cc Mon Sep 17 00:00:00 2001 From: mingsound <62479120+mingsound21@users.noreply.github.com> Date: Tue, 31 Jan 2023 21:57:38 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[FIX]=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 + .../comment/controller/CommentController.java | 43 +++++++++++++ .../comment/dto/CommentCreateRequestDto.java | 13 ++++ .../dto/request/CommentCreateRequestDto.java | 21 +++++++ .../dto/request/CommentDeleteRequestDto.java | 14 +++++ .../response/CommentCreateResponseDto.java | 13 ++++ .../response/CommentDeleteResponseDto.java | 10 +++ .../dto/response/CommentListResponseDto.java | 15 +++++ .../domain/comment/entity/Comment.java | 47 ++++++++++++++ .../comment/repository/CommentRepository.java | 17 ++++++ .../comment/service/CommentService.java | 61 +++++++++++++++++++ 11 files changed, 257 insertions(+) create mode 100644 src/main/java/com/modugarden/domain/comment/controller/CommentController.java create mode 100644 src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java create mode 100644 src/main/java/com/modugarden/domain/comment/dto/request/CommentCreateRequestDto.java create mode 100644 src/main/java/com/modugarden/domain/comment/dto/request/CommentDeleteRequestDto.java create mode 100644 src/main/java/com/modugarden/domain/comment/dto/response/CommentCreateResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/comment/dto/response/CommentDeleteResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/comment/dto/response/CommentListResponseDto.java create mode 100644 src/main/java/com/modugarden/domain/comment/entity/Comment.java create mode 100644 src/main/java/com/modugarden/domain/comment/repository/CommentRepository.java create mode 100644 src/main/java/com/modugarden/domain/comment/service/CommentService.java diff --git a/build.gradle b/build.gradle index 67dd10e..85029cd 100644 --- a/build.gradle +++ b/build.gradle @@ -85,6 +85,9 @@ dependencies { // Json implementation group: 'org.json', name: 'json', version: '20090211' + + // Redis + implementation 'org.springframework.boot:spring-boot-starter-data-redis:2.3.1.RELEASE' } tasks.named('test') { diff --git a/src/main/java/com/modugarden/domain/comment/controller/CommentController.java b/src/main/java/com/modugarden/domain/comment/controller/CommentController.java new file mode 100644 index 0000000..9455725 --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/controller/CommentController.java @@ -0,0 +1,43 @@ +package com.modugarden.domain.comment.controller; + +import com.modugarden.common.response.BaseResponseDto; +import com.modugarden.common.response.SliceResponseDto; +import com.modugarden.domain.auth.entity.ModugardenUser; +import com.modugarden.domain.comment.dto.request.CommentCreateRequestDto; +import com.modugarden.domain.comment.dto.request.CommentDeleteRequestDto; +import com.modugarden.domain.comment.dto.response.CommentCreateResponseDto; +import com.modugarden.domain.comment.dto.response.CommentDeleteResponseDto; +import com.modugarden.domain.comment.dto.response.CommentListResponseDto; +import com.modugarden.domain.comment.service.CommentService; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +// 컨트롤러에서 서비스 호출, 서비스에서 레퍼지토리를 호출 +@RequiredArgsConstructor +@RestController +@RequestMapping("/boards") +public class CommentController { + private final CommentService commentService; + + // 댓글 전체 조회 + @GetMapping("/{board_id}/comments") + public SliceResponseDto commentList(@PathVariable Long board_id, @AuthenticationPrincipal ModugardenUser modugardenUser, Pageable pageable) { + return new SliceResponseDto<>(commentService.commentList(board_id, modugardenUser.getUser(), pageable)); + } + + // 댓글, 대댓글 작성 + @PostMapping("/{board_id}/comments") + public BaseResponseDto write(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody @Valid CommentCreateRequestDto dto, @PathVariable Long board_id) { + return new BaseResponseDto<>(commentService.write(modugardenUser.getUser(), board_id, dto)); + } + + // 댓글 삭제 + @PatchMapping("/{board_id}/comments/{comment_id}") + public BaseResponseDto delete(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody CommentDeleteRequestDto dto, @PathVariable Long board_id) { + return new BaseResponseDto<>(commentService.delete(modugardenUser.getUser(), dto)); + } +} \ No newline at end of file diff --git a/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java b/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java new file mode 100644 index 0000000..0331298 --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/dto/CommentCreateRequestDto.java @@ -0,0 +1,13 @@ +package com.modugarden.domain.comment.dto.response; + +import com.modugarden.domain.board.entity.Board; +import com.modugarden.domain.comment.entity.Comment; +import com.modugarden.domain.user.entity.User; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class CommentCreateResponseDto { + private Long commentId; +} \ No newline at end of file diff --git a/src/main/java/com/modugarden/domain/comment/dto/request/CommentCreateRequestDto.java b/src/main/java/com/modugarden/domain/comment/dto/request/CommentCreateRequestDto.java new file mode 100644 index 0000000..a9c65e3 --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/dto/request/CommentCreateRequestDto.java @@ -0,0 +1,21 @@ +package com.modugarden.domain.comment.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + + +@Getter +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CommentCreateRequestDto { + @NotBlank(message = "댓글은 필수 입력 값입니다.") + @Size(max= 40) + private String content; + private Long parentId; +} diff --git a/src/main/java/com/modugarden/domain/comment/dto/request/CommentDeleteRequestDto.java b/src/main/java/com/modugarden/domain/comment/dto/request/CommentDeleteRequestDto.java new file mode 100644 index 0000000..707ce3c --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/dto/request/CommentDeleteRequestDto.java @@ -0,0 +1,14 @@ +package com.modugarden.domain.comment.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CommentDeleteRequestDto { + private Long commentId; +} diff --git a/src/main/java/com/modugarden/domain/comment/dto/response/CommentCreateResponseDto.java b/src/main/java/com/modugarden/domain/comment/dto/response/CommentCreateResponseDto.java new file mode 100644 index 0000000..f73839c --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/dto/response/CommentCreateResponseDto.java @@ -0,0 +1,13 @@ +package com.modugarden.domain.comment.dto.response; + +import com.modugarden.domain.board.entity.Board; +import com.modugarden.domain.comment.entity.Comment; +import com.modugarden.domain.user.entity.User; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class CommentCreateResponseDto { + private Long commentId; +} diff --git a/src/main/java/com/modugarden/domain/comment/dto/response/CommentDeleteResponseDto.java b/src/main/java/com/modugarden/domain/comment/dto/response/CommentDeleteResponseDto.java new file mode 100644 index 0000000..1faa893 --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/dto/response/CommentDeleteResponseDto.java @@ -0,0 +1,10 @@ +package com.modugarden.domain.comment.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class CommentDeleteResponseDto { + private Long commentId; +} diff --git a/src/main/java/com/modugarden/domain/comment/dto/response/CommentListResponseDto.java b/src/main/java/com/modugarden/domain/comment/dto/response/CommentListResponseDto.java new file mode 100644 index 0000000..283da03 --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/dto/response/CommentListResponseDto.java @@ -0,0 +1,15 @@ +package com.modugarden.domain.comment.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class CommentListResponseDto { + private Long userId; + private String nickname; + private String profileImage; + private String comment; + private Long commentId; + private Long parentId; +} diff --git a/src/main/java/com/modugarden/domain/comment/entity/Comment.java b/src/main/java/com/modugarden/domain/comment/entity/Comment.java new file mode 100644 index 0000000..3e4f093 --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/entity/Comment.java @@ -0,0 +1,47 @@ +package com.modugarden.domain.comment.entity; + +import com.modugarden.common.entity.BaseTimeEntity; +import com.modugarden.domain.board.entity.Board; +import com.modugarden.domain.user.entity.User; +import lombok.*; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import javax.persistence.*; + +@Getter +@Setter +@NoArgsConstructor(access = AccessLevel.PUBLIC) +@Entity +public class Comment extends BaseTimeEntity { + + //댓글 id + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long commentId; + //내용 + @Column(nullable = false, length = 40) + private String content; + //validation 할 때 글자 수 제한 물어보기 + //부모댓글 id + private Long parentId; + //포스트 id + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "board_id", nullable = false) + private Board board; + //회원 id + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; + @Builder + public Comment(String content, Long parentId, Board board, User user) { + this.content = content; + this.parentId = parentId; + this.board = board; + this.user = user; + } + public void updateParentIdOfParentComment(){ + this.parentId = this.commentId; + } + +} diff --git a/src/main/java/com/modugarden/domain/comment/repository/CommentRepository.java b/src/main/java/com/modugarden/domain/comment/repository/CommentRepository.java new file mode 100644 index 0000000..dd9fa61 --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/repository/CommentRepository.java @@ -0,0 +1,17 @@ +package com.modugarden.domain.comment.repository; + +import com.modugarden.domain.comment.entity.Comment; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.Optional; +@Repository +public interface CommentRepository extends JpaRepository { + //댓글 조회 + Slice findAllByBoard_IdOrderByCreatedDateAsc(@Param("board_Id") Long boardId, Pageable pageable); + //동해 오빠꺼 + Optional deleteAllByBoard_Id(Long id); +} \ No newline at end of file diff --git a/src/main/java/com/modugarden/domain/comment/service/CommentService.java b/src/main/java/com/modugarden/domain/comment/service/CommentService.java new file mode 100644 index 0000000..c796972 --- /dev/null +++ b/src/main/java/com/modugarden/domain/comment/service/CommentService.java @@ -0,0 +1,61 @@ +package com.modugarden.domain.comment.service; + +import com.modugarden.common.error.enums.ErrorMessage; +import com.modugarden.common.error.exception.custom.BusinessException; +import com.modugarden.domain.board.entity.Board; +import com.modugarden.domain.board.repository.BoardRepository; +import com.modugarden.domain.comment.dto.request.CommentCreateRequestDto; +import com.modugarden.domain.comment.dto.request.CommentDeleteRequestDto; +import com.modugarden.domain.comment.dto.response.CommentCreateResponseDto; +import com.modugarden.domain.comment.dto.response.CommentDeleteResponseDto; +import com.modugarden.domain.comment.dto.response.CommentListResponseDto; +import com.modugarden.domain.comment.entity.Comment; +import com.modugarden.domain.comment.repository.CommentRepository; +import com.modugarden.domain.user.entity.User; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class CommentService { + private final CommentRepository commentRepository; + private final BoardRepository boardRepository; + + //댓글 조회 + //부모 댓글로 조회후 부모댓글이 같다면 시간순으로 조회 + public Slice commentList(Long boardId, User user, Pageable pageable){ + Slice comments = commentRepository.findAllByBoard_IdOrderByCreatedDateAsc(boardId, pageable); + Slice result = comments + .map(c -> new CommentListResponseDto(c.getUser().getId(), c.getUser().getNickname(), c.getUser().getProfileImg(), c.getContent(), c.getCommentId(), c.getParentId())); //commentId를 가져와야 하나? + return result; + } + //댓글 작성 + //create할 때 본인이 부모댓글인지 여부 확인과, 본인이 자식 댓글이면 Parent의 commentId가 필요하다 + @Transactional + public CommentCreateResponseDto write(User user, Long boardId, CommentCreateRequestDto dto) { + Board board = boardRepository.findById(boardId).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_POST)); + Comment newComment; + if (dto.getParentId() == null) { // 부모 댓글 작성 + newComment = new Comment(dto.getContent(), 0L, board, user); // parentId에 일단 아무값이나 채우기(DB에서 not null 조건 있어서) + commentRepository.save(newComment); // newComment.getCommentId -> 자동생성된 값이 있음. + newComment.updateParentIdOfParentComment(); + } else { + commentRepository.findById(dto.getParentId()).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_PARENT_COMMENT_ID));// 존재하는 부모댓글인지 확인 + newComment = new Comment(dto.getContent(), dto.getParentId(), board, user); + commentRepository.save(newComment); + } + return new CommentCreateResponseDto(newComment.getCommentId()); + } + + //댓글 삭제 + @Transactional + public CommentDeleteResponseDto delete(User user, CommentDeleteRequestDto dto){ + commentRepository.findById(dto.getCommentId()).orElseThrow(() -> new BusinessException(ErrorMessage.WRONG_COMMENT)); + commentRepository.deleteById(dto.getCommentId()); + return new CommentDeleteResponseDto(dto.getCommentId()); + } +} \ No newline at end of file