diff --git a/src/main/java/site/campingon/campingon/bookmark/controller/BookMarkController.java b/src/main/java/site/campingon/campingon/bookmark/controller/BookMarkController.java index 0f23236d..e223fa4e 100644 --- a/src/main/java/site/campingon/campingon/bookmark/controller/BookMarkController.java +++ b/src/main/java/site/campingon/campingon/bookmark/controller/BookMarkController.java @@ -4,11 +4,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.*; import site.campingon.campingon.bookmark.service.BookmarkService; import site.campingon.campingon.common.jwt.CustomUserDetails; -import site.campingon.campingon.user.entity.User; @Slf4j @RestController diff --git a/src/main/java/site/campingon/campingon/bookmark/service/BookmarkService.java b/src/main/java/site/campingon/campingon/bookmark/service/BookmarkService.java index 5e43e60b..f81e8c2d 100644 --- a/src/main/java/site/campingon/campingon/bookmark/service/BookmarkService.java +++ b/src/main/java/site/campingon/campingon/bookmark/service/BookmarkService.java @@ -6,6 +6,8 @@ import site.campingon.campingon.bookmark.entity.Bookmark; import site.campingon.campingon.bookmark.repository.BookmarkRepository; import site.campingon.campingon.camp.entity.Camp; +import site.campingon.campingon.camp.entity.CampInfo; +import site.campingon.campingon.camp.repository.CampInfoRepository; import site.campingon.campingon.camp.repository.CampRepository; import site.campingon.campingon.common.exception.ErrorCode; import site.campingon.campingon.common.exception.GlobalException; @@ -21,16 +23,20 @@ public class BookmarkService { private final BookmarkRepository bookmarkRepository; private final CampRepository campRepository; private final UserRepository userRepository; + private final CampInfoRepository campInfoRepository; // 찜 기능 (토글활용) public void bookmarkCamp(Long campId, Long userId) { // 이미 찜 관계가 있는지 확인 Optional existingBookmark = bookmarkRepository.findByCampIdAndUserId(campId, userId); + CampInfo campInfo = campInfoRepository.findByCampId(campId) + .orElseThrow(() -> new GlobalException(ErrorCode.CAMP_NOT_FOUND_BY_ID)); // 이미 찜 등록이 된경우 if (existingBookmark.isPresent()) { // isMarked 상태를 반대로 토글 - true->false, false->true로 전환 bookmarkRepository.delete(existingBookmark.get()); + campInfo.updateBookmarkCntDown(); return; // 변경 후 반환 } @@ -47,6 +53,7 @@ public void bookmarkCamp(Long campId, Long userId) { .build(); // isMarked는 기본값 true bookmarkRepository.save(bookmark); + campInfo.updateBookmarkCntUp(); } } diff --git a/src/main/java/site/campingon/campingon/camp/entity/CampInfo.java b/src/main/java/site/campingon/campingon/camp/entity/CampInfo.java index dc87e254..0bbe3e0b 100644 --- a/src/main/java/site/campingon/campingon/camp/entity/CampInfo.java +++ b/src/main/java/site/campingon/campingon/camp/entity/CampInfo.java @@ -30,4 +30,16 @@ public class CampInfo { @Builder.Default @Column(name = "bookmark_cnt") private Integer bookmarkCnt = 0; + + public void updateBookmarkCntUp() { + bookmarkCnt++; + } + + public void updateBookmarkCntDown() { + bookmarkCnt--; + } + + public void updateRecommendCntUp() { + recommendCnt++; + } } \ No newline at end of file diff --git a/src/main/java/site/campingon/campingon/camp/mapper/CampMapper.java b/src/main/java/site/campingon/campingon/camp/mapper/CampMapper.java index 68bb4194..43faffc5 100644 --- a/src/main/java/site/campingon/campingon/camp/mapper/CampMapper.java +++ b/src/main/java/site/campingon/campingon/camp/mapper/CampMapper.java @@ -87,6 +87,7 @@ default CampInfoDto toCampInfoDto(CampInfo campInfo) { return CampInfoDto.builder() .recommendCnt(campInfo.getRecommendCnt()) .bookmarkCnt(campInfo.getBookmarkCnt()) + .campInfoId(campInfo.getId()) .build(); } } \ No newline at end of file diff --git a/src/main/java/site/campingon/campingon/camp/repository/CampInfoRepository.java b/src/main/java/site/campingon/campingon/camp/repository/CampInfoRepository.java index 2ff39eb6..14f979c1 100644 --- a/src/main/java/site/campingon/campingon/camp/repository/CampInfoRepository.java +++ b/src/main/java/site/campingon/campingon/camp/repository/CampInfoRepository.java @@ -4,7 +4,9 @@ import org.springframework.stereotype.Repository; import site.campingon.campingon.camp.entity.CampInfo; +import java.util.Optional; + @Repository public interface CampInfoRepository extends JpaRepository { - boolean findByCampId(Long id); + Optional findByCampId(Long id); } \ No newline at end of file diff --git a/src/main/java/site/campingon/campingon/review/service/ReviewService.java b/src/main/java/site/campingon/campingon/review/service/ReviewService.java index 0701acc3..b15521fe 100644 --- a/src/main/java/site/campingon/campingon/review/service/ReviewService.java +++ b/src/main/java/site/campingon/campingon/review/service/ReviewService.java @@ -4,14 +4,13 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import site.campingon.campingon.camp.entity.Camp; -import site.campingon.campingon.camp.entity.CampSite; +import site.campingon.campingon.camp.entity.CampInfo; +import site.campingon.campingon.camp.repository.CampInfoRepository; import site.campingon.campingon.camp.repository.CampRepository; -import site.campingon.campingon.camp.repository.CampSiteRepository; import site.campingon.campingon.common.exception.GlobalException; import site.campingon.campingon.common.s3bucket.service.S3BucketService; import site.campingon.campingon.reservation.entity.Reservation; @@ -19,7 +18,6 @@ import site.campingon.campingon.reservation.repository.ReservationRepository; import site.campingon.campingon.review.dto.ReviewCreateRequestDto; import site.campingon.campingon.review.dto.ReviewResponseDto; -import site.campingon.campingon.review.dto.ReviewUpdateRequestDto; import site.campingon.campingon.review.entity.Review; import site.campingon.campingon.review.entity.ReviewImage; import site.campingon.campingon.review.mapper.ReviewImageMapper; @@ -30,7 +28,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import static site.campingon.campingon.common.exception.ErrorCode.*; import static site.campingon.campingon.common.exception.ErrorCode.REVIEW_ALREADY_SUBMITTED; @@ -48,6 +45,7 @@ public class ReviewService { private final ReviewMapper reviewMapper; private final ReviewImageMapper reviewImageMapper; private final S3BucketService s3BucketService; + private final CampInfoRepository campInfoRepository; private static final long MAX_FILE_SIZE = 10 * 1024 * 1024; private static final int MAX_FILES_COUNT = 5; // 최대 파일 개수 제한 @@ -87,6 +85,13 @@ public ReviewResponseDto createReview( reviewImageRepository.saveAll(reviewImages); } + //추천한다면 CampInfo 업데이트 + CampInfo campInfo = campInfoRepository.findByCampId(campId) + .orElseThrow(() -> new GlobalException(CAMP_NOT_FOUND_BY_ID)); + if (requestDto.isRecommended()) { + campInfo.updateRecommendCntUp(); + } + // 저장된 Review 엔티티를 ReviewResponseDto로 반환 return reviewMapper.toResponseDto(savedReview); }