diff --git a/src/main/java/side/onetime/exception/status/FixedErrorStatus.java b/src/main/java/side/onetime/exception/status/FixedErrorStatus.java index ad06d0e..564b5f5 100644 --- a/src/main/java/side/onetime/exception/status/FixedErrorStatus.java +++ b/src/main/java/side/onetime/exception/status/FixedErrorStatus.java @@ -1,8 +1,9 @@ package side.onetime.exception.status; +import org.springframework.http.HttpStatus; + import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import side.onetime.global.common.code.BaseErrorCode; import side.onetime.global.common.dto.ErrorReasonDto; @@ -10,9 +11,10 @@ @RequiredArgsConstructor public enum FixedErrorStatus implements BaseErrorCode { _NOT_FOUND_FIXED_SCHEDULES(HttpStatus.NOT_FOUND, "FIXED-001", "고정 스케줄 목록을 가져오는 데 실패했습니다."), - _NOT_FOUND_EVERYTIME_TIMETABLE(HttpStatus.NOT_FOUND, "FIXED-002", "에브리타임 시간표를 가져오는 데 실패했습니다. 공개 범위를 확인해주세요."), + _EVERYTIME_TIMETABLE_NOT_PUBLIC(HttpStatus.NOT_FOUND, "FIXED-002", "에브리타임 시간표를 가져오는 데 실패했습니다. 공개 범위를 확인해주세요."), _EVERYTIME_TIMETABLE_PARSE_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "FIXED-003", "에브리타임 시간표 파싱 중 문제가 발생했습니다."), _EVERYTIME_API_FAILED(HttpStatus.SERVICE_UNAVAILABLE, "FIXED-004", "에브리타임 API 연동 중 서버 오류가 발생했습니다."), + _NOT_FOUND_EVERYTIME_TIMETABLE(HttpStatus.NOT_FOUND, "FIXED-005", "에브리타임 시간표에 등록된 수업이 없습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/side/onetime/service/FixedScheduleService.java b/src/main/java/side/onetime/service/FixedScheduleService.java index 0e0a1f2..7661178 100644 --- a/src/main/java/side/onetime/service/FixedScheduleService.java +++ b/src/main/java/side/onetime/service/FixedScheduleService.java @@ -6,6 +6,8 @@ import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import org.jsoup.Jsoup; @@ -35,6 +37,11 @@ @Service @RequiredArgsConstructor public class FixedScheduleService { + + private static final int EVERYTIME_PRIVATE_STATUS = -2; + private static final int EVERYTIME_PUBLIC_STATUS = 1; + private static final Pattern STATUS_PATTERN = Pattern.compile("status=\"(-?\\d+)\""); + private final UserRepository userRepository; private final FixedScheduleRepository fixedScheduleRepository; private final FixedSelectionRepository fixedSelectionRepository; @@ -132,13 +139,44 @@ private String fetchTimetableXml(String identifier) { } if (!xmlResponse.contains("subject")) { - // 200 OK 응답이 왔지만, 테이블이 비어있는 경우 (공개 범위 설정 오류 등) - throw new CustomException(FixedErrorStatus._NOT_FOUND_EVERYTIME_TIMETABLE); + // 200 OK 응답이 왔지만, 테이블이 비어있는 경우 + int status = extractStatusFromXml(xmlResponse); + if (EVERYTIME_PRIVATE_STATUS == status) { + // 1. 공개 범위가 '전체 공개'가 아닌 경우 + throw new CustomException(FixedErrorStatus._EVERYTIME_TIMETABLE_NOT_PUBLIC); + } else if (EVERYTIME_PUBLIC_STATUS == status) { + // 2. '전체 공개'이지만, 등록된 수업이 없는 경우 + throw new CustomException(FixedErrorStatus._NOT_FOUND_EVERYTIME_TIMETABLE); + } else { + // 3. 예상치 못한 status 값 + throw new CustomException(FixedErrorStatus._EVERYTIME_TIMETABLE_PARSE_ERROR); + } } return xmlResponse; } + /** + * XML 문자열에서 status 속성값을 추출합니다. + * 예: