diff --git a/src/main/java/kr/allcll/backend/admin/seat/AdminSeatApi.java b/src/main/java/kr/allcll/backend/admin/seat/AdminSeatApi.java index 504d3182..6cb1dcf3 100644 --- a/src/main/java/kr/allcll/backend/admin/seat/AdminSeatApi.java +++ b/src/main/java/kr/allcll/backend/admin/seat/AdminSeatApi.java @@ -3,6 +3,7 @@ import jakarta.servlet.http.HttpServletRequest; import kr.allcll.backend.admin.AdminRequestValidator; import kr.allcll.backend.admin.seat.dto.SeatStatusResponse; +import kr.allcll.backend.admin.subject.TargetSubjectService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/java/kr/allcll/backend/admin/seat/AdminSeatService.java b/src/main/java/kr/allcll/backend/admin/seat/AdminSeatService.java index 91ef518b..074a7d7d 100644 --- a/src/main/java/kr/allcll/backend/admin/seat/AdminSeatService.java +++ b/src/main/java/kr/allcll/backend/admin/seat/AdminSeatService.java @@ -6,6 +6,7 @@ import java.util.concurrent.atomic.AtomicLong; import kr.allcll.backend.admin.seat.dto.ChangeSubjectsResponse; import kr.allcll.backend.admin.seat.dto.SeatStatusResponse; +import kr.allcll.backend.admin.subject.TargetSubjectStorage; import kr.allcll.crawler.client.SeatClient; import kr.allcll.crawler.client.model.SeatResponse; import kr.allcll.crawler.client.payload.SeatPayload; @@ -89,14 +90,48 @@ private void sendPinSubjectRequest(Credential credential) { if (crawlerSubject == null) { return; } - sendExternalRequestWithOutDetect(crawlerSubject, credential); + sendExternalRequest(crawlerSubject, credential); } private void sendGeneralSubjectRequest(Credential credential) { CrawlerSubject crawlerSubject = targetSubjectStorage.getNextGeneralTarget(); - sendExternalRequestWithOutDetect(crawlerSubject, credential); + sendExternalRequest(crawlerSubject, credential); } + private void sendExternalRequest(CrawlerSubject crawlerSubject, Credential credential) { + try { + log.info("[SeatService] [학교 서버] 요청 시도 과목: {}", crawlerSubject); + SeatPayload requestPayload = SeatPayload.from(crawlerSubject); + SeatResponse response = seatClient.execute(credential, requestPayload); + CrawlerSeat renewedCrawlerSeat = createSeat(response, crawlerSubject); + detectDifferenceAndSave(crawlerSubject, renewedCrawlerSeat); + } catch (CrawlerAllcllException e) { + log.error( + "[여석] 외부 API 호출에 실패했습니다. 과목: " + crawlerSubject.getCuriNo() + "-" + crawlerSubject.getClassName()); + } + } + + private void detectDifferenceAndSave(CrawlerSubject crawlerSubject, CrawlerSeat renewedCrawlerSeat) { + if (changeDetector.isRemainSeatChanged(crawlerSubject, renewedCrawlerSeat)) { + changeDetector.saveChangeToBuffer(crawlerSubject, renewedCrawlerSeat); + + synchronized (getSubjectLock(crawlerSubject.getId())) { + seatPersistenceService.saveSeat(renewedCrawlerSeat); + } + } + } + + private CrawlerSeat createSeat(SeatResponse response, CrawlerSubject crawlerSubject) { + return response.toSeat(crawlerSubject, LocalDate.now()); + } + + private Object getSubjectLock(Long subjectId) { + return ("LOCK_" + subjectId).intern(); + } + + /** + * deprecated : 변경감지로 정책 변경에 따라 해당 메서드를 사용하지 않습니다. + */ private void sendExternalRequestWithOutDetect(CrawlerSubject crawlerSubject, Credential credential) { try { log.info("[SeatService] [학교 서버] 요청 시도 과목: {}", crawlerSubject); @@ -127,32 +162,4 @@ private void sendExternalRequestWithOutDetect(CrawlerSubject crawlerSubject, Cre "[여석] 외부 API 호출에 실패했습니다. 과목: " + crawlerSubject.getCuriNo() + "-" + crawlerSubject.getClassName()); } } - - /** - * 변경감지로 정책 변경 시 해당 메서드로 변경 - */ - private void sendExternalRequest(CrawlerSubject crawlerSubject, Credential credential) { - log.info("[SeatService] [학교 서버] 요청 시도 과목: {}", crawlerSubject); - SeatPayload requestPayload = SeatPayload.from(crawlerSubject); - SeatResponse response = seatClient.execute(credential, requestPayload); - CrawlerSeat renewedCrawlerSeat = createSeat(response, crawlerSubject); - detectDifferenceAndSave(crawlerSubject, renewedCrawlerSeat); - } - - private void detectDifferenceAndSave(CrawlerSubject crawlerSubject, CrawlerSeat renewedCrawlerSeat) { - if (changeDetector.isRemainSeatChanged(crawlerSubject, renewedCrawlerSeat)) { - changeDetector.saveChangeToBuffer(crawlerSubject, renewedCrawlerSeat); - synchronized (getSubjectLock(crawlerSubject.getId())) { - seatPersistenceService.saveSeat(renewedCrawlerSeat); - } - } - } - - private CrawlerSeat createSeat(SeatResponse response, CrawlerSubject crawlerSubject) { - return response.toSeat(crawlerSubject, LocalDate.now()); - } - - private Object getSubjectLock(Long subjectId) { - return ("LOCK_" + subjectId).intern(); - } } diff --git a/src/main/java/kr/allcll/backend/admin/seat/AllSeatBuffer.java b/src/main/java/kr/allcll/backend/admin/seat/AllSeatBuffer.java index 6efc6a3d..35ba8c5b 100644 --- a/src/main/java/kr/allcll/backend/admin/seat/AllSeatBuffer.java +++ b/src/main/java/kr/allcll/backend/admin/seat/AllSeatBuffer.java @@ -8,6 +8,10 @@ import kr.allcll.crawler.common.properties.SjptProperties; import org.springframework.stereotype.Component; +/** + * deprecated : 변경감지로 정책 변경에 따라 해당 클래스를 사용하지 않습니다. + */ + @Component public class AllSeatBuffer { diff --git a/src/main/java/kr/allcll/backend/admin/seat/ChangeDetector.java b/src/main/java/kr/allcll/backend/admin/seat/ChangeDetector.java index 49c142ea..8cb3960b 100644 --- a/src/main/java/kr/allcll/backend/admin/seat/ChangeDetector.java +++ b/src/main/java/kr/allcll/backend/admin/seat/ChangeDetector.java @@ -1,5 +1,7 @@ package kr.allcll.backend.admin.seat; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import kr.allcll.backend.admin.seat.dto.ChangeSubjectsResponse; @@ -20,7 +22,9 @@ public class ChangeDetector { private final SjptProperties sjptProperties; public boolean isRemainSeatChanged(CrawlerSubject crawlerSubject, CrawlerSeat renewedCrawlerSeat) { - Optional previousSeat = crawlerSeatRepository.findByCrawlerSubject(crawlerSubject); + LocalDate today = LocalDate.now(); + + Optional previousSeat = crawlerSeatRepository.findByCrawlerSubjectAndCreatedDate(crawlerSubject, today); if (previousSeat.isEmpty()) { return true; } @@ -41,7 +45,7 @@ public void saveChangeToBuffer(CrawlerSubject crawlerSubject, CrawlerSeat renewe } else { changedSubjectBuffer.add( ChangeSubjectsResponse.of(crawlerSubject.getId(), ChangeStatus.UPDATE, SeatUtils.getRemainSeat( - renewedCrawlerSeat))); + renewedCrawlerSeat), LocalDateTime.now())); } } diff --git a/src/main/java/kr/allcll/backend/admin/seat/LiveBoards.java b/src/main/java/kr/allcll/backend/admin/seat/LiveBoards.java index 7dac1df6..9bdf884d 100644 --- a/src/main/java/kr/allcll/backend/admin/seat/LiveBoards.java +++ b/src/main/java/kr/allcll/backend/admin/seat/LiveBoards.java @@ -1,5 +1,6 @@ package kr.allcll.backend.admin.seat; +import java.time.LocalDateTime; import java.util.Collections; import java.util.List; import java.util.Map; @@ -27,7 +28,7 @@ public LiveBoards() { public List checkStatus(CrawlerSubject crawlerSubject, Integer remainSeat) { if (canOnlyIn(crawlerSubject, remainSeat)) { liveBoardSubjects.put(crawlerSubject, remainSeat); - return List.of(ChangeSubjectsResponse.of(crawlerSubject.getId(), ChangeStatus.IN, remainSeat)); + return List.of(ChangeSubjectsResponse.of(crawlerSubject.getId(), ChangeStatus.IN, remainSeat, LocalDateTime.now())); } CrawlerSubject maxCrawlerSubject = findMaxRemainSeatSubject(); Integer maxSubjectRemainSeat = liveBoardSubjects.get(maxCrawlerSubject); @@ -35,17 +36,17 @@ public List checkStatus(CrawlerSubject crawlerSubject, I liveBoardSubjects.put(crawlerSubject, remainSeat); liveBoardSubjects.remove(maxCrawlerSubject); return List.of( - ChangeSubjectsResponse.of(crawlerSubject.getId(), ChangeStatus.IN, remainSeat), - ChangeSubjectsResponse.of(maxCrawlerSubject.getId(), ChangeStatus.OUT, maxSubjectRemainSeat) + ChangeSubjectsResponse.of(crawlerSubject.getId(), ChangeStatus.IN, remainSeat, LocalDateTime.now()), + ChangeSubjectsResponse.of(maxCrawlerSubject.getId(), ChangeStatus.OUT, maxSubjectRemainSeat, LocalDateTime.now()) ); } if (canOut(crawlerSubject, remainSeat)) { liveBoardSubjects.remove(crawlerSubject); - return List.of(ChangeSubjectsResponse.of(crawlerSubject.getId(), ChangeStatus.OUT, remainSeat)); + return List.of(ChangeSubjectsResponse.of(crawlerSubject.getId(), ChangeStatus.OUT, remainSeat, LocalDateTime.now())); } if (canUpdate(crawlerSubject, remainSeat)) { liveBoardSubjects.put(crawlerSubject, remainSeat); - return List.of(ChangeSubjectsResponse.of(crawlerSubject.getId(), ChangeStatus.UPDATE, remainSeat)); + return List.of(ChangeSubjectsResponse.of(crawlerSubject.getId(), ChangeStatus.UPDATE, remainSeat, LocalDateTime.now())); } return Collections.emptyList(); } diff --git a/src/main/java/kr/allcll/backend/admin/seat/SeatPersistenceService.java b/src/main/java/kr/allcll/backend/admin/seat/SeatPersistenceService.java index 73090f2c..b399b002 100644 --- a/src/main/java/kr/allcll/backend/admin/seat/SeatPersistenceService.java +++ b/src/main/java/kr/allcll/backend/admin/seat/SeatPersistenceService.java @@ -1,5 +1,7 @@ package kr.allcll.backend.admin.seat; +import java.time.LocalDate; +import java.util.Optional; import kr.allcll.crawler.seat.CrawlerSeat; import kr.allcll.crawler.seat.CrawlerSeatRepository; import lombok.RequiredArgsConstructor; @@ -15,6 +17,17 @@ public class SeatPersistenceService { @Transactional(propagation = Propagation.REQUIRES_NEW) public void saveSeat(CrawlerSeat crawlerSeat) { - crawlerSeatRepository.save(crawlerSeat); + LocalDate today = LocalDate.now(); + + Optional existingSeatOpt = crawlerSeatRepository.findByCrawlerSubjectAndCreatedDate( + crawlerSeat.getCrawlerSubject(), + today + ); + if (existingSeatOpt.isPresent()) { + CrawlerSeat existingCrawlerSeat = existingSeatOpt.get(); + existingCrawlerSeat.merge(crawlerSeat); + } else { + crawlerSeatRepository.save(crawlerSeat); + } } } diff --git a/src/main/java/kr/allcll/backend/admin/seat/TargetSubjectService.java b/src/main/java/kr/allcll/backend/admin/subject/TargetSubjectService.java similarity index 95% rename from src/main/java/kr/allcll/backend/admin/seat/TargetSubjectService.java rename to src/main/java/kr/allcll/backend/admin/subject/TargetSubjectService.java index c65d8d23..3fb3f2f6 100644 --- a/src/main/java/kr/allcll/backend/admin/seat/TargetSubjectService.java +++ b/src/main/java/kr/allcll/backend/admin/subject/TargetSubjectService.java @@ -1,4 +1,4 @@ -package kr.allcll.backend.admin.seat; +package kr.allcll.backend.admin.subject; import java.util.List; import java.util.Map; @@ -8,7 +8,6 @@ import kr.allcll.crawler.common.exception.CrawlerAllcllException; import kr.allcll.crawler.subject.CrawlerSubject; import kr.allcll.crawler.subject.CrawlerSubjectRepository; -import kr.allcll.backend.admin.subject.SubjectFilter; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/kr/allcll/backend/admin/seat/TargetSubjectStorage.java b/src/main/java/kr/allcll/backend/admin/subject/TargetSubjectStorage.java similarity index 99% rename from src/main/java/kr/allcll/backend/admin/seat/TargetSubjectStorage.java rename to src/main/java/kr/allcll/backend/admin/subject/TargetSubjectStorage.java index 4ecbe38e..4e7f28ac 100644 --- a/src/main/java/kr/allcll/backend/admin/seat/TargetSubjectStorage.java +++ b/src/main/java/kr/allcll/backend/admin/subject/TargetSubjectStorage.java @@ -1,4 +1,4 @@ -package kr.allcll.backend.admin.seat; +package kr.allcll.backend.admin.subject; import java.util.LinkedList; import java.util.List; diff --git a/src/main/java/kr/allcll/backend/client/ExternalClient.java b/src/main/java/kr/allcll/backend/client/ExternalClient.java index f68da659..9b59b8ae 100644 --- a/src/main/java/kr/allcll/backend/client/ExternalClient.java +++ b/src/main/java/kr/allcll/backend/client/ExternalClient.java @@ -1,8 +1,8 @@ package kr.allcll.backend.client; import java.util.List; -import kr.allcll.backend.admin.seat.AllSeatBuffer; -import kr.allcll.backend.admin.seat.TargetSubjectService; +import kr.allcll.backend.admin.seat.ChangedSubjectBuffer; +import kr.allcll.backend.admin.subject.TargetSubjectService; import kr.allcll.backend.admin.seat.dto.ChangeSubjectsResponse; import kr.allcll.backend.admin.seat.dto.PinSubjectUpdateRequest; import kr.allcll.backend.domain.seat.SeatStorage; @@ -25,8 +25,8 @@ public class ExternalClient { // 외부 의존성 private final TargetSubjectService targetSubjectService; - // private final ChangedSubjectBuffer changedSubjectBuffer; - private final AllSeatBuffer allSeatBuffer; + private final ChangedSubjectBuffer changedSubjectBuffer; + // private final AllSeatBuffer allSeatBuffer; private final SeatStorage seatStorage; private final SubjectRepository subjectRepository; @@ -36,7 +36,7 @@ public void sendPinSubjects(PinSubjectUpdateRequest request) { } public void getAllTargetSubjects() { - List allChangedSubject = allSeatBuffer.getAllAndFlush(); + List allChangedSubject = changedSubjectBuffer.getAllAndFlush(); for (ChangeSubjectsResponse eachChange : allChangedSubject) { Long subjectId = eachChange.subjectId(); Subject subject = subjectRepository.findById(subjectId, Semester.now()) @@ -44,8 +44,8 @@ public void getAllTargetSubjects() { seatStorage.add( new SeatDto(subject, eachChange.remainSeat(), - eachChange.createdAt() -// eachChange.changeStatus() + eachChange.createdAt(), + eachChange.changeStatus() ) ); } diff --git a/src/main/java/kr/allcll/backend/domain/seat/DeprecatedSeatApi.java b/src/main/java/kr/allcll/backend/domain/seat/DeprecatedSeatApi.java index ae2e4ca8..9cd36b5f 100644 --- a/src/main/java/kr/allcll/backend/domain/seat/DeprecatedSeatApi.java +++ b/src/main/java/kr/allcll/backend/domain/seat/DeprecatedSeatApi.java @@ -1,7 +1,7 @@ package kr.allcll.backend.domain.seat; import java.util.List; -import kr.allcll.backend.admin.seat.TargetSubjectService; +import kr.allcll.backend.admin.subject.TargetSubjectService; import kr.allcll.backend.admin.seat.dto.PinSubjectUpdateRequest; import kr.allcll.backend.domain.seat.dto.DeprecatedSubjectSummaryResponse; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/kr/allcll/backend/domain/seat/DeprecatedSeatService.java b/src/main/java/kr/allcll/backend/domain/seat/DeprecatedSeatService.java index dc5fdc09..1a6b2217 100644 --- a/src/main/java/kr/allcll/backend/domain/seat/DeprecatedSeatService.java +++ b/src/main/java/kr/allcll/backend/domain/seat/DeprecatedSeatService.java @@ -1,7 +1,7 @@ package kr.allcll.backend.domain.seat; import java.util.List; -import kr.allcll.backend.admin.seat.TargetSubjectStorage; +import kr.allcll.backend.admin.subject.TargetSubjectStorage; import kr.allcll.backend.domain.seat.dto.DeprecatedSubjectSummaryResponse; import kr.allcll.crawler.subject.CrawlerSubject; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/kr/allcll/backend/domain/seat/GeneralSeatSender.java b/src/main/java/kr/allcll/backend/domain/seat/GeneralSeatSender.java index 8b65aad9..2b65b6d2 100644 --- a/src/main/java/kr/allcll/backend/domain/seat/GeneralSeatSender.java +++ b/src/main/java/kr/allcll/backend/domain/seat/GeneralSeatSender.java @@ -46,7 +46,7 @@ public boolean hasActiveSchedule() { private Runnable getGeneralSeatTask() { return () -> { - List generalSeats = seatStorage.getGeneralSeats(QUERY_LIMIT); + List generalSeats = seatStorage.getGeneralSeats(); sseService.propagate(EVENT_NAME, SeatsResponse.from(generalSeats)); }; } diff --git a/src/main/java/kr/allcll/backend/domain/seat/SeatStorage.java b/src/main/java/kr/allcll/backend/domain/seat/SeatStorage.java index 0a740927..f5d50fa7 100644 --- a/src/main/java/kr/allcll/backend/domain/seat/SeatStorage.java +++ b/src/main/java/kr/allcll/backend/domain/seat/SeatStorage.java @@ -1,5 +1,7 @@ package kr.allcll.backend.domain.seat; +import java.time.Duration; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; @@ -23,13 +25,15 @@ public SeatStorage() { this.seats = new ConcurrentHashMap<>(); } - public List getGeneralSeats(int limit) { + public List getGeneralSeats() { + LocalDateTime now = LocalDateTime.now(); + Collection seatsValue = seats.values(); return seatsValue.stream() .filter(seat -> seat.getSubject().isNonMajor()) - .filter(seat -> seat.getSeatCount() > 0) + .filter(seat -> + Duration.between(seat.getQueryTime(), now).getSeconds() <= LIMIT_QUERY_TIME) .sorted(Comparator.comparingInt(SeatDto::getSeatCount)) - .limit(limit) .toList(); } diff --git a/src/main/java/kr/allcll/backend/domain/seat/dto/SeatDto.java b/src/main/java/kr/allcll/backend/domain/seat/dto/SeatDto.java index 8201bbc7..11abf544 100644 --- a/src/main/java/kr/allcll/backend/domain/seat/dto/SeatDto.java +++ b/src/main/java/kr/allcll/backend/domain/seat/dto/SeatDto.java @@ -1,6 +1,7 @@ package kr.allcll.backend.domain.seat.dto; import java.time.LocalDateTime; +import kr.allcll.backend.admin.seat.ChangeStatus; import kr.allcll.backend.domain.subject.Subject; import lombok.AllArgsConstructor; import lombok.Getter; @@ -12,5 +13,5 @@ public class SeatDto { private Subject subject; private int seatCount; private LocalDateTime queryTime; -// private ChangeStatus changeStatus; + private ChangeStatus changeStatus; } diff --git a/src/main/java/kr/allcll/backend/domain/seat/dto/SeatResponse.java b/src/main/java/kr/allcll/backend/domain/seat/dto/SeatResponse.java index 5b8af12a..872212ba 100644 --- a/src/main/java/kr/allcll/backend/domain/seat/dto/SeatResponse.java +++ b/src/main/java/kr/allcll/backend/domain/seat/dto/SeatResponse.java @@ -1,18 +1,21 @@ package kr.allcll.backend.domain.seat.dto; import java.time.LocalDateTime; +import kr.allcll.backend.admin.seat.ChangeStatus; public record SeatResponse( Long subjectId, Integer seatCount, - LocalDateTime queryTime + LocalDateTime queryTime, + ChangeStatus changeStatus ) { public static SeatResponse from(SeatDto seatDto) { return new SeatResponse( seatDto.getSubject().getId(), seatDto.getSeatCount(), - seatDto.getQueryTime() + seatDto.getQueryTime(), + seatDto.getChangeStatus() ); } } diff --git a/src/test/java/kr/allcll/backend/client/ExternalClientTest.java b/src/test/java/kr/allcll/backend/client/ExternalClientTest.java index 8a191dc1..44d9d843 100644 --- a/src/test/java/kr/allcll/backend/client/ExternalClientTest.java +++ b/src/test/java/kr/allcll/backend/client/ExternalClientTest.java @@ -1,14 +1,19 @@ package kr.allcll.backend.client; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.tuple; +import java.time.LocalDateTime; import java.util.List; import kr.allcll.backend.AllcllBackendApplication; +import kr.allcll.backend.admin.seat.ChangeStatus; import kr.allcll.backend.admin.seat.ChangedSubjectBuffer; -import kr.allcll.backend.admin.seat.TargetSubjectStorage; +import kr.allcll.backend.admin.subject.TargetSubjectStorage; +import kr.allcll.backend.admin.seat.dto.ChangeSubjectsResponse; import kr.allcll.backend.admin.seat.dto.PinSubjectUpdateRequest; import kr.allcll.backend.admin.seat.dto.PinSubjectUpdateRequest.PinSubject; import kr.allcll.backend.domain.seat.SeatStorage; +import kr.allcll.backend.domain.seat.dto.SeatDto; import kr.allcll.backend.domain.subject.Subject; import kr.allcll.backend.domain.subject.SubjectRepository; import kr.allcll.backend.fixture.SubjectFixture; @@ -68,28 +73,28 @@ void sendPinSubjects() { subjectB.getId() ); } -// -// @Test -// @DisplayName("변경 감지 과목들의 정상 수신을 확인한다.") -// void getAllTargetSubjects() { -// // given -// Subject subjectA = subjectRepository -// .save(SubjectFixture.createNonMajorSubject("차와문화", "123456", "001", "김보예")); -// Subject subjectB = subjectRepository -// .save(SubjectFixture.createNonMajorSubject("차와문화", "123456", "002", "김보예")); -// changedSubjectBuffer.add(new ChangeSubjectsResponse(subjectA.getId(), ChangeStatus.IN, 10)); -// changedSubjectBuffer.add(new ChangeSubjectsResponse(subjectB.getId(), ChangeStatus.IN, 15)); -// -// // when -// externalClient.getAllTargetSubjects(); -// List allSeatDtos = seatStorage.getAll(); -// -// // then -// assertThat(allSeatDtos).hasSize(2) -// .extracting(SeatDto::getSubject, SeatDto::getSeatCount) -// .containsExactly( -// tuple(subjectA, 10), -// tuple(subjectB, 15) -// ); -// } + + @Test + @DisplayName("변경 감지 과목들의 정상 수신을 확인한다.") + void getAllTargetSubjects() { + // given + Subject subjectA = subjectRepository + .save(SubjectFixture.createNonMajorSubject("차와문화", "123456", "001", "김보예")); + Subject subjectB = subjectRepository + .save(SubjectFixture.createNonMajorSubject("차와문화", "123456", "002", "김보예")); + changedSubjectBuffer.add(new ChangeSubjectsResponse(subjectA.getId(), ChangeStatus.IN, 10, LocalDateTime.now())); + changedSubjectBuffer.add(new ChangeSubjectsResponse(subjectB.getId(), ChangeStatus.IN, 15, LocalDateTime.now())); + + // when + externalClient.getAllTargetSubjects(); + List allSeatDtos = seatStorage.getAll(); + + // then + assertThat(allSeatDtos).hasSize(2) + .extracting(SeatDto::getSubject, SeatDto::getSeatCount) + .containsExactly( + tuple(subjectA, 10), + tuple(subjectB, 15) + ); + } } diff --git a/src/test/java/kr/allcll/backend/domain/seat/SeatServiceTest.java b/src/test/java/kr/allcll/backend/domain/seat/SeatServiceTest.java index eb30244c..4fa6f703 100644 --- a/src/test/java/kr/allcll/backend/domain/seat/SeatServiceTest.java +++ b/src/test/java/kr/allcll/backend/domain/seat/SeatServiceTest.java @@ -5,6 +5,7 @@ import java.time.LocalDateTime; import java.util.List; +import kr.allcll.backend.admin.seat.ChangeStatus; import kr.allcll.backend.domain.seat.dto.SeatDto; import kr.allcll.backend.domain.seat.pin.Pin; import kr.allcll.backend.domain.seat.pin.PinRepository; @@ -68,11 +69,11 @@ void getPinSeatsTest() { pinRepository.saveAll(List.of(pin1, pin2, pin3, pin4, pin5)); LocalDateTime now = LocalDateTime.now(); - SeatDto seat1 = new SeatDto(subject1, 1, now); - SeatDto seat2 = new SeatDto(subject2, 2, now); - SeatDto seat3 = new SeatDto(subject3, 3, now); - SeatDto seat4 = new SeatDto(subject4, 4, now); - SeatDto seat5 = new SeatDto(subject5, 5, now); + SeatDto seat1 = new SeatDto(subject1, 1, now, ChangeStatus.IN); + SeatDto seat2 = new SeatDto(subject2, 2, now, ChangeStatus.IN); + SeatDto seat3 = new SeatDto(subject3, 3, now, ChangeStatus.IN); + SeatDto seat4 = new SeatDto(subject4, 4, now, ChangeStatus.IN); + SeatDto seat5 = new SeatDto(subject5, 5, now, ChangeStatus.IN); seatStorage.addAll(List.of(seat1, seat2, seat3, seat4, seat5)); // when diff --git a/src/test/java/kr/allcll/backend/domain/seat/SeatStorageTest.java b/src/test/java/kr/allcll/backend/domain/seat/SeatStorageTest.java index 11c8c7f0..d8b4d55e 100644 --- a/src/test/java/kr/allcll/backend/domain/seat/SeatStorageTest.java +++ b/src/test/java/kr/allcll/backend/domain/seat/SeatStorageTest.java @@ -7,6 +7,7 @@ import java.time.LocalDateTime; import java.util.List; +import kr.allcll.backend.admin.seat.ChangeStatus; import kr.allcll.backend.domain.seat.dto.SeatDto; import kr.allcll.backend.domain.subject.Subject; import kr.allcll.backend.domain.subject.SubjectRepository; @@ -40,9 +41,9 @@ void addDuplicateSeatTest() { subjectRepository.save(subject); // when - SeatDto previousSeatDto = new SeatDto(subject, 10, LocalDateTime.now()); + SeatDto previousSeatDto = new SeatDto(subject, 10, LocalDateTime.now(), ChangeStatus.IN); seatStorage.add(previousSeatDto); - SeatDto updatedSeatDto = new SeatDto(subject, 5, LocalDateTime.now()); + SeatDto updatedSeatDto = new SeatDto(subject, 5, LocalDateTime.now(), ChangeStatus.UPDATE); seatStorage.add(updatedSeatDto); // then @@ -76,28 +77,29 @@ void getGeneralSeatsTest() { subjectRepository.saveAll( List.of(subject0, subject1, subject2, subject3, subject4, subject5, subject6, subject7, subject8, subject9, subject10)); - SeatDto seatDto1 = new SeatDto(subject0, 8, LocalDateTime.now()); - SeatDto seatDto2 = new SeatDto(subject1, 7, LocalDateTime.now()); - SeatDto seatDto3 = new SeatDto(subject2, 6, LocalDateTime.now()); - SeatDto seatDto4 = new SeatDto(subject3, 5, LocalDateTime.now()); - SeatDto seatDto5 = new SeatDto(subject4, 4, LocalDateTime.now()); - SeatDto seatDto6 = new SeatDto(subject5, 3, LocalDateTime.now()); - SeatDto seatDto7 = new SeatDto(subject6, 2, LocalDateTime.now()); - SeatDto seatDto8 = new SeatDto(subject7, 1, LocalDateTime.now()); - SeatDto seatDto9 = new SeatDto(subject8, 0, LocalDateTime.now()); - SeatDto seatDto10 = new SeatDto(subject9, 2, LocalDateTime.now()); - SeatDto seatDto11 = new SeatDto(subject10, 1, LocalDateTime.now()); + SeatDto seatDto1 = new SeatDto(subject0, 8, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto2 = new SeatDto(subject1, 7, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto3 = new SeatDto(subject2, 6, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto4 = new SeatDto(subject3, 5, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto5 = new SeatDto(subject4, 4, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto6 = new SeatDto(subject5, 3, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto7 = new SeatDto(subject6, 2, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto8 = new SeatDto(subject7, 1, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto9 = new SeatDto(subject8, 0, LocalDateTime.now(), ChangeStatus.OUT); + SeatDto seatDto10 = new SeatDto(subject9, 2, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto11 = new SeatDto(subject10, 1, LocalDateTime.now(), ChangeStatus.IN); seatStorage.addAll( List.of(seatDto1, seatDto2, seatDto3, seatDto4, seatDto5, seatDto6, seatDto7, seatDto8, seatDto9, seatDto10, seatDto11)); // when - List seats = seatStorage.getGeneralSeats(5); + List seats = seatStorage.getGeneralSeats(); // then - assertThat(seats).hasSize(5) + assertThat(seats).hasSize(6) .extracting(SeatDto::getSubject, SeatDto::getSeatCount) .containsExactly( + tuple(subject8, 0), tuple(subject7, 1), tuple(subject10, 1), tuple(subject6, 2), @@ -124,17 +126,17 @@ void getSeatsTest() { subjectRepository.saveAll( List.of(subject0, subject1, subject2, subject3, subject4, subject5, subject6, subject7, subject8, subject9, subject10)); - SeatDto seatDto1 = new SeatDto(subject0, 8, LocalDateTime.now()); - SeatDto seatDto2 = new SeatDto(subject1, 7, LocalDateTime.now()); - SeatDto seatDto3 = new SeatDto(subject2, 6, LocalDateTime.now()); - SeatDto seatDto4 = new SeatDto(subject3, 5, LocalDateTime.now()); - SeatDto seatDto5 = new SeatDto(subject4, 4, LocalDateTime.now()); - SeatDto seatDto6 = new SeatDto(subject5, 3, LocalDateTime.now()); - SeatDto seatDto7 = new SeatDto(subject6, 2, LocalDateTime.now()); - SeatDto seatDto8 = new SeatDto(subject7, 1, LocalDateTime.now()); - SeatDto seatDto9 = new SeatDto(subject8, 0, LocalDateTime.now()); - SeatDto seatDto10 = new SeatDto(subject9, 2, LocalDateTime.now()); - SeatDto seatDto11 = new SeatDto(subject10, 1, LocalDateTime.now()); + SeatDto seatDto1 = new SeatDto(subject0, 8, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto2 = new SeatDto(subject1, 7, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto3 = new SeatDto(subject2, 6, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto4 = new SeatDto(subject3, 5, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto5 = new SeatDto(subject4, 4, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto6 = new SeatDto(subject5, 3, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto7 = new SeatDto(subject6, 2, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto8 = new SeatDto(subject7, 1, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto9 = new SeatDto(subject8, 0, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto10 = new SeatDto(subject9, 2, LocalDateTime.now(), ChangeStatus.IN); + SeatDto seatDto11 = new SeatDto(subject10, 1, LocalDateTime.now(), ChangeStatus.IN); seatStorage.addAll( List.of(seatDto1, seatDto2, seatDto3, seatDto4, seatDto5, seatDto6, seatDto7, seatDto8, seatDto9, seatDto10, seatDto11));