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 @@ -25,7 +25,9 @@ public class BusRestController {
private final BusOcrMatchingService busOcrMatchingService;

@Operation(summary = "곧 도착 버스 목록 조회", description = "사용자의 위치 기준으로 도착 예정인 버스 목록을 조회합니다. "
+ "사용자가 등록한 버스가 포함된 경우 code: 20002로 응답합니다.")
+ "사용자가 등록한 버스가 포함된 경우, 다음과 같이 응답합니다: "
+ "1. 사용자가 등록한 버스 1대만 도착하는 경우: code: 20002 "
+ "2. 사용자가 등록한 버스가 여러 대의 버스와 함께 도착하는 경우: code: 20003")
@Parameters({ @Parameter(name = "userId", description = "사용자 ID", required = true) })
@GetMapping("/arrivals")
public BaseResponse<List<BusArrivalResponse>> getBusArrivals(@RequestParam Long userId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,11 @@ public BaseResponse<OcrProcessResponse> processOcrResult(OcrProcessRequest reque
return BaseResponse.success(similarMatchResponse.get());
}

/**
* 일치하는 버스가 없는 경우 (정확히 일치하지도 않고, 유사하지도 않은 경우)
* 다음 경우가 포함됨
* 1. 버스 목록이 비어있는 경우
* 2. 유사도가 임계값보다 낮은 경우
/*
일치하는 버스가 없는 경우 (정확히 일치하지도 않고, 유사하지도 않은 경우)
다음 경우가 포함됨
1. 버스 목록이 비어있는 경우
2. 유사도가 임계값보다 낮은 경우
*/
OcrProcessResponse response = BusConverter.toOCRProcessResponse(request.getOcrText(), request.getOcrText(),
MatchType.NONE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,35 +13,72 @@
import server.gooroomi.global.handler.response.BaseResponseStatus;

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

@Service
@RequiredArgsConstructor
public class BusService {

private final UserRepository userRepository;

/**
* 사용자 ID를 기반으로 버스 도착 정보 조회
*/
public BaseResponse<List<BusArrivalResponse>> getBusArrivals(Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new BaseException(BaseResponseStatus.NOT_FOUND_USER));

BusStation busStation = getBusStationFromUser(user);
String userBusNumber = user.getBusNumber();
BusStation nearestBusStation = user.getBusStation();

if (nearestBusStation == null) {
// 버스 도착 정보 조회 및 변환
List<BusArrival> busArrivals = busStation.getBusArrivals();
List<BusArrivalResponse> responseList = busArrivals.stream().map(BusConverter::toBusArrivalResponse)
.collect(Collectors.toList());

// 사용자 버스 도착 여부에 따른 응답
return getBusArrivalResponse(userBusNumber, busArrivals, responseList);
}

/**
* 사용자 버스 정류소 정보 조회
*/
private BusStation getBusStationFromUser(User user) {
BusStation busStation = user.getBusStation();
if (busStation == null) {
throw new BaseException(BaseResponseStatus.LOCATION_NOT_UPDATED);
}
return busStation;
}

List<BusArrival> busArrivals = nearestBusStation.getBusArrivals();

List<BusArrivalResponse> responseList = busArrivals.stream().map(BusConverter::toBusArrivalResponse).toList();
/**
* 사용자가 등록한 버스의 도착 여부에 따라 다른 응답
*/
private BaseResponse<List<BusArrivalResponse>> getBusArrivalResponse(String userBusNumber,
List<BusArrival> busArrivals, List<BusArrivalResponse> responseList) {

// 사용자가 등록한 버스가 도착 예정 버스 목록에 있는지 확인
boolean isUserBusArriving = busArrivals.stream()
.anyMatch(busArrival -> busArrival.getBusNumber().equals(userBusNumber));

if (isUserBusArriving) {
// 사용자의 버스가 도착 예정이 아닌 경우
if (!isUserBusArriving) {
return BaseResponse.success(responseList);
}

// 도착 예정인 버스가 사용자의 버스 1대만 있는 경우 (code: 20002)
if (isSingleUserBusArriving(busArrivals, userBusNumber)) {
return BaseResponse.success(BaseResponseStatus.USER_BUS_ARRIVING, responseList);
}

return BaseResponse.success(responseList);
// 도착 예정인 버스가 여러 대이고, 그 중에 사용자의 버스가 포함된 경우 (code: 20003)
return BaseResponse.success(BaseResponseStatus.MULTIPLE_BUSES_ARRIVING, responseList);
}

/**
* 도착 예정인 버스가 사용자의 버스 1대만 있는지 확인
*/
private boolean isSingleUserBusArriving(List<BusArrival> busArrivals, String userBusNumber) {
return busArrivals.size() == 1 && busArrivals.get(0).getBusNumber().equals(userBusNumber);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public enum BaseResponseStatus {
*/
STATION_NOT_FOUND(true, 20001, HttpStatus.OK, "주변에 버스 정류소가 존재하지 않습니다."),
USER_BUS_ARRIVING(true, 20002, HttpStatus.OK, "등록된 버스가 곧 도착합니다."),
MULTIPLE_BUSES_ARRIVING(true, 20003, HttpStatus.OK, "등록된 버스가 곧 도착합니다."),

/**
* 400 BAD_REQUEST 잘못된 요청
Expand Down
Loading