Skip to content

Commit

Permalink
Merge pull request #130 from DuruDuru-UMC-7th/feature/#122-find-trade…
Browse files Browse the repository at this point in the history
…-api

Feat: 내 근처 품앗이 목록 조회 API 구현
  • Loading branch information
jkjade authored Feb 4, 2025
2 parents 3ffee1a + 5f9959d commit b379f4c
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,18 @@
import com.backend.DuruDuru.global.domain.enums.Status;
import com.backend.DuruDuru.global.web.dto.Trade.TradeRequestDTO;
import com.backend.DuruDuru.global.web.dto.Trade.TradeResponseDTO;
import org.springframework.data.domain.Page;

import java.util.List;
import java.util.stream.Collectors;

public class TradeConverter {

public static TradeResponseDTO.TradeDetailResultDTO toTradeResultDTO(Trade trade) {
return TradeResponseDTO.TradeDetailResultDTO.builder()
.tradeId(trade.getTradeId())
.memberId(trade.getMember().getMemberId())
.nickName(trade.getMember().getNickName())
.ingredientId(trade.getIngredient().getIngredientId())
.ingredientCount(trade.getIngredientCount())
.expiryDate(trade.getIngredient().getExpiryDate())
Expand Down Expand Up @@ -51,4 +56,34 @@ public static Trade toCreateTrade(TradeRequestDTO.CreateTradeRequestDTO request,
//.tradeImgs(request.)
.build();
}

public static TradeResponseDTO.TradePreviewDTO tradePreviewDTO(Trade trade) {
return TradeResponseDTO.TradePreviewDTO.builder()
.tradeId(trade.getTradeId())
.memberId(trade.getMember().getMemberId())
.ingredientId(trade.getIngredient().getIngredientId())
.ingredientCount(trade.getIngredientCount())
.expiryDate(trade.getIngredient().getExpiryDate())
.title(trade.getTitle())
.eupmyeondong(trade.getEupmyeondong())
.status(trade.getStatus())
.tradeType(trade.getTradeType())
.createdAt(trade.getCreatedAt())
.updatedAt(trade.getUpdatedAt())
.build();
}

public static TradeResponseDTO.TradePreviewListDTO toTradePreviewListDTO(Page<Trade> tradeList) {
List<TradeResponseDTO.TradePreviewDTO> tradePreViewDTOList = tradeList.stream()
.map(TradeConverter::tradePreviewDTO).collect(Collectors.toList());

return TradeResponseDTO.TradePreviewListDTO.builder()
.isLast(tradeList.isLast())
.isFirst(tradeList.isFirst())
.totalPage(tradeList.getTotalPages())
.totalElements(tradeList.getTotalElements())
.listSize(tradePreViewDTOList.size())
.tradeList(tradePreViewDTOList)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,28 @@
package com.backend.DuruDuru.global.repository;

import com.backend.DuruDuru.global.domain.entity.Trade;
import com.backend.DuruDuru.global.domain.enums.TradeType;
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 TradeRepository extends JpaRepository<Trade, Long> {
// 사용자와의 거리가 1km 이내인 게시글 리스트 반환
@Query(value = """
SELECT * FROM trade
WHERE (6371 * acos(cos(radians(:memberLat)) * cos(radians(latitude)) * cos(radians(longitude) - radians(:memberLon)) + sin(radians(:memberLat)) * sin(radians(latitude)))) <= 1
AND trade_type = :tradeType
ORDER BY updated_at DESC
LIMIT :size OFFSET :offset
""", nativeQuery = true)
List<Trade> findNearbyTrades(
@Param("memberLat") double memberLat,
@Param("memberLon") double memberLon,
@Param("tradeType") String tradeType,
@Param("size") int size,
@Param("offset") int offset
);
}

Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

import com.backend.DuruDuru.global.domain.entity.Trade;
import com.backend.DuruDuru.global.domain.enums.TradeType;
import org.springframework.data.domain.Page;

import java.util.List;

public interface TradeQueryService {
// 품앗이 게시글 상세 조회
Trade getTrade(Long tradeId);
// 나눔, 조회별 게시글 조회
Trade[] getTradesByType(Long memberId, TradeType tradeType);
Page<Trade> getNearTradesByType(Long memberId, TradeType tradeType, Integer page, Integer size);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,15 @@
import com.backend.DuruDuru.global.repository.MemberRepository;
import com.backend.DuruDuru.global.repository.TradeRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
public class TradeQueryServiceImpl implements TradeQueryService {
Expand All @@ -33,32 +39,16 @@ public Trade getTrade(Long tradeId) {
return findTradeById(tradeId);
}

// 가까운 거리의 게시글 중에서 TradeType별로 분류된 게시글 리스트 반환
@Override
@Transactional
public Trade[] getTradesByType(Long memberId, TradeType tradeType) {
public Page<Trade> getNearTradesByType(Long memberId, TradeType tradeType, Integer page, Integer size) {
Member member = findMemberById(memberId);
return new Trade[0];
}
double memberLat = member.getTown().getLatitude();
double memberLon = member.getTown().getLongitude();

// 두 좌표 사이의 거리를 구하는 함수
// dsitance(첫번쨰 좌표의 위도, 첫번째 좌표의 경도, 두번째 좌표의 위도, 두번째 좌표의 경도)
private static double distance(double lat1, double lon1, double lat2, double lon2){
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1))* Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1))*Math.cos(deg2rad(lat2))*Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60*1.1515*1609.344;

return dist; //단위 meter
Pageable pageable = PageRequest.of(page, size);
List<Trade> results = tradeRepository.findNearbyTrades(memberLat, memberLon, tradeType.name(), pageable.getPageSize(), (int) pageable.getOffset());
return new PageImpl<>(results, pageable, results.size());
}

//10진수를 radian(라디안)으로 변환
private static double deg2rad(double deg){
return (deg * Math.PI/180.0);
}
//radian(라디안)을 10진수로 변환
private static double rad2deg(double rad){
return (rad * 180 / Math.PI);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,17 @@
import com.backend.DuruDuru.global.web.dto.Trade.TradeRequestDTO;
import com.backend.DuruDuru.global.web.dto.Trade.TradeResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@Validated
Expand Down Expand Up @@ -80,12 +85,15 @@ public ApiResponse<?> findAvailableIngredients(){

// 내 근처 품앗이 나눔/교환별 조회
@GetMapping("/near")
@Operation(summary = "내 근처 품앗이 나눔/교환별 조회 API", description = "내 근처 품앗이 목록을 나눔/교환별로 조회하는 API 입니다.")
public ApiResponse<?> findNearTradeByType(
@RequestParam Long memberId, TradeType tradeType
@Operation(summary = "내 근처 품앗이 나눔/교환별 조회 API", description = "내 근처 품앗이 목록을 나눔/교환별로 조회하는 API 입니다. 페이징을 포함하며 query String 으로 page 번호를 주세요")
public ApiResponse<TradeResponseDTO.TradePreviewListDTO> findNearTradeByType(
@RequestParam Long memberId,
@RequestParam TradeType tradeType,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "1") int size
){
Trade[] trades = tradeQueryService.getTradesByType(memberId, tradeType);
return ApiResponse.onSuccess(SuccessStatus.TRADE_OK, null);
Page<Trade> tradeList = tradeQueryService.getNearTradesByType(memberId, tradeType, page, size);
return ApiResponse.onSuccess(SuccessStatus.TRADE_OK, TradeConverter.toTradePreviewListDTO(tradeList));
}

// 나의 품앗이 목록 조회 API
Expand Down Expand Up @@ -123,6 +131,4 @@ public ApiResponse<?> RecommendTodayTrade(){
public ApiResponse<?> tradeAlarm(){
return ApiResponse.onSuccess(SuccessStatus.TRADE_OK, null);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

public class TradeResponseDTO {

Expand All @@ -19,6 +20,7 @@ public class TradeResponseDTO {
public static class TradeDetailResultDTO {
Long tradeId;
Long memberId;
String nickName;
Long ingredientId;
Long ingredientCount;
LocalDate expiryDate;
Expand All @@ -39,6 +41,7 @@ public static class TradeDetailResultDTO {
public static class UpdateTradeResultDTO {
Long tradeId;
Long memberId;
String nickName;
Long ingredientId;
Long ingredientCount;
LocalDate expiryDate;
Expand All @@ -51,4 +54,36 @@ public static class UpdateTradeResultDTO {
LocalDateTime updatedAt;
// String[] tradeImgUrls;
}

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class TradePreviewDTO {
Long tradeId;
Long memberId;
Long ingredientId;
Long ingredientCount;
LocalDate expiryDate;
String title;
String eupmyeondong;
Status status;
TradeType tradeType;
LocalDateTime createdAt;
LocalDateTime updatedAt;
// String thumbnailImgUrl;
}

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class TradePreviewListDTO {
Integer listSize;
Integer totalPage;
Long totalElements;
Boolean isFirst;
Boolean isLast;
List<TradePreviewDTO> tradeList;
}
}

0 comments on commit b379f4c

Please sign in to comment.