Skip to content

Commit

Permalink
feat: 조기 종료 기능 보완
Browse files Browse the repository at this point in the history
- 조기 종료 시 5분 단위의 가까운 과거 시간으로 종료 시간이 기록된다.
- 종료 시간은 시작 시간과 같을 수 없다.
- 사용 중인 예약에 대해서만 조기 종료를 할 수 있다.

Co-authored-by: Go-Jaecheol <[email protected]>
  • Loading branch information
Choi-JJunho and Go-Jaecheol committed Aug 7, 2023
1 parent 25cbf2f commit eaa505b
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 7 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.woowacourse.zzimkkong.exception.reservation;

import com.woowacourse.zzimkkong.exception.ZzimkkongException;
import org.springframework.http.HttpStatus;

public class InvalidMinimumDurationTimeInEarlyStopException extends ZzimkkongException {

private static final String MESSAGE = "조기 종료는 최소 5분 이후부터 가능합니다.";

public InvalidMinimumDurationTimeInEarlyStopException() {
super(MESSAGE, HttpStatus.BAD_REQUEST);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,39 @@
package com.woowacourse.zzimkkong.service;

import com.woowacourse.zzimkkong.domain.*;
import com.woowacourse.zzimkkong.domain.Map;
import com.woowacourse.zzimkkong.domain.Member;
import com.woowacourse.zzimkkong.domain.Reservation;
import com.woowacourse.zzimkkong.domain.ReservationTime;
import com.woowacourse.zzimkkong.domain.ServiceZone;
import com.woowacourse.zzimkkong.domain.Setting;
import com.woowacourse.zzimkkong.domain.Settings;
import com.woowacourse.zzimkkong.domain.Space;
import com.woowacourse.zzimkkong.domain.TimeSlot;
import com.woowacourse.zzimkkong.dto.member.LoginUserEmail;
import com.woowacourse.zzimkkong.dto.reservation.*;
import com.woowacourse.zzimkkong.dto.reservation.ReservationAuthenticationDto;
import com.woowacourse.zzimkkong.dto.reservation.ReservationCreateDto;
import com.woowacourse.zzimkkong.dto.reservation.ReservationCreateResponse;
import com.woowacourse.zzimkkong.dto.reservation.ReservationFindAllDto;
import com.woowacourse.zzimkkong.dto.reservation.ReservationFindAllResponse;
import com.woowacourse.zzimkkong.dto.reservation.ReservationFindDto;
import com.woowacourse.zzimkkong.dto.reservation.ReservationFindResponse;
import com.woowacourse.zzimkkong.dto.reservation.ReservationInfiniteScrollResponse;
import com.woowacourse.zzimkkong.dto.reservation.ReservationResponse;
import com.woowacourse.zzimkkong.dto.reservation.ReservationUpdateDto;
import com.woowacourse.zzimkkong.dto.slack.SlackResponse;
import com.woowacourse.zzimkkong.exception.map.NoSuchMapException;
import com.woowacourse.zzimkkong.exception.member.NoSuchMemberException;
import com.woowacourse.zzimkkong.exception.reservation.*;
import com.woowacourse.zzimkkong.exception.reservation.DeleteExpiredReservationException;
import com.woowacourse.zzimkkong.exception.reservation.DeleteReservationInUseException;
import com.woowacourse.zzimkkong.exception.reservation.InvalidMaximumDurationTimeException;
import com.woowacourse.zzimkkong.exception.reservation.InvalidMinimumDurationTimeException;
import com.woowacourse.zzimkkong.exception.reservation.InvalidMinimumDurationTimeInEarlyStopException;
import com.woowacourse.zzimkkong.exception.reservation.InvalidReservationEnableException;
import com.woowacourse.zzimkkong.exception.reservation.InvalidStartEndTimeException;
import com.woowacourse.zzimkkong.exception.reservation.InvalidTimeUnitException;
import com.woowacourse.zzimkkong.exception.reservation.NoSuchReservationException;
import com.woowacourse.zzimkkong.exception.reservation.NotCurrentReservationException;
import com.woowacourse.zzimkkong.exception.reservation.ReservationAlreadyExistsException;
import com.woowacourse.zzimkkong.exception.setting.MultipleSettingsException;
import com.woowacourse.zzimkkong.exception.setting.NoSettingAvailableException;
import com.woowacourse.zzimkkong.exception.space.NoSuchSpaceException;
Expand All @@ -15,7 +42,11 @@
import com.woowacourse.zzimkkong.repository.MapRepository;
import com.woowacourse.zzimkkong.repository.MemberRepository;
import com.woowacourse.zzimkkong.repository.ReservationRepository;
import com.woowacourse.zzimkkong.service.strategy.*;
import com.woowacourse.zzimkkong.service.strategy.ExcludeReservationCreateStrategy;
import com.woowacourse.zzimkkong.service.strategy.ExcludeReservationStrategy;
import com.woowacourse.zzimkkong.service.strategy.ExcludeReservationUpdateStrategy;
import com.woowacourse.zzimkkong.service.strategy.ReservationStrategies;
import com.woowacourse.zzimkkong.service.strategy.ReservationStrategy;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.stereotype.Service;
Expand All @@ -24,6 +55,8 @@
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
Expand Down Expand Up @@ -232,16 +265,26 @@ public SlackResponse updateReservationEndTime(final ReservationUpdateDto reserva
Reservation reservation = reservations.findById(reservationId)
.orElseThrow(NoSuchReservationException::new);
reservationStrategy.validateOwnerOfReservation(reservation, reservationUpdateDto.getPassword(), loginUserEmail);

LocalDateTime now = LocalDateTime.now();
if (reservation.getStartTime().isAfter(now) || reservation.getEndTime().isBefore(now)) {
if (!reservation.isInUse(now)) {
throw new NotCurrentReservationException();
}

if (ChronoUnit.MINUTES.between(reservation.getStartTime(), reservationUpdateDto.getEndDateTime()) < 5L) {
throw new InvalidMinimumDurationTimeInEarlyStopException();
}

reservation.updateReservationTime(
ReservationTime.of(
reservation.getStartTime(),
reservationUpdateDto.getEndDateTime(),
LocalDateTime.of(
reservation.getDate(),
LocalTime.of(
reservation.getEndTime().getHour(),
floorByFiveMinutes(reservationUpdateDto.getEndDateTime())
)
),
map.getServiceZone(),
false)
);
Expand All @@ -251,6 +294,10 @@ public SlackResponse updateReservationEndTime(final ReservationUpdateDto reserva
return SlackResponse.of(reservation, map);
}

private int floorByFiveMinutes(final LocalDateTime baseTime) {
return (baseTime.getMinute() - 5) / 5 * 5;
}

public SlackResponse deleteReservation(final ReservationAuthenticationDto reservationAuthenticationDto) {
ReservationStrategy reservationStrategy = reservationStrategies.getStrategyByReservationType(reservationAuthenticationDto.getReservationType());
Long mapId = reservationAuthenticationDto.getMapId();
Expand Down

0 comments on commit eaa505b

Please sign in to comment.