Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat] 여행 후기 리뷰(TripRecordReview)의 본문(content) 작성 가능 여부 검증 로직 구현 #121

Merged
merged 2 commits into from
Jan 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
public record EmptyTripRecordReviewResponseDto(

Long totalCount,
Float myRatingScore
Long myTripRecordReviewId,
Float myRatingScore,
boolean canRegisterContent

) implements LatestReviewResponseDto {
public static EmptyTripRecordReviewResponseDto fromData(Long totalCount, Float myRatingScore) {
return new EmptyTripRecordReviewResponseDto(totalCount, myRatingScore);
public static EmptyTripRecordReviewResponseDto fromData(Long totalCount, Long myTripRecordReviewId, Float myRatingScore, boolean canRegisterContent) {
return new EmptyTripRecordReviewResponseDto(totalCount, myTripRecordReviewId, myRatingScore, canRegisterContent);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,22 @@ public record LatestTripRecordReviewResponseDto(

Long totalCount,
TripRecordReviewResponseDto latestTripRecordReview,
Float myRatingScore
Long myTripRecordReviewId,
Float myRatingScore,
boolean canRegisterContent

) implements LatestReviewResponseDto {
public static LatestTripRecordReviewResponseDto fromEntity(Long totalCount, TripRecordReview tripRecordReview, Float myRatingScore) {
public static LatestTripRecordReviewResponseDto fromEntity(
Long totalCount,
TripRecordReview tripRecordReview,
Long myTripRecordReviewId,
Float myRatingScore,
boolean canRegisterContent) {
return new LatestTripRecordReviewResponseDto(
totalCount,
TripRecordReviewResponseDto.fromEntity(tripRecordReview, false),
myRatingScore);
myTripRecordReviewId,
myRatingScore,
canRegisterContent);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,14 @@ public interface TripRecordReviewRepository extends JpaRepository<TripRecordRevi
@Query("select trr from TripRecordReview trr join fetch trr.member m where trr.member = :member and trr.content is not null order by trr.createdAt desc")
Page<TripRecordReview> findByMember(@Param("member") Member member, Pageable pageable);

@Query("select trr.ratingScore from TripRecordReview trr where trr.member = :member and trr.tripRecord.id = :tripRecordId")
Optional<Float> findMyScoreByMemberAndTripRecordId(@Param("member") Member member, @Param("tripRecordId") Long tripRecordId);
@Query("select trr from TripRecordReview trr where trr.member = :member and trr.tripRecord.id = :tripRecordId")
Optional<TripRecordReview> findByMemberAndTripRecordId(@Param("member") Member member, @Param("tripRecordId") Long tripRecordId);

@Query("select trr from TripRecordReview trr where trr.tripRecord.id = :tripRecordId and trr.content is not null order by trr.createdAt desc limit 1")
Optional<TripRecordReview> findTopByTripRecordIdOrderByCreatedAtDesc(@Param("tripRecordId") Long tripRecordId);

boolean existsByMemberAndTripRecord(Member member, TripRecord tripRecord);

@Query("select count(trr) from TripRecordReview trr where trr.content is not null")
Long countByTripRecordId(Long tripRecordId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import com.haejwo.tripcometrue.domain.review.triprecordreview.entity.TripRecordReview;
import com.haejwo.tripcometrue.domain.review.triprecordreview.exception.*;
import com.haejwo.tripcometrue.domain.review.triprecordreview.repository.TripRecordReviewRepository;
import com.haejwo.tripcometrue.domain.tripplan.entity.TripPlan;
import com.haejwo.tripcometrue.domain.tripplan.repository.TripPlanRepository;
import com.haejwo.tripcometrue.domain.triprecord.entity.TripRecord;
import com.haejwo.tripcometrue.domain.triprecord.exception.TripRecordNotFoundException;
import com.haejwo.tripcometrue.domain.triprecord.repository.triprecord.TripRecordRepository;
Expand All @@ -32,6 +34,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
Expand All @@ -45,6 +48,7 @@ public class TripRecordReviewService {
private final TripRecordReviewRepository tripRecordReviewRepository;
private final TripRecordRepository tripRecordRepository;
private final MemberRepository memberRepository;
private final TripPlanRepository tripPlanRepository;

// FIXME: 1/18/24 ratingScore @NotNull과 상충되는 부분 수정하기
@Transactional
Expand Down Expand Up @@ -181,17 +185,36 @@ public LatestReviewResponseDto getLatestReview(PrincipalDetails principalDetails
getTripRecordById(tripRecordId);
Member loginMember = getMember(principalDetails);

Long totalCount = tripRecordReviewRepository.countByTripRecordId(tripRecordId);
Float myScore = tripRecordReviewRepository
.findMyScoreByMemberAndTripRecordId(loginMember, tripRecordId).orElse(0f);

Optional<TripRecordReview> latestReview = tripRecordReviewRepository
.findTopByTripRecordIdOrderByCreatedAtDesc(tripRecordId);

Long totalCount = tripRecordReviewRepository.countByTripRecordId(tripRecordId);
Optional<TripRecordReview> myReview = tripRecordReviewRepository
.findByMemberAndTripRecordId(loginMember, tripRecordId);

String content = myReview.map(TripRecordReview::getContent).orElse(null);
Long myReviewId = myReview.map(TripRecordReview::getId).orElse(null);
Float myRatingScore = myReview.map(TripRecordReview::getRatingScore).orElse(0f);

boolean isReviewable = canWriteReview(loginMember, tripRecordId, content, myRatingScore);

if (latestReview.isEmpty()) {
return EmptyTripRecordReviewResponseDto.fromData(totalCount, myScore);
return EmptyTripRecordReviewResponseDto.fromData(totalCount, myReviewId, myRatingScore, isReviewable);
}
return LatestTripRecordReviewResponseDto.fromEntity(totalCount, latestReview.get(), myScore);
return LatestTripRecordReviewResponseDto.fromEntity(totalCount, latestReview.get(), myReviewId, myRatingScore, isReviewable);
}

private boolean canWriteReview(Member loginMember, Long tripRecordId, String content, float score) {

if (content != null || score == 0f) {
return false;
}

Optional<TripPlan> latestTripPlan = tripPlanRepository.findByMemberIdAndTripRecordId(loginMember, tripRecordId);
return latestTripPlan.map(tripPlan ->
tripPlan.getTripEndDay().isBefore(LocalDate.now())
)
.orElse(false);
}

public SimpleTripRecordResponseDto getTripRecordReview(PrincipalDetails principalDetails, Long tripRecordReviewId) {
Expand Down Expand Up @@ -226,7 +249,6 @@ public TripRecordReviewListResponseDto getTripRecordReviewList(
return TripRecordReviewResponseDto.fromEntity(
tripRecordReview,
hasLiked

);
}
).toList());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
package com.haejwo.tripcometrue.domain.tripplan.repository;

import com.haejwo.tripcometrue.domain.member.entity.Member;
import com.haejwo.tripcometrue.domain.tripplan.entity.TripPlan;
import java.util.List;
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.Optional;

public interface TripPlanRepository extends JpaRepository<TripPlan, Long> {

Page<TripPlan> findByMemberId(Long memberId, Pageable pageable);

@Query("select tp from TripPlan tp where tp.member = :member and tp.referencedBy = :tripRecordId order by tp.tripEndDay asc limit 1")
Optional<TripPlan> findByMemberIdAndTripRecordId(@Param("member") Member loginMember, @Param("tripRecordId") Long tripRecordId);
}
Loading