diff --git a/src/main/java/com/haejwo/tripcometrue/domain/triprecord/repository/TripRecordViewCountRepository.java b/src/main/java/com/haejwo/tripcometrue/domain/triprecord/repository/TripRecordViewCountRepository.java new file mode 100644 index 00000000..37d58954 --- /dev/null +++ b/src/main/java/com/haejwo/tripcometrue/domain/triprecord/repository/TripRecordViewCountRepository.java @@ -0,0 +1,13 @@ +package com.haejwo.tripcometrue.domain.triprecord.repository; + +import com.haejwo.tripcometrue.domain.triprecord.entity.TripRecord; +import com.haejwo.tripcometrue.domain.triprecord.entity.TripRecordViewCount; +import java.time.LocalDate; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TripRecordViewCountRepository extends JpaRepository { + + Optional findByTripRecordAndDate(TripRecord tripRecord, LocalDate date); + +} diff --git a/src/main/java/com/haejwo/tripcometrue/domain/triprecord/service/TripRecordService.java b/src/main/java/com/haejwo/tripcometrue/domain/triprecord/service/TripRecordService.java index c0827ca3..0277572b 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/triprecord/service/TripRecordService.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/triprecord/service/TripRecordService.java @@ -5,18 +5,24 @@ import com.haejwo.tripcometrue.domain.triprecord.dto.response.triprecord.TripRecordDetailResponseDto; import com.haejwo.tripcometrue.domain.triprecord.dto.response.triprecord.TripRecordResponseDto; import com.haejwo.tripcometrue.domain.triprecord.entity.TripRecord; +import com.haejwo.tripcometrue.domain.triprecord.entity.TripRecordViewCount; import com.haejwo.tripcometrue.domain.triprecord.exception.TripRecordNotFoundException; import com.haejwo.tripcometrue.domain.triprecord.repository.TripRecordRepository; +import com.haejwo.tripcometrue.domain.triprecord.repository.TripRecordViewCountRepository; import com.haejwo.tripcometrue.global.springsecurity.PrincipalDetails; +import java.time.LocalDate; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor +@Slf4j public class TripRecordService { private final TripRecordRepository tripRecordRepository; + private final TripRecordViewCountRepository tripRecordViewCountRepository; @Transactional public TripRecordResponseDto addTripRecord(PrincipalDetails principalDetails, TripRecordRequestDto requestDto) { @@ -28,10 +34,15 @@ public TripRecordResponseDto addTripRecord(PrincipalDetails principalDetails, Tr return responseDto; } - @Transactional(readOnly = true) - public TripRecordDetailResponseDto findTripRecord(Long tripRecordId) { - + @Transactional + public TripRecordDetailResponseDto findTripRecord(PrincipalDetails principalDetails, Long tripRecordId) { + + Long memberId = principalDetails.getMember().getId(); TripRecord findTripRecord = findTripRecordById(tripRecordId); + + if(memberId != findTripRecord.getMember().getId()) { findTripRecord.incrementViewCount(); } + incrementViewCount(findTripRecord); + TripRecordDetailResponseDto responseDto = TripRecordDetailResponseDto.fromEntity(findTripRecord); return responseDto; @@ -52,6 +63,7 @@ public TripRecordResponseDto modifyTripRecord(PrincipalDetails principalDetails, return responseDto; } + @Transactional public void removeTripRecord(PrincipalDetails principalDetails, Long tripRecordId) { TripRecord findTripRecord = findTripRecordById(tripRecordId); @@ -63,6 +75,29 @@ public void removeTripRecord(PrincipalDetails principalDetails, Long tripRecordI tripRecordRepository.delete(findTripRecord); } + @Transactional + public void incrementViewCount(TripRecord tripRecord) { + + LocalDate today = LocalDate.now(); + + TripRecordViewCount viewCountEntity = tripRecordViewCountRepository.findByTripRecordAndDate(tripRecord, today) + .orElseGet(() -> createNewViewCount(tripRecord, today)); + + viewCountEntity.incrementViewCount(); + tripRecordViewCountRepository.save(viewCountEntity); + + } + + private TripRecordViewCount createNewViewCount(TripRecord tripRecord, LocalDate today) { + return TripRecordViewCount.builder() + .date(today) + .tripRecord(tripRecord) + .viewCount(0) + .build(); + } + + + private TripRecord findTripRecordById(Long tripRecordId) { TripRecord findTripRecord = tripRecordRepository.findById(tripRecordId) .orElseThrow(TripRecordNotFoundException::new);