Skip to content

Commit 0ced85f

Browse files
authored
[EC-66] BE/feat 회의실 예약 내역 전체 조회 api (#52)
* [EC-66] chore: WIP * [EC-66] feat: 캠퍼스 내 회의실 예약 내역 전체 조회 API 구현
1 parent 12d688f commit 0ced85f

File tree

8 files changed

+152
-1
lines changed

8 files changed

+152
-1
lines changed

api/src/main/java/org/example/educheck/domain/meetingroomreservation/controller/MeetingRoomReservationController.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.RequiredArgsConstructor;
55
import lombok.extern.slf4j.Slf4j;
66
import org.example.educheck.domain.meetingroomreservation.dto.request.MeetingRoomReservationRequestDto;
7+
import org.example.educheck.domain.meetingroomreservation.dto.response.CampusMeetingRoomsDto;
78
import org.example.educheck.domain.meetingroomreservation.dto.response.MeetingRoomReservationResponseDto;
89
import org.example.educheck.domain.meetingroomreservation.service.MeetingRoomReservationService;
910
import org.example.educheck.global.common.dto.ApiResponse;
@@ -40,6 +41,20 @@ public ResponseEntity<ApiResponse<MeetingRoomReservationResponseDto>> getReserva
4041

4142
}
4243

44+
@GetMapping
45+
public ResponseEntity<ApiResponse<CampusMeetingRoomsDto>> getReservations(@AuthenticationPrincipal UserDetails userDetails,
46+
@PathVariable Long campusId) {
47+
48+
return ResponseEntity.ok(
49+
ApiResponse.ok(
50+
"회의실 예약 내역 조회 성공",
51+
"OK",
52+
meetingRoomReservationService.getMeetingRoomReservations(campusId)
53+
)
54+
);
55+
}
56+
57+
4358
@DeleteMapping("/{meetingRoomReservationId}")
4459
public ResponseEntity<ApiResponse<Object>> cancelReservation(@AuthenticationPrincipal UserDetails userDetails,
4560
@PathVariable Long meetingRoomReservationId) {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.example.educheck.domain.meetingroomreservation.dto.response;
2+
3+
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
7+
import java.time.LocalDate;
8+
import java.util.List;
9+
10+
@Getter
11+
@AllArgsConstructor
12+
public class CampusMeetingRoomsDto {
13+
14+
private Long campusId;
15+
private LocalDate date;
16+
private List<MeetingRoomDto> meetingRooms;
17+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.example.educheck.domain.meetingroomreservation.dto.response;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
import java.util.List;
7+
8+
@Getter
9+
@AllArgsConstructor
10+
public class MeetingRoomDto {
11+
private Long meetingRoomId;
12+
private String meetingRoomName;
13+
private List<ReservationDto> reservations;
14+
}

api/src/main/java/org/example/educheck/domain/meetingroomreservation/dto/response/MeetingRoomReservationResponseDto.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package org.example.educheck.domain.meetingroomreservation.dto.response;
22

3+
import lombok.AllArgsConstructor;
34
import lombok.Builder;
45
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
57
import org.example.educheck.domain.meetingroomreservation.entity.MeetingRoomReservation;
68
import org.example.educheck.domain.meetingroomreservation.entity.ReservationStatus;
79

810
import java.time.LocalDateTime;
911

12+
@NoArgsConstructor
13+
@AllArgsConstructor
1014
@Builder
1115
@Getter
1216
public class MeetingRoomReservationResponseDto {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.example.educheck.domain.meetingroomreservation.dto.response;
2+
3+
import java.time.LocalDateTime;
4+
5+
6+
public interface MeetingRoomReservationsProjections {
7+
Long getMeetingRoomId();
8+
9+
String getMeetingRoomName();
10+
11+
Long getCampusId();
12+
13+
Long getMeetingRoomReservationId();
14+
15+
Long getMemberId();
16+
17+
String getMemberName();
18+
19+
String getReservationStatus();
20+
21+
LocalDateTime getStartTime();
22+
23+
LocalDateTime getEndTime();
24+
}
25+
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.example.educheck.domain.meetingroomreservation.dto.response;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
6+
import java.time.LocalDateTime;
7+
8+
@Getter
9+
@AllArgsConstructor
10+
public class ReservationDto {
11+
12+
private Long meetingRoomReservationId;
13+
private Long reserverId;
14+
private String reserverName;
15+
private LocalDateTime startDateTime;
16+
private LocalDateTime endDateTime;
17+
}

api/src/main/java/org/example/educheck/domain/meetingroomreservation/repository/MeetingRoomReservationRepository.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.example.educheck.domain.meetingroomreservation.repository;
22

33
import org.example.educheck.domain.meetingroom.entity.MeetingRoom;
4+
import org.example.educheck.domain.meetingroomreservation.dto.response.MeetingRoomReservationsProjections;
45
import org.example.educheck.domain.meetingroomreservation.entity.MeetingRoomReservation;
56
import org.example.educheck.domain.meetingroomreservation.entity.ReservationStatus;
67
import org.springframework.data.jpa.repository.JpaRepository;
@@ -9,6 +10,7 @@
910

1011
import java.time.LocalDate;
1112
import java.time.LocalDateTime;
13+
import java.util.List;
1214
import java.util.Optional;
1315

1416
public interface MeetingRoomReservationRepository extends JpaRepository<MeetingRoomReservation, Long> {
@@ -37,4 +39,28 @@ boolean existsOverlappingReservation(@Param("meetingRoom") MeetingRoom meetingRo
3739
Optional<MeetingRoomReservation> findByStatusAndById(@Param("reservationId") Long reservationId,
3840
@Param("status") ReservationStatus status);
3941

42+
@Query(value = """
43+
SELECT
44+
m.id AS meetingRoomId,
45+
m.name AS meetingRoomName,
46+
m.campus_id AS campusId,
47+
r.id AS meetingRoomReservationId,
48+
me.id AS memberId,
49+
me.name AS memberName,
50+
r.status AS reservationStatus,
51+
r.start_time AS startTime,
52+
r.end_time AS endTime
53+
FROM meeting_room m
54+
LEFT JOIN meeting_room_reservation r
55+
ON m.id = r.meeting_room_id
56+
LEFT JOIN member me
57+
ON r.memeber_id = me.id
58+
WHERE m.campus_id = :campusId
59+
AND (DATE(r.start_time) = DATE(NOW()) OR r.start_time IS NULL)
60+
AND (r.status = 'ACTIVE' OR r.status IS NULL)
61+
ORDER BY r.start_time
62+
""", nativeQuery = true)
63+
List<MeetingRoomReservationsProjections> findByCampusId(@Param("campusId") Long campusId);
64+
65+
4066
}

api/src/main/java/org/example/educheck/domain/meetingroomreservation/service/MeetingRoomReservationService.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package org.example.educheck.domain.meetingroomreservation.service;
22

33
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
45
import org.example.educheck.domain.meetingroom.entity.MeetingRoom;
56
import org.example.educheck.domain.meetingroom.repository.MeetingRoomRepository;
67
import org.example.educheck.domain.meetingroomreservation.dto.request.MeetingRoomReservationRequestDto;
7-
import org.example.educheck.domain.meetingroomreservation.dto.response.MeetingRoomReservationResponseDto;
8+
import org.example.educheck.domain.meetingroomreservation.dto.response.*;
89
import org.example.educheck.domain.meetingroomreservation.entity.MeetingRoomReservation;
910
import org.example.educheck.domain.meetingroomreservation.entity.ReservationStatus;
1011
import org.example.educheck.domain.meetingroomreservation.repository.MeetingRoomReservationRepository;
@@ -22,7 +23,12 @@
2223
import java.time.LocalDateTime;
2324
import java.time.LocalTime;
2425
import java.time.temporal.ChronoUnit;
26+
import java.util.ArrayList;
27+
import java.util.LinkedHashMap;
28+
import java.util.List;
29+
import java.util.Map;
2530

31+
@Slf4j
2632
@Service
2733
@Transactional(readOnly = true)
2834
@RequiredArgsConstructor
@@ -123,4 +129,31 @@ public void cancelReservation(UserDetails userDetails, Long meetingRoomReservati
123129
meetingRoomReservation.cancelReservation();
124130
meetingRoomReservationRepository.save(meetingRoomReservation);
125131
}
132+
133+
public CampusMeetingRoomsDto getMeetingRoomReservations(Long campusId) {
134+
135+
List<MeetingRoomReservationsProjections> reservationsByCampus = meetingRoomReservationRepository.findByCampusId(campusId);
136+
137+
Map<Long, MeetingRoomDto> meetingRoomDtoMap = new LinkedHashMap<>();
138+
139+
for (MeetingRoomReservationsProjections reservation : reservationsByCampus) {
140+
Long meetingRoomId = reservation.getMeetingRoomId();
141+
String meetingRoomName = reservation.getMeetingRoomName();
142+
143+
meetingRoomDtoMap.putIfAbsent(meetingRoomId, new MeetingRoomDto(meetingRoomId, meetingRoomName, new ArrayList<>()));
144+
145+
if (reservation.getMeetingRoomReservationId() != null) {
146+
meetingRoomDtoMap.get(meetingRoomId).getReservations().add(
147+
new ReservationDto(reservation.getMeetingRoomReservationId(),
148+
reservation.getMemberId(),
149+
reservation.getMemberName(),
150+
reservation.getStartTime(),
151+
reservation.getEndTime())
152+
);
153+
}
154+
155+
}
156+
157+
return new CampusMeetingRoomsDto(campusId, LocalDate.now(), new ArrayList<>(meetingRoomDtoMap.values()));
158+
}
126159
}

0 commit comments

Comments
 (0)