Skip to content

Commit bb433e4

Browse files
committed
feat: 회의실 예약 상태도 같이 응답하도록 변경
1 parent 8a23616 commit bb433e4

File tree

5 files changed

+31
-19
lines changed

5 files changed

+31
-19
lines changed

src/main/java/com/example/busan/reservation/domain/ReservationRepository.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public interface ReservationRepository extends JpaRepository<Reservation, Long>
1616
@Query("""
1717
FROM Reservation r
1818
WHERE DATE_FORMAT (r.startTime, '%Y-%m-%d') = :date
19+
AND r.status != 'CANCELED'
1920
""")
2021
List<Reservation> findAllByStartTimeDate(@Param("date") LocalDate date);
2122

@@ -24,13 +25,14 @@ SELECT EXISTS (
2425
FROM Reservation r
2526
WHERE NOT (r.endTime <= :startTime OR r.startTime >= :endTime)
2627
AND r.roomId = :roomId
28+
AND r.status != 'CANCELED'
2729
)
2830
""")
2931
boolean existDuplicatedTime(@Param("startTime") LocalDateTime startTime,
3032
@Param("endTime") LocalDateTime endTime,
3133
@Param("roomId") Long roomId);
3234

33-
Optional<Reservation> findByIdAndReservationEmail(Long id, String email);
35+
Optional<Reservation> findByIdAndReservationEmailAndStatusIsNot(Long id, String email, Status status);
3436

3537
List<Reservation> findAllByReservationEmail(String reservationEmail, Pageable pageable);
3638
}

src/main/java/com/example/busan/reservation/service/ReservationService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.example.busan.member.domain.MemberRepository;
55
import com.example.busan.reservation.domain.Reservation;
66
import com.example.busan.reservation.domain.ReservationRepository;
7+
import com.example.busan.reservation.domain.Status;
78
import com.example.busan.reservation.dto.CancelReservationRequest;
89
import com.example.busan.reservation.dto.CreateReservationRequest;
910
import com.example.busan.reservation.dto.ReservationResponse;
@@ -53,7 +54,7 @@ private void validateDuplicated(final LocalDateTime startTime, final LocalDateTi
5354

5455
@Transactional
5556
public void deleteById(final Long id, final String currentMemberEmail, final CancelReservationRequest request) {
56-
final Reservation reservation = reservationRepository.findByIdAndReservationEmail(id, currentMemberEmail)
57+
final Reservation reservation = reservationRepository.findByIdAndReservationEmailAndStatusIsNot(id, currentMemberEmail, Status.CANCELED)
5758
.orElseThrow(() -> new IllegalArgumentException("자신이 예약한 회의실만 취소할 수 있습니다."));
5859

5960
reservation.cancel(request.reason());
@@ -62,7 +63,7 @@ public void deleteById(final Long id, final String currentMemberEmail, final Can
6263
@Transactional
6364
public void update(final Long id, final String currentMemberEmail, final UpdateReservationRequest request) {
6465
validateDuplicated(request.startTime(), request.endTime(), request.roomId());
65-
final Reservation reservation = reservationRepository.findByIdAndReservationEmail(id, currentMemberEmail)
66+
final Reservation reservation = reservationRepository.findByIdAndReservationEmailAndStatusIsNot(id, currentMemberEmail, Status.CANCELED)
6667
.orElseThrow(() -> new IllegalArgumentException("자신이 예약한 회의실만 수정할 수 있습니다."));
6768

6869
reservation.update(request.roomId(), request.startTime(), request.endTime());
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package com.example.busan.room.dto;
22

33
import com.example.busan.reservation.domain.Reservation;
4+
import com.example.busan.reservation.domain.Status;
45

56
import java.time.LocalTime;
67

7-
public record ReservationResponse(Long reservationId, LocalTime startTime, LocalTime endTime, boolean isMine) {
8+
public record ReservationResponse(Long reservationId, LocalTime startTime, LocalTime endTime, boolean isMine,
9+
Status status) {
810

911
public static ReservationResponse of(final Reservation reservation, final String currentMemberEmail) {
1012
return new ReservationResponse(
1113
reservation.getId(),
1214
reservation.getStartTime().toLocalTime(),
1315
reservation.getEndTime().toLocalTime(),
14-
reservation.getReservationEmail().equals(currentMemberEmail));
16+
reservation.getReservationEmail().equals(currentMemberEmail),
17+
reservation.getStatus());
1518
}
1619
}

src/main/resources/static/api/openapi3.yaml

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ paths:
154154
현재 유저 정보 조회하기:
155155
value: "{\"name\":\"연어\",\"phone\":\"01012341234\",\"email\":\"\
156156
[email protected]\",\"role\":\"USER\",\"company\":\"우형\",\"region\"\
157-
:\"BUSAN\",\"createdAt\":\"2023-11-27T15:23:52.095109\"}"
157+
:\"BUSAN\",\"createdAt\":\"2023-11-29T02:23:02.327603\"}"
158158
post:
159159
tags:
160160
- members
@@ -279,13 +279,13 @@ paths:
279279
examples:
280280
자신의 회의실 예약 목록 최신 순으로 보기:
281281
value: "[{\"id\":1,\"status\":\"RESERVED\",\"cancelReason\":null,\"\
282-
startTime\":\"2023-11-27T15:23:53.632779\",\"endTime\":\"2023-11-27T17:23:53.632784\"\
282+
startTime\":\"2023-11-29T02:23:03.983094\",\"endTime\":\"2023-11-29T04:23:03.983099\"\
283283
,\"name\":\"황재현\",\"phone\":\"01012341234\",\"reservedAt\":\"\
284-
2023-11-27T15:23:53.632794\",\"roomId\":1,\"roomName\":\"대회의실\"\
284+
2023-11-29T02:23:03.98311\",\"roomId\":1,\"roomName\":\"대회의실\"\
285285
},{\"id\":2,\"status\":\"CANCELED\",\"cancelReason\":\"쓰기 싫어졌어\
286-
요..\",\"startTime\":\"2023-11-27T15:23:53.632803\",\"endTime\"\
287-
:\"2023-11-27T17:23:53.632804\",\"name\":\"황재현\",\"phone\":\"\
288-
01012341234\",\"reservedAt\":\"2023-11-27T15:23:53.632807\",\"\
286+
요..\",\"startTime\":\"2023-11-29T02:23:03.98312\",\"endTime\"\
287+
:\"2023-11-29T04:23:03.983122\",\"name\":\"황재현\",\"phone\":\"\
288+
01012341234\",\"reservedAt\":\"2023-11-29T02:23:03.983124\",\"\
289289
roomId\":1,\"roomName\":\"대회의실\"}]"
290290
post:
291291
tags:
@@ -367,14 +367,15 @@ paths:
367367
content:
368368
application/json:
369369
schema:
370-
$ref: '#/components/schemas/rooms-1484123881'
370+
$ref: '#/components/schemas/rooms397796584'
371371
examples:
372372
회의실 전체 조회하기:
373373
value: "[{\"roomId\":1,\"name\":\"대회의실\",\"image\":\"image.com\"\
374374
,\"maxPeopleCount\":10,\"reservations\":[{\"reservationId\":1,\"\
375-
startTime\":\"13:00:00\",\"endTime\":\"16:00:00\",\"isMine\":true},{\"\
376-
reservationId\":2,\"startTime\":\"16:00:00\",\"endTime\":\"17:00:00\"\
377-
,\"isMine\":false}]}]"
375+
startTime\":\"13:00:00\",\"endTime\":\"16:00:00\",\"isMine\":true,\"\
376+
status\":\"CANCELED\"},{\"reservationId\":2,\"startTime\":\"16:00:00\"\
377+
,\"endTime\":\"17:00:00\",\"isMine\":false,\"status\":\"RESERVED\"\
378+
}]}]"
378379
components:
379380
schemas:
380381
reservations-740649445:
@@ -538,7 +539,7 @@ components:
538539
reason:
539540
type: string
540541
description: 취소 사유
541-
rooms-1484123881:
542+
rooms397796584:
542543
type: array
543544
items:
544545
type: object
@@ -563,6 +564,9 @@ components:
563564
endTime:
564565
type: string
565566
description: 예약 종료 시각
567+
status:
568+
type: string
569+
description: 취소 여부
566570
maxPeopleCount:
567571
type: number
568572
description: 최대 수용 인원 수

src/test/java/com/example/busan/room/RoomControllerTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example.busan.room;
22

33
import com.example.busan.ApiTest;
4+
import com.example.busan.reservation.domain.Status;
45
import com.example.busan.room.dto.ReservationResponse;
56
import com.example.busan.room.dto.RoomResponse;
67
import org.junit.jupiter.api.DisplayName;
@@ -34,8 +35,8 @@ class RoomControllerTest extends ApiTest {
3435
@DisplayName("회의실 전체 조회하기")
3536
void findAll() throws Exception {
3637
//given
37-
final ReservationResponse reservation1 = new ReservationResponse(1L, LocalTime.of(13, 0), LocalTime.of(16, 0), true);
38-
final ReservationResponse reservation2 = new ReservationResponse(2L, LocalTime.of(16, 0), LocalTime.of(17, 0), false);
38+
final ReservationResponse reservation1 = new ReservationResponse(1L, LocalTime.of(13, 0), LocalTime.of(16, 0), true, Status.CANCELED);
39+
final ReservationResponse reservation2 = new ReservationResponse(2L, LocalTime.of(16, 0), LocalTime.of(17, 0), false, Status.RESERVED);
3940
final RoomResponse roomResponse = new RoomResponse(1L, "대회의실", "image.com", 10, List.of(reservation1, reservation2));
4041
given(roomService.findAllAtDate(any(), any()))
4142
.willReturn(List.of(roomResponse));
@@ -54,7 +55,8 @@ void findAll() throws Exception {
5455
fieldWithPath("[].reservations.[].reservationId").description("예약 ID"),
5556
fieldWithPath("[].reservations.[].startTime").description("예약 시작 시각"),
5657
fieldWithPath("[].reservations.[].endTime").description("예약 종료 시각"),
57-
fieldWithPath("[].reservations.[].isMine").description("현재 로그인한 사람의 것인지 여부"))))
58+
fieldWithPath("[].reservations.[].isMine").description("현재 로그인한 사람의 것인지 여부"),
59+
fieldWithPath("[].reservations.[].status").description("취소 여부"))))
5860
.andReturn()
5961
.getResponse();
6062

0 commit comments

Comments
 (0)