From e9f8ec70e6d1422a24d7031e9fe92c13c74adbfa Mon Sep 17 00:00:00 2001 From: hen715 Date: Wed, 22 Jan 2025 20:37:43 +0900 Subject: [PATCH] =?UTF-8?q?[Feat]=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=B0=A8=EB=8B=A8=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostController.java | 4 +-- .../post/repository/PostRepository.java | 11 +++--- .../domain/post/service/PostService.java | 35 +++++++++++-------- .../report/repository/ReportRepository.java | 7 ++++ .../global/exception/ex/MyErrorCode.java | 3 +- 5 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/main/java/kr/inuappcenterportal/inuportal/domain/post/controller/PostController.java b/src/main/java/kr/inuappcenterportal/inuportal/domain/post/controller/PostController.java index 31ef082..201efe5 100644 --- a/src/main/java/kr/inuappcenterportal/inuportal/domain/post/controller/PostController.java +++ b/src/main/java/kr/inuappcenterportal/inuportal/domain/post/controller/PostController.java @@ -133,7 +133,7 @@ public ResponseEntity> scrapPost(@AuthenticationPrincipal M @GetMapping("") public ResponseEntity>> getAllPost(@RequestParam(required = false) String category, @RequestParam(required = false,defaultValue = "date") String sort ,@RequestParam(required = false,defaultValue = "1") @Min(1) int page,@AuthenticationPrincipal Member member ){ - return ResponseEntity.ok(ResponseDto.of(postService.getAllPost(category, sort,page),"모든 게시글 가져오기 성공")); + return ResponseEntity.ok(ResponseDto.of(postService.getAllPost(category, sort,page,member),"모든 게시글 가져오기 성공")); } @@ -174,7 +174,7 @@ public ResponseEntity>> getPostForMain(){ }) @GetMapping("/mobile") public ResponseEntity>> getPostForMobile(@RequestParam(required = false) Long lastPostId, @RequestParam(required = false) String category, @AuthenticationPrincipal Member member){ - return ResponseEntity.ok(ResponseDto.of(postService.getPostForInf(lastPostId,category),"모바일용 게시글 리스트 가져오기 성공")); + return ResponseEntity.ok(ResponseDto.of(postService.getPostForInf(lastPostId,category,member),"모바일용 게시글 리스트 가져오기 성공")); } } diff --git a/src/main/java/kr/inuappcenterportal/inuportal/domain/post/repository/PostRepository.java b/src/main/java/kr/inuappcenterportal/inuportal/domain/post/repository/PostRepository.java index 36776b6..8c155c4 100644 --- a/src/main/java/kr/inuappcenterportal/inuportal/domain/post/repository/PostRepository.java +++ b/src/main/java/kr/inuappcenterportal/inuportal/domain/post/repository/PostRepository.java @@ -9,6 +9,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; import java.util.Optional; @@ -17,11 +18,6 @@ public interface PostRepository extends JpaRepository { Optional findByIdAndIsDeletedFalse(Long id); @Query("SELECT p FROM Post p LEFT JOIN FETCH p.member m WHERE p.id = :id AND p.isDeleted = false") Optional findByIdAndIsDeletedFalseWithPostMember(Long id); - Page findAllByCategoryAndIsDeletedFalse(String category,Pageable pageable); - - Page findAllByIsDeletedFalse(Pageable pageable); - - List findAllByIdLessThanAndIsDeletedFalse(Long id, Pageable pageable); List findByCategoryAndIdLessThanAndIsDeletedFalse(String category,Long id,Pageable pageable); long count(); List findAllByMemberAndIsDeletedFalse(Member member, Sort sort); @@ -44,5 +40,10 @@ public interface PostRepository extends JpaRepository { Optional findByIdWithLock(Long id); + @Query(" SELECT p FROM Post p WHERE p.isDeleted = false AND (:category IS NULL OR p.category = :category) AND (:postIds IS NULL OR p.id NOT IN :postIds)") + Page findAllByCategoryExcludingPostIds(@Param("category") String category, @Param("postIds") List postIds, Pageable pageable); + + @Query(" SELECT p FROM Post p WHERE p.isDeleted = false AND (:category IS NULL OR p.category = :category) AND (:id IS NULL OR p.id < :id) AND (:postIds IS NULL OR p.id NOT IN :postIds)") + List findFilteredPosts(@Param("category") String category, @Param("id") Long id, @Param("postIds") List postIds, Pageable pageable); } diff --git a/src/main/java/kr/inuappcenterportal/inuportal/domain/post/service/PostService.java b/src/main/java/kr/inuappcenterportal/inuportal/domain/post/service/PostService.java index 24bd4d2..5f6ba2a 100644 --- a/src/main/java/kr/inuappcenterportal/inuportal/domain/post/service/PostService.java +++ b/src/main/java/kr/inuappcenterportal/inuportal/domain/post/service/PostService.java @@ -11,6 +11,7 @@ import kr.inuappcenterportal.inuportal.domain.postLike.model.PostLike; import kr.inuappcenterportal.inuportal.domain.postLike.repository.LikePostRepository; import kr.inuappcenterportal.inuportal.domain.reply.service.ReplyService; +import kr.inuappcenterportal.inuportal.domain.report.repository.ReportRepository; import kr.inuappcenterportal.inuportal.domain.scrap.model.Scrap; import kr.inuappcenterportal.inuportal.domain.scrap.repository.ScrapRepository; import kr.inuappcenterportal.inuportal.global.dto.ListResponseDto; @@ -45,6 +46,7 @@ public class PostService { private final CategoryRepository categoryRepository; private final RedisService redisService; private final ImageService imageService; + private final ReportRepository reportRepository; @Value("${postImagePath}") private String path; @@ -105,6 +107,9 @@ public void delete(Long memberId, Long postId) throws IOException { @Transactional public PostResponseDto getPost(Long postId,Member member,String address){ Post post = postRepository.findByIdAndIsDeletedFalseWithPostMember(postId).orElseThrow(()->new MyException(MyErrorCode.POST_NOT_FOUND)); + if(member!=null&&reportRepository.existsByPostIdAndMemberId(postId,member.getId())){ + throw new MyException(MyErrorCode.BANNED_POST); + } if(redisService.isFirstConnect(address,postId,"post")){ redisService.insertAddress(address,postId,"post"); post.upViewCount(); @@ -143,19 +148,18 @@ public PostResponseDto getPost(Long postId,Member member,String address){ @Transactional(readOnly = true) - public ListResponseDto getAllPost(String category, String sort, int page){ + public ListResponseDto getAllPost(String category, String sort, int page, Member member){ Pageable pageable = PageRequest.of(page>0?--page:page,8,sortData(sort)); Page dto; - if(category==null){ - dto = postRepository.findAllByIsDeletedFalse(pageable); + List postIds = null; + if (category != null && !categoryRepository.existsByCategory(category)) { + throw new MyException(MyErrorCode.CATEGORY_NOT_FOUND); } - else{ - if(!categoryRepository.existsByCategory(category)){ - throw new MyException(MyErrorCode.CATEGORY_NOT_FOUND); - } - dto = postRepository.findAllByCategoryAndIsDeletedFalse(category, pageable); + if(member!=null) { + postIds = reportRepository.findPostIdsByMemberId(member.getId()); } - long total = dto.getTotalElements(); + dto = postRepository.findAllByCategoryExcludingPostIds(category,postIds,pageable); + long total = dto.getTotalElements(); long pages = dto.getTotalPages(); List posts = dto.stream() .map(this::getPostListResponseDto) @@ -293,19 +297,20 @@ public ListResponseDto searchInScrap(Member member, String @Transactional(readOnly = true) - public List getPostForInf(Long lastPostId,String category){ + public List getPostForInf(Long lastPostId,String category, Member member){ Pageable pageable = PageRequest.of(0,8,sortData("date")); - if(lastPostId==null&&category==null){ - return postRepository.findAllByIsDeletedFalse(pageable).stream().map(this::getPostListResponseDto).collect(Collectors.toList()); + List postIds = null; + if(member!=null){ + postIds = reportRepository.findPostIdsByMemberId(member.getId()); } - else if(lastPostId == null){ - return postRepository.findAllByCategoryAndIsDeletedFalse(category,pageable).stream().map(this::getPostListResponseDto).collect(Collectors.toList()); + if(lastPostId==null){ + return postRepository.findAllByCategoryExcludingPostIds(category,postIds,pageable).stream().map(this::getPostListResponseDto).collect(Collectors.toList()); } else if(category!=null){ return postRepository.findByCategoryAndIdLessThanAndIsDeletedFalse(category,lastPostId,pageable).stream().map(this::getPostListResponseDto).collect(Collectors.toList()); } else { - return postRepository.findAllByIdLessThanAndIsDeletedFalse(lastPostId, pageable).stream().map(this::getPostListResponseDto).collect(Collectors.toList()); + return postRepository.findFilteredPosts(category,lastPostId,postIds, pageable).stream().map(this::getPostListResponseDto).collect(Collectors.toList()); } } diff --git a/src/main/java/kr/inuappcenterportal/inuportal/domain/report/repository/ReportRepository.java b/src/main/java/kr/inuappcenterportal/inuportal/domain/report/repository/ReportRepository.java index 6f9e7fe..311dbbe 100644 --- a/src/main/java/kr/inuappcenterportal/inuportal/domain/report/repository/ReportRepository.java +++ b/src/main/java/kr/inuappcenterportal/inuportal/domain/report/repository/ReportRepository.java @@ -4,8 +4,15 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; public interface ReportRepository extends JpaRepository { Page findAllBy(Pageable pageable); + boolean existsByPostIdAndMemberId(Long postId, Long memberId); + @Query("SELECT r.postId FROM Report r WHERE r.memberId = :memberId") + List findPostIdsByMemberId(@Param("memberId") Long memberId); } diff --git a/src/main/java/kr/inuappcenterportal/inuportal/global/exception/ex/MyErrorCode.java b/src/main/java/kr/inuappcenterportal/inuportal/global/exception/ex/MyErrorCode.java index 471da56..29a50f0 100644 --- a/src/main/java/kr/inuappcenterportal/inuportal/global/exception/ex/MyErrorCode.java +++ b/src/main/java/kr/inuappcenterportal/inuportal/global/exception/ex/MyErrorCode.java @@ -63,7 +63,8 @@ public enum MyErrorCode { DUPLICATE_RESERVATION(HttpStatus.BAD_REQUEST, "동일한 사용자의 예약이 존재합니다."), RESERVATION_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 예약"), HAS_NOT_RESERVATION_AUTHORIZATION(HttpStatus.NOT_FOUND, "이 예약에 대한 삭제 권한이 없습니다."), - LOST_PROPERTY_NOT_FOUND(HttpStatus.NOT_FOUND, "이 예약에 대한 삭제 권한이 없습니다."); + LOST_PROPERTY_NOT_FOUND(HttpStatus.NOT_FOUND, "이 예약에 대한 삭제 권한이 없습니다."), + BANNED_POST(HttpStatus.NOT_FOUND,"차단한 게시글입니다."); private final HttpStatus status; private final String message;