Skip to content
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 @@ -4,6 +4,7 @@
import lombok.RequiredArgsConstructor;
import org.sopt.solply_server.domain.review.dto.request.CreatePlaceReviewRequest;
import org.sopt.solply_server.domain.review.dto.response.CreatePlaceReviewResponse;
import org.sopt.solply_server.domain.review.dto.response.GetPlaceReviewListResponse;
import org.sopt.solply_server.domain.review.service.PlaceReviewService;
import org.sopt.solply_server.global.annotation.CurrentUserId;
import org.sopt.solply_server.global.dto.CustomApiResponse;
Expand All @@ -25,4 +26,13 @@ public ResponseEntity<CustomApiResponse<CreatePlaceReviewResponse>> createRecord
CreatePlaceReviewResponse response = placeReviewService.createReview(userId, request);
return CustomApiResponse.success("혼놀 기록 작성이 완료되었습니다.", response);
}

@GetMapping("/{placeId}/reviews")
public ResponseEntity<CustomApiResponse<GetPlaceReviewListResponse>> getPlaceReviews(
@CurrentUserId Long userId,
@PathVariable Long placeId
) {
Comment thread
coderabbitai[bot] marked this conversation as resolved.
GetPlaceReviewListResponse response = placeReviewService.getPlaceReviews(placeId);
return CustomApiResponse.success("장소 리뷰 리스트 조회에 성공했습니다.", response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.sopt.solply_server.domain.review.dto.response;

import java.util.List;

public record GetPlaceReviewListResponse(
int reviewCount,
List<PlaceReviewListItem> reviews
) {
public static GetPlaceReviewListResponse of(List<PlaceReviewListItem> reviews) {
return new GetPlaceReviewListResponse(reviews.size(), reviews);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.sopt.solply_server.domain.review.dto.response;

import java.time.LocalDate;
import java.util.List;
import org.sopt.solply_server.domain.review.entity.PlaceReview;
import org.sopt.solply_server.domain.review.entity.VisitTime;
import org.sopt.solply_server.global.util.s3.ImageUrlProvider;

public record PlaceReviewListItem(
Long reviewId,
Long userId,
String nickname,
String profileImageUrl,
String content,
LocalDate visitedAt,
VisitTime visitTimeSlot,
List<String> imageUrls
) {
public static PlaceReviewListItem from(PlaceReview placeReview, ImageUrlProvider imageUrlProvider) {
return new PlaceReviewListItem(
placeReview.getId(),
placeReview.getUser().getId(),
placeReview.getUser().getNickname(),
imageUrlProvider.getImageUrl(placeReview.getUser().getProfileImageFileKey()),
placeReview.getContent(),
placeReview.getVisitedAt(),
placeReview.getVisitTimeSlot(),
placeReview.getPlaceReviewImages().stream()
.map(image -> imageUrlProvider.getImageUrl(image.getImageUrl()))
.toList()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,20 @@
package org.sopt.solply_server.domain.review.repository;

import java.util.List;
import org.sopt.solply_server.domain.review.entity.PlaceReview;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface PlaceReviewRepository extends JpaRepository<PlaceReview, Long> {

@Query("""
select distinct pr
from PlaceReview pr
join fetch pr.user u
left join fetch pr.placeReviewImages pri
where pr.place.id = :placeId
order by pr.createdAt desc
""")
List<PlaceReview> findAllByPlaceIdOrderByCreatedAtDesc(@Param("placeId") Long placeId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import org.sopt.solply_server.domain.review.dto.request.CreatePlaceReviewRequest;
import org.sopt.solply_server.domain.review.dto.response.CreatePlaceReviewResponse;
import org.sopt.solply_server.domain.review.dto.response.GetPlaceReviewListResponse;

public interface PlaceReviewService {
CreatePlaceReviewResponse createReview(Long userId, CreatePlaceReviewRequest request);
GetPlaceReviewListResponse getPlaceReviews(Long placeId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import org.sopt.solply_server.domain.place.repository.PlaceRepository;
import org.sopt.solply_server.domain.review.dto.request.CreatePlaceReviewRequest;
import org.sopt.solply_server.domain.review.dto.response.CreatePlaceReviewResponse;
import org.sopt.solply_server.domain.review.dto.response.GetPlaceReviewListResponse;
import org.sopt.solply_server.domain.review.dto.response.PlaceReviewListItem;
import org.sopt.solply_server.domain.review.entity.PlaceReview;
import org.sopt.solply_server.domain.review.repository.PlaceReviewRepository;
import org.sopt.solply_server.domain.user.entity.User;
Expand All @@ -17,6 +19,7 @@
import org.sopt.solply_server.global.exception.ErrorCode;
import org.sopt.solply_server.global.util.s3.FileTransferMode;
import org.sopt.solply_server.global.util.s3.ImageFileKeyUpdateEvent;
import org.sopt.solply_server.global.util.s3.ImageUrlProvider;
import org.sopt.solply_server.global.util.s3.TargetDir;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
Expand All @@ -34,6 +37,7 @@ public class PlaceReviewServiceImpl implements PlaceReviewService {
private final UserRepository userRepository;
private final PlaceRepository placeRepository;
private final ApplicationEventPublisher eventPublisher;
private final ImageUrlProvider imageUrlProvider;

@Override
@Transactional
Expand Down Expand Up @@ -75,6 +79,20 @@ public CreatePlaceReviewResponse createReview(Long userId, CreatePlaceReviewRequ
return CreatePlaceReviewResponse.from(savedPlaceReview);
}

@Override
public GetPlaceReviewListResponse getPlaceReviews(Long placeId) {
placeRepository.findActiveById(placeId)
.orElseThrow(() -> new EntityNotFoundException(ErrorCode.NOT_FOUND_PLACE));

List<PlaceReviewListItem> reviews = placeReviewRepository
.findAllByPlaceIdOrderByCreatedAtDesc(placeId)
.stream()
.map(placeReview -> PlaceReviewListItem.from(placeReview, imageUrlProvider))
.toList();

return GetPlaceReviewListResponse.of(reviews);
}

private void validateRequest(CreatePlaceReviewRequest request) {
validateVisitedAt(request.visitedAt());
validateContent(request.content());
Expand Down
Loading