Skip to content

Commit 5572454

Browse files
authored
Feat: 예약 수정 API (#287)
* Add: 수정 request 클래스 추가 * Add: reservation 수정 dto 추가 * Add: error 메세지 추가 * Feat: 수정 controller 추가 * Feat: reservation 수정 메소드 * Feat: reservationDetail 메소드 추가 * Feat: reservation 객체 update 메소드 추가 * Feat: reservationDetail의 time update 메소드 * Feat: reservationDetail 존재 여부 판별 메소드 추가 * Add: 에러 코드 추가 * Refactor: 이미 예약자가 있는 경우 삭제 오류 추가 * Refactor: 에러 코드 수정 * Fix: 에러코드 수정
1 parent 69d3e82 commit 5572454

File tree

9 files changed

+120
-0
lines changed

9 files changed

+120
-0
lines changed

src/main/java/com/openbook/openbook/api/booth/BoothReservationController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.openbook.openbook.api.booth;
22

3+
import com.openbook.openbook.api.booth.request.ReserveModifyRequest;
34
import com.openbook.openbook.api.booth.request.ReserveRegistrationRequest;
45
import com.openbook.openbook.api.booth.request.ReserveStatusUpdateRequest;
56
import com.openbook.openbook.api.booth.response.BoothReserveResponse;
@@ -8,6 +9,8 @@
89
import com.openbook.openbook.api.ResponseMessage;
910
import jakarta.validation.Valid;
1011
import java.util.List;
12+
13+
import jakarta.validation.constraints.NotNull;
1114
import lombok.RequiredArgsConstructor;
1215
import org.springframework.http.HttpStatus;
1316
import org.springframework.security.core.Authentication;
@@ -69,4 +72,13 @@ public ResponseMessage changeReserveStatus(Authentication authentication,
6972
return new ResponseMessage("예약 상태가 변경되었습니다.");
7073
}
7174

75+
@ResponseStatus(HttpStatus.OK)
76+
@PatchMapping("/booth/reserve/{reserve_id}")
77+
public ResponseMessage modifyReservation(Authentication authentication,
78+
@PathVariable Long reserve_id,
79+
@NotNull ReserveModifyRequest request){
80+
reservationService.modifyReservation(Long.valueOf(authentication.getName()), reserve_id, request);
81+
return new ResponseMessage("예약이 변경되었습니다.");
82+
}
83+
7284
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.openbook.openbook.api.booth.request;
2+
3+
import org.springframework.web.multipart.MultipartFile;
4+
5+
import java.time.LocalDate;
6+
import java.util.List;
7+
8+
public record ReserveModifyRequest(
9+
String name,
10+
String description,
11+
MultipartFile image,
12+
Integer price,
13+
LocalDate date,
14+
List<String> timesToAdd,
15+
List<Long> timesToDelete
16+
) {
17+
}

src/main/java/com/openbook/openbook/domain/booth/BoothReservation.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.openbook.openbook.domain.booth;
22

3+
import com.openbook.openbook.service.booth.dto.BoothReservationUpdateData;
34
import jakarta.persistence.*;
45
import lombok.AccessLevel;
56
import lombok.Builder;
@@ -43,4 +44,22 @@ public BoothReservation(String name, String description, Booth linkedBooth, Loca
4344
this.price = price;
4445
this.linkedBooth = linkedBooth;
4546
}
47+
48+
public void updateReservation(BoothReservationUpdateData updateData){
49+
if(updateData.name() != null){
50+
this.name = updateData.name();
51+
}
52+
if(updateData.description() != null){
53+
this.description = updateData.description();
54+
}
55+
if(updateData.image() != null){
56+
this.imageUrl = updateData.image();
57+
}
58+
if(updateData.price() != null){
59+
this.price = updateData.price();
60+
}
61+
if(updateData.date() != null){
62+
this.date = updateData.date();
63+
}
64+
}
4665
}

src/main/java/com/openbook/openbook/domain/booth/BoothReservationDetail.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,8 @@ public void updateUser(BoothReservationStatus status, User user) {
4343
this.status = status;
4444
this.user = user;
4545
}
46+
47+
public void updateReservationDetail(String time){
48+
this.time = time;
49+
}
4650
}

src/main/java/com/openbook/openbook/exception/ErrorCode.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,10 @@ public enum ErrorCode {
4444
UNAVAILABLE_RESERVED_DATE(HttpStatus.CONFLICT, "예약 가능 날짜가 아닙니다."),
4545
UNAVAILABLE_RESERVED_TIME(HttpStatus.CONFLICT, "예약 가능 시간이 아닙니다."),
4646
ALREADY_RESERVED_DATE(HttpStatus.CONFLICT, "이미 존재하는 예약 날짜 입니다."),
47+
ALREADY_RESERVED_TIME(HttpStatus.CONFLICT, "이미 존재하는 예약 시간 입니다."),
4748
DUPLICATE_RESERVED_TIME(HttpStatus.CONFLICT, "중복 되는 시간 데이터가 있습니다."),
4849
ALREADY_RESERVED_SERVICE(HttpStatus.CONFLICT, "이미 예약된 시간 입니다."),
50+
RESERVATION_EXIST(HttpStatus.CONFLICT, "예약자가 존재합니다."),
4951

5052
ALREADY_BOOKMARK(HttpStatus.CONFLICT, "이미 북마크 목록에 존재합니다."),
5153

src/main/java/com/openbook/openbook/repository/booth/BoothReservationDetailRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.openbook.openbook.repository.booth;
22

3+
import com.openbook.openbook.domain.booth.BoothReservation;
34
import com.openbook.openbook.domain.booth.BoothReservationDetail;
45
import org.springframework.data.jpa.repository.JpaRepository;
56
import org.springframework.stereotype.Repository;
@@ -9,5 +10,6 @@
910

1011
@Repository
1112
public interface BoothReservationDetailRepository extends JpaRepository<BoothReservationDetail, Long> {
13+
boolean existsByLinkedReservationAndTime(BoothReservation boothReservation, String time);
1214
List<BoothReservationDetail> findByLinkedReservationId(Long reservationId);
1315
}

src/main/java/com/openbook/openbook/service/booth/BoothReservationDetailService.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,27 @@ public void setUserToReservation(User user, BoothReservationDetail boothReservat
7373
boothReservationDetail.updateUser(BoothReservationStatus.WAITING, user);
7474
}
7575

76+
@Transactional
77+
public void modifyReservationDetail(BoothReservation reservation, List<String> addTimes, List<Long> deleteTimes){
78+
if(addTimes != null){
79+
checkAvailableTime(addTimes, reservation.getLinkedBooth());
80+
for(String time : addTimes){
81+
if(boothReservationDetailRepository.existsByLinkedReservationAndTime(reservation, time)){
82+
throw new OpenBookException(ErrorCode.ALREADY_RESERVED_TIME);
83+
}
84+
}
85+
createReservationDetail(addTimes, reservation, reservation.getLinkedBooth());
86+
}
87+
88+
if(deleteTimes != null){
89+
for(Long deleteId : deleteTimes){
90+
BoothReservationDetail detail = getReservationDetailOrException(deleteId);
91+
if(!detail.getStatus().equals(BoothReservationStatus.EMPTY)){
92+
throw new OpenBookException(ErrorCode.RESERVATION_EXIST);
93+
}
94+
boothReservationDetailRepository.delete(detail);
95+
}
96+
}
97+
}
7698

7799
}

src/main/java/com/openbook/openbook/service/booth/BoothReservationService.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.openbook.openbook.service.booth;
22

3+
import com.openbook.openbook.api.booth.request.ReserveModifyRequest;
34
import com.openbook.openbook.api.booth.request.ReserveRegistrationRequest;
45
import com.openbook.openbook.api.booth.request.ReserveStatusUpdateRequest;
56
import com.openbook.openbook.domain.booth.BoothReservationDetail;
@@ -14,6 +15,7 @@
1415
import com.openbook.openbook.service.booth.dto.BoothReservationDto;
1516
import com.openbook.openbook.exception.ErrorCode;
1617
import com.openbook.openbook.exception.OpenBookException;
18+
import com.openbook.openbook.service.booth.dto.BoothReservationUpdateData;
1719
import com.openbook.openbook.service.user.AlarmService;
1820
import com.openbook.openbook.util.S3Service;
1921
import com.openbook.openbook.domain.user.User;
@@ -199,4 +201,29 @@ private void VerifyUserIsManagerOfBooth(Booth booth, long userId){
199201
throw new OpenBookException(ErrorCode.FORBIDDEN_ACCESS);
200202
}
201203
}
204+
205+
@Transactional
206+
public void modifyReservation(Long userId, long reserveId, ReserveModifyRequest request){
207+
BoothReservation reservation = getBoothReservationOrException(reserveId);
208+
VerifyUserIsManagerOfBooth(reservation.getLinkedBooth(), userId);
209+
210+
reservation.updateReservation(BoothReservationUpdateData.builder()
211+
.name(request.name())
212+
.description(request.description())
213+
.image((request.image()!=null) ? s3Service.uploadFileAndGetUrl(request.image()):null)
214+
.price(request.price())
215+
.date(request.date())
216+
.build()
217+
);
218+
219+
if(request.timesToAdd() != null || request.timesToDelete() != null){
220+
reservationDetailService.modifyReservationDetail(reservation, request.timesToAdd(), request.timesToDelete());
221+
}
222+
}
223+
224+
private BoothReservation getBoothReservationOrException(long reserveId){
225+
return boothReservationRepository.findById(reserveId).orElseThrow(
226+
() -> new OpenBookException(ErrorCode.RESERVATION_NOT_FOUND)
227+
);
228+
}
202229
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.openbook.openbook.service.booth.dto;
2+
3+
import lombok.Builder;
4+
5+
import java.time.LocalDate;
6+
7+
@Builder
8+
public record BoothReservationUpdateData(
9+
String name,
10+
String description,
11+
LocalDate date,
12+
String image,
13+
Integer price
14+
) {
15+
}

0 commit comments

Comments
 (0)