diff --git a/src/main/java/com/umc/hackaton/snapspot/spot/controller/SpotController.java b/src/main/java/com/umc/hackaton/snapspot/spot/controller/SpotController.java index 080568c..ef88f25 100644 --- a/src/main/java/com/umc/hackaton/snapspot/spot/controller/SpotController.java +++ b/src/main/java/com/umc/hackaton/snapspot/spot/controller/SpotController.java @@ -1,6 +1,7 @@ package com.umc.hackaton.snapspot.spot.controller; import com.umc.hackaton.snapspot.spot.dto.SpotRequestDto; +import com.umc.hackaton.snapspot.spot.dto.SpotResponseDto; import com.umc.hackaton.snapspot.spot.entity.Spot; import com.umc.hackaton.snapspot.spot.service.SpotService; import lombok.RequiredArgsConstructor; @@ -74,5 +75,14 @@ public ResponseEntity patchSpot( return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("스팟 수정에 실패하였습니다."); } } - + @GetMapping("list") + public ResponseEntity> readNearSpotList(@RequestParam("latitude") double latitude, @RequestParam("longitude") double longitude){ + return ResponseEntity.ok(spotService.readNearSpotList(latitude, longitude)); + } + + @GetMapping("list/category") + public ResponseEntity> readCategoryNearSpotList(@RequestParam("latitude") double latitude, @RequestParam("longitude") double longitude, @RequestParam("categoryId") Long categoryId){ + List list = spotService.readNearSpotList(latitude, longitude); + return ResponseEntity.ok(spotService.readCategoryNearSpotList(list, categoryId)); + } } diff --git a/src/main/java/com/umc/hackaton/snapspot/spot/converter/SpotConverter.java b/src/main/java/com/umc/hackaton/snapspot/spot/converter/SpotConverter.java new file mode 100644 index 0000000..9f4f309 --- /dev/null +++ b/src/main/java/com/umc/hackaton/snapspot/spot/converter/SpotConverter.java @@ -0,0 +1,23 @@ +package com.umc.hackaton.snapspot.spot.converter; + +import com.umc.hackaton.snapspot.spot.dto.SpotResponseDto; +import com.umc.hackaton.snapspot.spot.entity.Spot; + +import java.util.List; +import java.util.stream.Collectors; + +public class SpotConverter { + public static ListtoDtoList(List spotList){ + return spotList.stream() + .map(SpotConverter::toDto) + .collect(Collectors.toList()); + } + + public static SpotResponseDto toDto(Spot spot){ + return SpotResponseDto.builder() + .spotId(spot.getId()) + .imgUrl(spot.getImgUrl()) + .likeNum(spot.getLikeNum()) + .build(); + } +} diff --git a/src/main/java/com/umc/hackaton/snapspot/spot/dto/SpotResponseDto.java b/src/main/java/com/umc/hackaton/snapspot/spot/dto/SpotResponseDto.java index 61f1665..3480c43 100644 --- a/src/main/java/com/umc/hackaton/snapspot/spot/dto/SpotResponseDto.java +++ b/src/main/java/com/umc/hackaton/snapspot/spot/dto/SpotResponseDto.java @@ -1,4 +1,11 @@ package com.umc.hackaton.snapspot.spot.dto; +import lombok.Builder; + +@Builder public class SpotResponseDto { + Long spotId; + String imgUrl; + + Long likeNum; } diff --git a/src/main/java/com/umc/hackaton/snapspot/spot/repository/SpotRepository.java b/src/main/java/com/umc/hackaton/snapspot/spot/repository/SpotRepository.java index 19331fb..a033ccc 100644 --- a/src/main/java/com/umc/hackaton/snapspot/spot/repository/SpotRepository.java +++ b/src/main/java/com/umc/hackaton/snapspot/spot/repository/SpotRepository.java @@ -3,9 +3,18 @@ import com.umc.hackaton.snapspot.spot.entity.Spot; import com.umc.hackaton.snapspot.user.entity.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; public interface SpotRepository extends JpaRepository { List findAllByUser(User user); + + @Query(value = "SELECT * FROM Spot s " + + "WHERE (6371 * 2 * ASIN(SQRT(POWER(SIN((RADIANS(:latitude) - RADIANS(s.latitude)) / 2), 2) + " + + "COS(RADIANS(:latitude)) * COS(RADIANS(s.latitude)) * POWER(SIN((RADIANS(:longitude) - RADIANS(s.longitude)) / 2), 2)))) < :distance", nativeQuery = true) + List findSpotsWithinDistance(@Param("latitude") double latitude, + @Param("longitude") double longitude, + @Param("distance") double distance); } diff --git a/src/main/java/com/umc/hackaton/snapspot/spot/service/SpotService.java b/src/main/java/com/umc/hackaton/snapspot/spot/service/SpotService.java index a27e928..dcd003f 100644 --- a/src/main/java/com/umc/hackaton/snapspot/spot/service/SpotService.java +++ b/src/main/java/com/umc/hackaton/snapspot/spot/service/SpotService.java @@ -4,8 +4,10 @@ import com.umc.hackaton.snapspot.category.entity.CategorySpot; import com.umc.hackaton.snapspot.category.repository.CategoryRepository; import com.umc.hackaton.snapspot.category.repository.CategorySpotRepository; +import com.umc.hackaton.snapspot.spot.converter.SpotConverter; import com.umc.hackaton.snapspot.spot.dto.SpotDto; import com.umc.hackaton.snapspot.spot.dto.SpotRequestDto; +import com.umc.hackaton.snapspot.spot.dto.SpotResponseDto; import com.umc.hackaton.snapspot.spot.entity.Spot; import com.umc.hackaton.snapspot.spot.repository.SpotRepository; import com.umc.hackaton.snapspot.user.entity.User; @@ -77,4 +79,9 @@ public Spot updateSpot(Long spotId, SpotRequestDto dto) { Spot spot = spotRepository.findById(spotId).orElse(null); return spot.update(dto); } + + public List readNearSpotList(double latitude, double longitude) { + List spotList = spotRepository.findSpotsWithinDistance(latitude, longitude, 0.5); + return SpotConverter.toDtoList(spotList); + } }