From 46eadf08292a35be958accf14fa84621892b3900 Mon Sep 17 00:00:00 2001 From: YuYeonho <127312366+yuuuyeonho@users.noreply.github.com> Date: Sun, 9 Feb 2025 01:32:00 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=98=88=EC=95=BD=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 주간 일정 설정 로직 작성 * chore: 사소한 코드 수정 * feat: 예약 가능 날짜 확인 API * feat: 예약관리 API * feat: 누락된 예외 적용 * refactor: 수정사항 적용 * Update src/main/java/com/keunsori/keunsoriserver/domain/reservation/service/ReservationService.java chore: 코드 정리 Co-authored-by: Everdu * chore: 코드 수정 * chore: 코드 수정 * refactor: DayOfWeekUtil 작성 * chore: 메서드 리네이밍, 위치 변경 * feat: 관리자 예약조회 허용 * chore: 주간 스케줄 시간 검증 추가 * feat: 주간설정 조회시 없으면 isActive=false로 반환 * feat: 가입승인일 설정 * refactor: 일자별 시간 범위 밖 예약 삭제 * chore: 메서드 리네이밍 * chore: 코드 수정 --------- Co-authored-by: Everdu --- .../dto/response/DailyAvailableResponse.java | 5 ++-- .../dto/response/WeeklyScheduleResponse.java | 12 +++++++++- .../service/AdminReservationService.java | 24 +++++++++++++------ .../domain/member/domain/Member.java | 1 + .../reservation/domain/Reservation.java | 6 +++++ .../repository/ReservationRepository.java | 2 ++ 6 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/dto/response/DailyAvailableResponse.java b/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/dto/response/DailyAvailableResponse.java index 39e6e97..f8e9e96 100644 --- a/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/dto/response/DailyAvailableResponse.java +++ b/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/dto/response/DailyAvailableResponse.java @@ -6,6 +6,7 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; + public record DailyAvailableResponse( LocalDate date, boolean isActive, @@ -34,8 +35,8 @@ public static DailyAvailableResponse createInactiveDate(LocalDate date){ return new DailyAvailableResponse( date, false, - null, - null + "10:00", + "23:00" ); } } diff --git a/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/dto/response/WeeklyScheduleResponse.java b/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/dto/response/WeeklyScheduleResponse.java index 44f92f1..d4e8ad0 100644 --- a/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/dto/response/WeeklyScheduleResponse.java +++ b/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/dto/response/WeeklyScheduleResponse.java @@ -2,8 +2,8 @@ import com.keunsori.keunsoriserver.domain.admin.reservation.domain.WeeklySchedule; import com.keunsori.keunsoriserver.global.util.DayOfWeekUtil; -import lombok.Getter; +import java.time.DayOfWeek; import java.time.format.DateTimeFormatter; public record WeeklyScheduleResponse( @@ -11,6 +11,7 @@ public record WeeklyScheduleResponse( boolean isActive, String startTime, String endTime + ) { public static WeeklyScheduleResponse from(WeeklySchedule weeklySchedule){ return new WeeklyScheduleResponse( @@ -21,6 +22,15 @@ public static WeeklyScheduleResponse from(WeeklySchedule weeklySchedule){ ); } + public static WeeklyScheduleResponse createInactiveDay(DayOfWeek day){ + return new WeeklyScheduleResponse( + DayOfWeekUtil.getCustomDayValue(day), + false, + "10:00", + "23:00" + ); + } + public int getDayOfWeekNum() { return dayOfWeekNum; } diff --git a/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/service/AdminReservationService.java b/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/service/AdminReservationService.java index 78e27b4..d5fc1c1 100644 --- a/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/service/AdminReservationService.java +++ b/src/main/java/com/keunsori/keunsoriserver/domain/admin/reservation/service/AdminReservationService.java @@ -16,10 +16,11 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalTime; -import java.util.Comparator; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; import java.util.stream.Stream; import static com.keunsori.keunsoriserver.global.exception.ErrorMessage.*; @@ -36,14 +37,18 @@ public class AdminReservationService { public List findAllWeeklySchedules() { - return weeklyScheduleRepository.findAll() - .stream().map(WeeklyScheduleResponse::from) - .sorted(Comparator.comparing(WeeklyScheduleResponse::getDayOfWeekNum)).toList(); + return Arrays.stream(DayOfWeek.values()) + .map(day -> weeklyScheduleRepository.findByDayOfWeek(day) + .map(WeeklyScheduleResponse::from) + .orElseGet(() -> WeeklyScheduleResponse.createInactiveDay(day))) + .sorted(Comparator.comparing(WeeklyScheduleResponse::getDayOfWeekNum)) + .collect(Collectors.toList()); } @Transactional public void saveWeeklySchedule(List requests) { requests.stream() + .peek(request -> validateScheduleTime(request.startTime(), request.endTime())) .map(WeeklyScheduleUpdateRequest::toEntity) .forEach(weeklyScheduleRepository::save); } @@ -60,8 +65,13 @@ public void saveDailySchedule(DailyScheduleUpdateOrCreateRequest request) { validateNotPastDateSchedule(dailySchedule); validateScheduleTime(dailySchedule.getStartTime(),dailySchedule.getEndTime()); - // active -> unactive 시 예약들 삭제 - if(!dailySchedule.isActive()){ + if(dailySchedule.isActive()){ + // active이면 설정된 시간 범위 밖 예약들 삭제 + List reservationsToDelete = reservationRepository.findAllByDate(dailySchedule.getDate()).stream() + .filter(reservation -> reservation.isValidTimeFor(dailySchedule)).toList(); + reservationRepository.deleteAll(reservationsToDelete); + } else { + // unactive 시 예약들 삭제 reservationRepository.deleteAllByDate(dailySchedule.getDate()); } diff --git a/src/main/java/com/keunsori/keunsoriserver/domain/member/domain/Member.java b/src/main/java/com/keunsori/keunsoriserver/domain/member/domain/Member.java index 5b2eb89..a090d8f 100644 --- a/src/main/java/com/keunsori/keunsoriserver/domain/member/domain/Member.java +++ b/src/main/java/com/keunsori/keunsoriserver/domain/member/domain/Member.java @@ -53,6 +53,7 @@ public void approve() { throw new MemberException(INVALID_STATUS_FOR_APPROVAL); } this.status = MemberStatus.일반; + this.approvalDate = LocalDateTime.now(); } public boolean isAdmin() { diff --git a/src/main/java/com/keunsori/keunsoriserver/domain/reservation/domain/Reservation.java b/src/main/java/com/keunsori/keunsoriserver/domain/reservation/domain/Reservation.java index dd15de3..ea18e49 100644 --- a/src/main/java/com/keunsori/keunsoriserver/domain/reservation/domain/Reservation.java +++ b/src/main/java/com/keunsori/keunsoriserver/domain/reservation/domain/Reservation.java @@ -1,5 +1,6 @@ package com.keunsori.keunsoriserver.domain.reservation.domain; +import com.keunsori.keunsoriserver.domain.admin.reservation.domain.DailySchedule; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -101,4 +102,9 @@ public String getMemberName() { } return member.getName(); } + + public boolean isValidTimeFor(DailySchedule dailySchedule){ + return this.getStartTime().isBefore(dailySchedule.getStartTime()) || + this.getEndTime().isAfter(dailySchedule.getEndTime()); + } } diff --git a/src/main/java/com/keunsori/keunsoriserver/domain/reservation/repository/ReservationRepository.java b/src/main/java/com/keunsori/keunsoriserver/domain/reservation/repository/ReservationRepository.java index 27c3770..d7716f9 100644 --- a/src/main/java/com/keunsori/keunsoriserver/domain/reservation/repository/ReservationRepository.java +++ b/src/main/java/com/keunsori/keunsoriserver/domain/reservation/repository/ReservationRepository.java @@ -18,6 +18,8 @@ public interface ReservationRepository extends JpaRepository List findAllByMemberOrderByDateDescStartTimeDesc(Member member); + List findAllByDate(LocalDate date); + List findAllByDateBetweenOrderByDateAscStartTimeAsc(LocalDate start, LocalDate end); List deleteAllByDate(LocalDate date);