Skip to content

Commit 71b2f6e

Browse files
committed
feat: 구역별 잔여석 조회
1 parent 7545dd0 commit 71b2f6e

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

src/main/java/TiCatch/backend/domain/ticketing/controller/TicketingController.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ public Mono<ResponseEntity<SingleResponseResult<Map<String, Boolean>>>> getSecti
8888
.map(seats -> ResponseEntity.ok(new SingleResponseResult<>(seats)));
8989
}
9090

91+
// 구역별 잔여석 조회
92+
@GetMapping("/seats/{ticketingId}/unreserved")
93+
public Mono<ResponseEntity<SingleResponseResult<Map<String, Long>>>> checkUnreservedSeat(@PathVariable("ticketingId") Long ticketingId) {
94+
return ticketingService.getSeatCountBySection(ticketingId)
95+
.map(sectionCounts -> ResponseEntity.ok(new SingleResponseResult<>(sectionCounts)));
96+
}
97+
9198
// 좌석 예약 가능 여부 확인
9299
@GetMapping("/seats/{ticketingId}/check/{seatKey}")
93100
public ResponseEntity<SingleResponseResult<String>> checkSeatAvailability(@PathVariable("ticketingId") Long ticketingId, @PathVariable("seatKey") String seatKey) {

src/main/java/TiCatch/backend/domain/ticketing/service/TicketingService.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@
3232
import java.io.InputStream;
3333
import java.time.Instant;
3434
import java.time.ZoneOffset;
35-
import java.util.List;
36-
import java.util.Map;
35+
import java.util.*;
3736
import java.time.LocalDateTime;
38-
import java.util.Optional;
37+
import java.util.function.Function;
38+
import java.util.stream.Collectors;
3939

4040
import static TiCatch.backend.domain.ticketing.entity.TicketingLevel.*;
4141
import static TiCatch.backend.global.constant.TicketingConstants.*;
@@ -192,6 +192,30 @@ public Mono<Map<String, Boolean>> getSectionSeats(Long ticketingId, String secti
192192
);
193193
}
194194

195+
public Mono<Map<String, Long>> getSeatCountBySection(Long ticketingId) {
196+
String redisKey = TICKETING_SEAT_PREFIX + ticketingId;
197+
198+
return reactiveRedisTemplate.<String, String>opsForHash().entries(redisKey)
199+
.collectList()
200+
.flatMap(entries -> {
201+
Set<String> allSections = entries.stream()
202+
.map(entry -> entry.getKey().split(":")[0])
203+
.collect(Collectors.toSet());
204+
205+
Map<String, Long> availableCounts = entries.stream()
206+
.filter(entry -> "0".equals(entry.getValue()))
207+
.map(entry -> entry.getKey().split(":")[0])
208+
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
209+
210+
Map<String, Long> result = new HashMap<>();
211+
for (String section : allSections) {
212+
result.put(section, availableCounts.getOrDefault(section, 0L));
213+
}
214+
215+
return Mono.just(result);
216+
});
217+
}
218+
195219
public void isAvailable(Long ticketingId, String seatKey) {
196220
String redisKey = TICKETING_SEAT_PREFIX + ticketingId;
197221
HashOperations<String, String, String> hashOperations = redisTemplate.opsForHash();

0 commit comments

Comments
 (0)