Skip to content

Commit

Permalink
feat: 예약관리 관련 기능 추가 (#57)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>

* chore: 코드 수정

* chore: 코드 수정

* refactor: DayOfWeekUtil 작성

* chore: 메서드 리네이밍, 위치 변경

* feat: 관리자 예약조회 허용

* chore: 주간 스케줄 시간 검증 추가

* feat: 주간설정 조회시 없으면 isActive=false로 반환

* feat: 가입승인일 설정

* refactor: 일자별 시간 범위 밖 예약 삭제

* chore: 메서드 리네이밍

* chore: 코드 수정

---------

Co-authored-by: Everdu <[email protected]>
  • Loading branch information
yuuuyeonho and kckc0608 authored Feb 8, 2025
1 parent 40fa117 commit 46eadf0
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;


public record DailyAvailableResponse(
LocalDate date,
boolean isActive,
Expand Down Expand Up @@ -34,8 +35,8 @@ public static DailyAvailableResponse createInactiveDate(LocalDate date){
return new DailyAvailableResponse(
date,
false,
null,
null
"10:00",
"23:00"
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

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(
int dayOfWeekNum, // 0 = 일요일, 1 = 월요일, ...
boolean isActive,
String startTime,
String endTime

) {
public static WeeklyScheduleResponse from(WeeklySchedule weeklySchedule){
return new WeeklyScheduleResponse(
Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -36,14 +37,18 @@ public class AdminReservationService {


public List<WeeklyScheduleResponse> 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<WeeklyScheduleUpdateRequest> requests) {
requests.stream()
.peek(request -> validateScheduleTime(request.startTime(), request.endTime()))
.map(WeeklyScheduleUpdateRequest::toEntity)
.forEach(weeklyScheduleRepository::save);
}
Expand All @@ -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<Reservation> reservationsToDelete = reservationRepository.findAllByDate(dailySchedule.getDate()).stream()
.filter(reservation -> reservation.isValidTimeFor(dailySchedule)).toList();
reservationRepository.deleteAll(reservationsToDelete);
} else {
// unactive 시 예약들 삭제
reservationRepository.deleteAllByDate(dailySchedule.getDate());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public void approve() {
throw new MemberException(INVALID_STATUS_FOR_APPROVAL);
}
this.status = MemberStatus.일반;
this.approvalDate = LocalDateTime.now();
}

public boolean isAdmin() {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ public interface ReservationRepository extends JpaRepository<Reservation, Long>

List<Reservation> findAllByMemberOrderByDateDescStartTimeDesc(Member member);

List<Reservation> findAllByDate(LocalDate date);

List<Reservation> findAllByDateBetweenOrderByDateAscStartTimeAsc(LocalDate start, LocalDate end);

List<Reservation> deleteAllByDate(LocalDate date);
Expand Down

0 comments on commit 46eadf0

Please sign in to comment.