Skip to content

Commit

Permalink
#23 [Add] 최근 리뷰 업장 등록 - 테스트 필요
Browse files Browse the repository at this point in the history
최근 리뷰가 달린 업장을 리뷰합니다
  • Loading branch information
JSoi committed Jul 12, 2022
1 parent 47e8ef1 commit 14ac83f
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 45 deletions.
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ dependencies {
compileOnly 'org.projectreactor:reactor-spring:1.0.1.RELEASE'
compileOnly 'org.apache.httpcomponents:httpclient:4.5.13'
implementation 'org.springframework.boot:spring-boot-starter-reactor-netty:2.7.1'

//tomcat
implementation 'org.springframework.boot:spring-boot-starter-tomcat'
// OAuth2
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client:2.7.0'
// jwt
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/mpnp/baechelin/config/QuerydslConfiguration.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package com.mpnp.baechelin.config;

import com.querydsl.core.BooleanBuilder;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.math.BigDecimal;

import static com.mpnp.baechelin.store.domain.QStore.store;

@Configuration
public class QuerydslConfiguration {
Expand All @@ -17,4 +21,11 @@ public class QuerydslConfiguration {
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}

public static void locationBuilder(BigDecimal latStart, BigDecimal latEnd, BigDecimal lngStart, BigDecimal lngEnd, BooleanBuilder builder) {
builder.and(latStart == null ? null : store.latitude.goe(latStart));
builder.and(latEnd == null ? null : store.latitude.loe(latEnd));
builder.and(lngStart == null ? null : store.longitude.goe(lngStart));
builder.and(lngEnd == null ? null : store.longitude.loe(lngEnd));
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.mpnp.baechelin.review.controller;

import com.mpnp.baechelin.review.dto.ReviewMainResDto;
import com.mpnp.baechelin.review.dto.ReviewReqDTO;
import com.mpnp.baechelin.review.dto.ReviewResDTO;
import com.mpnp.baechelin.review.repository.ReviewQueryRepository;
import com.mpnp.baechelin.review.service.ReviewService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -11,22 +13,28 @@
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequiredArgsConstructor
public class ReviewController {

private final ReviewService reviewService;
private final ReviewQueryRepository reviewQueryRepository;

/**리뷰 작성*/
/**
* 리뷰 작성
*/
@PostMapping("/review")
public ReviewResDTO review(@RequestParam double point,
@RequestParam String comment,
@RequestParam int storeId,
@RequestParam int userId,
@RequestParam(required = false) MultipartFile imageFile) throws IOException {

ReviewReqDTO reviewReqDTO =new ReviewReqDTO();
ReviewReqDTO reviewReqDTO = new ReviewReqDTO();
ReviewReqDTO
.builder()
.point(point)
Expand All @@ -39,9 +47,32 @@ public ReviewResDTO review(@RequestParam double point,
reviewService.review(reviewReqDTO);
return null;
}

// TODO - 최근 등록한 리뷰 보여주기
// 반경 넓히기
@GetMapping("/recent-review")
public ReviewResDTO recentReview(){
return null;
public List<ReviewMainResDto> recentReview(@RequestParam(required = false) BigDecimal lat,
@RequestParam(required = false) BigDecimal lng,
@RequestParam int limit) {

BigDecimal[] locationRange = getRange(lat, lng, 20);


List<ReviewMainResDto> result = reviewQueryRepository
.findRecentReviews(locationRange[0], locationRange[1], locationRange[2], locationRange[3], limit)
.stream().map(ReviewMainResDto::new).collect(Collectors.toList());
return result;
}

// km : 반경
private BigDecimal[] getRange(BigDecimal lat, BigDecimal lng, int km) {
// km->lat,lng로 변환하기
final BigDecimal latitude = BigDecimal.valueOf(km / 110.569); // 반경
final BigDecimal longitutde = BigDecimal.valueOf(km / 111.322);
// 남서, 북동으로 받아오기
// start lat-lng, end lat-lng으로 Array 받아오기
return new BigDecimal[]{lat.subtract(latitude), lat.add(latitude),
lng.subtract(longitutde), lng.add(longitutde)};
}

}
24 changes: 24 additions & 0 deletions src/main/java/com/mpnp/baechelin/review/dto/ReviewMainResDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.mpnp.baechelin.review.dto;

import com.mpnp.baechelin.review.domain.Review;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ReviewMainResDto {
// review 테이블 컬럼
private String comment; //리뷰 코멘트
private double point; //별점
private String imageFileUrl; //리뷰 이미지 사진

public ReviewMainResDto(Review review) {
this.comment = review.getReview();
this.point = review.getPoint();
this.imageFileUrl = review.getReviewImageUrl();
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.mpnp.baechelin.review.repository;

import com.mpnp.baechelin.review.domain.QReview;
import com.mpnp.baechelin.review.domain.Review;
import com.mpnp.baechelin.store.domain.Store;
import com.mpnp.baechelin.store.domain.QStore;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
Expand All @@ -12,8 +11,10 @@
import java.math.BigDecimal;
import java.util.List;

import static com.mpnp.baechelin.config.QuerydslConfiguration.locationBuilder;
import static com.mpnp.baechelin.review.domain.QReview.review1;
import static com.mpnp.baechelin.store.domain.QStore.store;
import static com.querydsl.jpa.JPAExpressions.select;

@Repository
@Transactional
Expand All @@ -31,17 +32,16 @@ public List<Review> findRecentReviews(BigDecimal latStart,
BigDecimal lngStart,
BigDecimal lngEnd,
int limit) {
builder.and(store.latitude.goe(latStart));
builder.and(store.latitude.loe(latEnd));
builder.and(store.longitude.goe(lngStart));
builder.and(store.longitude.loe(lngEnd));
locationBuilder(latStart, latEnd, lngStart, lngEnd, builder);
// 위도 경도에 해당하는 가게를 찾음 -> 해당 댓글을 다 가져옴 -> 내림차순 정렬 -> limit
return queryFactory.selectFrom(review1)
.innerJoin(review1.storeId, store)
.where(review1.storeId
.in(queryFactory.select(store).from(store).where(builder)))
.on(review1.storeId.id.eq(store.id))
.where(builder)
.limit(limit)
.fetch();
}



}
Original file line number Diff line number Diff line change
Expand Up @@ -24,42 +24,37 @@ public class StoreController {
private final StoreService storeService;
private final StoreQueryRepository storeQueryRepository;

@GetMapping
public List<StoreResponseDto> getStoreList() {
return storeService.getStoreList();
}

@GetMapping("/near")
public List<StoreResponseDto> giveStoreInRange(@RequestParam BigDecimal latStart,
@RequestParam BigDecimal latEnd,
@RequestParam BigDecimal lngStart,
@RequestParam BigDecimal lngEnd,
@RequestParam(required = false) String category,
@RequestParam(required = false) List<String> facility,
@PageableDefault Pageable pageable) {
public List<StoreResponseDto> getStoreInRange(@RequestParam(required = false) BigDecimal latStart,
@RequestParam(required = false) BigDecimal latEnd,
@RequestParam(required = false) BigDecimal lngStart,
@RequestParam(required = false) BigDecimal lngEnd,
@RequestParam(required = false) String category,
@RequestParam(required = false) List<String> facility,
@PageableDefault Pageable pageable) {
List<Store> betweenLngLat = storeQueryRepository.findBetweenLngLat(latStart, latEnd, lngStart, lngEnd, category, facility, pageable);
return betweenLngLat.parallelStream().map(storeService::storeToResDto).collect(Collectors.toList());// 순서보장
}
@GetMapping("/near/high-point")
public List<StoreResponseDto> giveStoreInRangeHighPoint(@RequestParam BigDecimal latStart,
@RequestParam BigDecimal latEnd,
@RequestParam BigDecimal lngStart,
@RequestParam BigDecimal lngEnd,
@RequestParam(required = false) String category,
@RequestParam(required = false) List<String> facility,
@PageableDefault Pageable pageable) {
@GetMapping("/point")
public List<StoreResponseDto> getStoreInRangeHighPoint(@RequestParam(required = false) BigDecimal latStart,
@RequestParam(required = false) BigDecimal latEnd,
@RequestParam(required = false) BigDecimal lngStart,
@RequestParam(required = false) BigDecimal lngEnd,
@RequestParam(required = false) String category,
@RequestParam(required = false) List<String> facility,
@PageableDefault Pageable pageable) {
List<Store> betweenLngLat = storeQueryRepository.findBetweenLngLat(latStart, latEnd, lngStart, lngEnd, category, facility, pageable);
return betweenLngLat.parallelStream().map(storeService::storeToResDto).collect(Collectors.toList());// 순서보장
}

@GetMapping("/near/high-bookmark")
public List<StoreResponseDto> giveStoreInRangeHighBookmark(@RequestParam BigDecimal latStart,
@RequestParam BigDecimal latEnd,
@RequestParam BigDecimal lngStart,
@RequestParam BigDecimal lngEnd,
@RequestParam(required = false) String category,
@RequestParam(required = false) List<String> facility,
@RequestParam int limit) {
@GetMapping("/bookmark")
public List<StoreResponseDto> getStoreInRangeHighBookmark(@RequestParam(required = false) BigDecimal latStart,
@RequestParam(required = false) BigDecimal latEnd,
@RequestParam(required = false) BigDecimal lngStart,
@RequestParam(required = false) BigDecimal lngEnd,
@RequestParam(required = false) String category,
@RequestParam(required = false) List<String> facility,
@RequestParam int limit) {
List<Store> betweenLngLat = storeQueryRepository.findStoreOrderByBookmark(latStart, latEnd, lngStart, lngEnd, category, facility, limit);
return betweenLngLat.parallelStream().map(storeService::storeToResDto).collect(Collectors.toList());// 순서보장
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.mpnp.baechelin.store.repository;

import com.mpnp.baechelin.config.QuerydslConfiguration;
import com.mpnp.baechelin.review.repository.ReviewQueryRepository;
import com.mpnp.baechelin.store.domain.QStore;
import com.mpnp.baechelin.store.domain.Store;
import com.mpnp.baechelin.tag.domain.QTag;
Expand Down Expand Up @@ -107,10 +109,7 @@ private StringPath givePath(String dbFacility) {
}

private void locAndConditions(BigDecimal latStart, BigDecimal latEnd, BigDecimal lngStart, BigDecimal lngEnd, String category, List<String> facility) {
builder.and(store.latitude.goe(latStart));
builder.and(store.latitude.loe(latEnd));
builder.and(store.longitude.goe(lngStart));
builder.and(store.longitude.loe(lngEnd));
QuerydslConfiguration.locationBuilder(latStart, latEnd, lngStart, lngEnd, builder);
builder.and(category == null ? null : store.category.eq(category));
if (facility != null && facility.size() > 0) {
for (String fac : facility) {
Expand Down

0 comments on commit 14ac83f

Please sign in to comment.