diff --git a/api/api-booking/http/booking.http b/api/api-booking/http/booking.http index 5cd228f2..3fd23411 100644 --- a/api/api-booking/http/booking.http +++ b/api/api-booking/http/booking.http @@ -89,5 +89,5 @@ GET http://localhost:8082/api/v1/bookings Authorization: Bearer {{accessToken}} ### 내 예매 내역 상세 조회 -GET http://localhost:8082/api/v1/bookings/1705163603493 +GET http://localhost:8082/api/v1/bookings/{bookingId} Authorization: Bearer {{accessToken}} diff --git a/api/api-booking/src/main/java/com/pgms/apibooking/domain/booking/controller/BookingController.java b/api/api-booking/src/main/java/com/pgms/apibooking/domain/booking/controller/BookingController.java index 16f74bb9..046ef752 100644 --- a/api/api-booking/src/main/java/com/pgms/apibooking/domain/booking/controller/BookingController.java +++ b/api/api-booking/src/main/java/com/pgms/apibooking/domain/booking/controller/BookingController.java @@ -91,7 +91,6 @@ public ResponseEntity> getBooking( @CurrentAccount Long memberId, @PathVariable String id ) { - System.out.println("!!!!!!!!! memberId = " + memberId); BookingGetResponse booking = bookingService.getBooking(id, memberId); ApiResponse response = ApiResponse.ok(booking); return ResponseEntity.ok().body(response); diff --git a/api/api-booking/src/main/java/com/pgms/apibooking/domain/booking/service/BookingService.java b/api/api-booking/src/main/java/com/pgms/apibooking/domain/booking/service/BookingService.java index 3055dfcc..f93d0e80 100644 --- a/api/api-booking/src/main/java/com/pgms/apibooking/domain/booking/service/BookingService.java +++ b/api/api-booking/src/main/java/com/pgms/apibooking/domain/booking/service/BookingService.java @@ -68,7 +68,7 @@ public class BookingService { //TODO: 테스트 코드 작성 public BookingCreateResponse createBooking(BookingCreateRequest request, Long memberId, String tokenSessionId) { Member member = getMemberById(memberId); EventTime time = getBookableTimeWithEvent(request.timeId()); - List seats = getBookableSeatsWithArea(request.timeId(), request.seatIds(), memberId); + List seats = getBookableSeatsWithArea(request.timeId(), request.seatIds(), tokenSessionId); ReceiptType receiptType = ReceiptType.fromDescription(request.receiptType()); validateDeliveryAddress(receiptType, request.deliveryAddress()); @@ -188,8 +188,8 @@ private EventTime getBookableTimeWithEvent(Long timeId) { return time; } - private List getBookableSeatsWithArea(Long timeId, List seatIds, Long memberId) { - checkHeldSeats(seatIds, memberId); + private List getBookableSeatsWithArea(Long timeId, List seatIds, String tokenSessionId) { + checkHeldSeats(seatIds, tokenSessionId); List seats = eventSeatRepository.findAllWithAreaByTimeIdAndSeatIds(timeId, seatIds); @@ -204,10 +204,10 @@ private List getBookableSeatsWithArea(Long timeId, List seatIds return seats; } - private void checkHeldSeats(List seatIds, Long memberId) { + private void checkHeldSeats(List seatIds, String sessionId) { seatIds.forEach(seatId -> { - Long selectorId = seatLockManager.getSelectorId(seatId).orElse(null); - if (selectorId == null || !selectorId.equals(memberId)) { + String selectorId = seatLockManager.getSelectorId(seatId).orElse(null); + if (selectorId == null || !selectorId.equals(sessionId)) { throw new BookingException(BookingErrorCode.UNBOOKABLE_SEAT_INCLUSION); } }); diff --git a/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/controller/SeatController.java b/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/controller/SeatController.java index b8e0680b..9950e945 100644 --- a/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/controller/SeatController.java +++ b/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/controller/SeatController.java @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -14,7 +15,6 @@ import com.pgms.apibooking.domain.seat.dto.response.AreaResponse; import com.pgms.apibooking.domain.seat.service.SeatService; import com.pgms.coredomain.response.ApiResponse; -import com.pgms.coresecurity.security.resolver.CurrentAccount; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -38,15 +38,21 @@ public ResponseEntity>> getSeats(@ModelAttribute @Operation(summary = "좌석 선택") @PostMapping("/{seatId}/select") - public ResponseEntity selectSeat(@PathVariable Long seatId, @CurrentAccount Long memberId) { - seatService.selectSeat(seatId, memberId); + public ResponseEntity selectSeat( + @PathVariable Long seatId, + @RequestAttribute("tokenSessionId") String tokenSessionId + ) { + seatService.selectSeat(seatId, tokenSessionId); return ResponseEntity.noContent().build(); } @Operation(summary = "좌석 선택 해제") @PostMapping("/{seatId}/deselect") - public ResponseEntity deselectSeat(@PathVariable Long seatId, @CurrentAccount Long memberId) { - seatService.deselectSeat(seatId, memberId); + public ResponseEntity deselectSeat( + @PathVariable Long seatId, + @RequestAttribute("tokenSessionId") String tokenSessionId + ) { + seatService.deselectSeat(seatId, tokenSessionId); return ResponseEntity.noContent().build(); } } diff --git a/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/service/SeatLockManager.java b/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/service/SeatLockManager.java index 3c38b0b8..cde3e27f 100644 --- a/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/service/SeatLockManager.java +++ b/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/service/SeatLockManager.java @@ -13,19 +13,19 @@ public class SeatLockManager { private final static String SEAT_LOCK_CACHE_KEY_PREFIX = "seatId:"; - private final static String SEAT_LOCK_CACHE_VALUE_PREFIX = "memberId:"; + private final static String SEAT_LOCK_CACHE_VALUE_PREFIX = "tokenSessionId:"; private final RedisOperator redisOperator; - public Optional getSelectorId(Long seatId) { + public Optional getSelectorId(Long seatId) { String key = generateSeatLockKey(seatId); String value = redisOperator.get(key); - return Optional.ofNullable(value == null ? null : extractMemberId(value)); + return Optional.ofNullable(value == null ? null : extractSessionId(value)); } - public void lockSeat(Long seatId, Long memberId, Integer expirationSeconds) { + public void lockSeat(Long seatId, String tokenSessionId, Integer expirationSeconds) { String key = generateSeatLockKey(seatId); - String value = generateSeatLockValue(memberId); + String value = generateSeatLockValue(tokenSessionId); redisOperator.setIfAbsent(key, value, expirationSeconds); } @@ -37,11 +37,11 @@ private String generateSeatLockKey(Long seatId) { return SEAT_LOCK_CACHE_KEY_PREFIX + seatId; } - private String generateSeatLockValue(Long memberId) { - return SEAT_LOCK_CACHE_VALUE_PREFIX + memberId; + private String generateSeatLockValue(String tokenSessionId) { + return SEAT_LOCK_CACHE_VALUE_PREFIX + tokenSessionId; } - private Long extractMemberId(String value) { - return Long.parseLong(value.replace(SEAT_LOCK_CACHE_VALUE_PREFIX, "")); + private String extractSessionId(String value) { + return value.replace(SEAT_LOCK_CACHE_VALUE_PREFIX, ""); } } diff --git a/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/service/SeatService.java b/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/service/SeatService.java index 61871089..50e10215 100644 --- a/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/service/SeatService.java +++ b/api/api-booking/src/main/java/com/pgms/apibooking/domain/seat/service/SeatService.java @@ -35,11 +35,11 @@ public List getSeats(SeatsGetRequest request) { .toList(); } - public void selectSeat(Long seatId, Long memberId) { - Long selectorId = seatLockManager.getSelectorId(seatId).orElse(null); + public void selectSeat(Long seatId, String tokenSessionId) { + String selectorId = seatLockManager.getSelectorId(seatId).orElse(null); if (selectorId != null) { - if (selectorId.equals(memberId)) { + if (selectorId.equals(tokenSessionId)) { return; } throw new BookingException(BookingErrorCode.SEAT_HELD_BY_ANOTHER_MEMBER); @@ -52,18 +52,18 @@ public void selectSeat(Long seatId, Long memberId) { } seat.updateStatus(EventSeatStatus.HOLDING); - seatLockManager.lockSeat(seatId, memberId, SEAT_LOCK_CACHE_EXPIRE_SECONDS); + seatLockManager.lockSeat(seatId, tokenSessionId, SEAT_LOCK_CACHE_EXPIRE_SECONDS); } - public void deselectSeat(Long seatId, Long memberId) { - Long selectorId = seatLockManager.getSelectorId(seatId).orElse(null); + public void deselectSeat(Long seatId, String tokenSessionId) { + String selectorId = seatLockManager.getSelectorId(seatId).orElse(null); if (selectorId == null) { updateSeatStatusToAvailable(seatId); return; } - if (!selectorId.equals(memberId)) { + if (!selectorId.equals(tokenSessionId)) { throw new BookingException(BookingErrorCode.SEAT_HELD_BY_ANOTHER_MEMBER); } diff --git a/api/api-booking/src/test/java/com/pgms/apibooking/service/BookingServiceTest.java b/api/api-booking/src/test/java/com/pgms/apibooking/service/BookingServiceTest.java index 379cc64f..28799afb 100644 --- a/api/api-booking/src/test/java/com/pgms/apibooking/service/BookingServiceTest.java +++ b/api/api-booking/src/test/java/com/pgms/apibooking/service/BookingServiceTest.java @@ -161,7 +161,7 @@ void setup() { Optional.empty() ); - given(seatLockManager.getSelectorId(any(Long.class))).willReturn(Optional.of(member.getId())); + given(seatLockManager.getSelectorId(any(Long.class))).willReturn(Optional.of(SESSION_ID)); doNothing().when(bookingQueueManager).remove(any(Long.class), any(String.class)); // when @@ -243,7 +243,7 @@ void setup() { ); given(seatLockManager.getSelectorId(seat1.getId())).willReturn(Optional.empty()); - given(seatLockManager.getSelectorId(seat2.getId())).willReturn(Optional.of(member.getId() + 1)); + given(seatLockManager.getSelectorId(seat2.getId())).willReturn(Optional.of(SESSION_ID)); // when & then assertThatThrownBy(() -> bookingService.createBooking(request, member.getId(), SESSION_ID)) @@ -295,7 +295,7 @@ void setup() { Optional.empty() ); - given(seatLockManager.getSelectorId(seat.getId())).willReturn(Optional.of(member.getId())); + given(seatLockManager.getSelectorId(seat.getId())).willReturn(Optional.of(SESSION_ID)); // when & then assertThatThrownBy(() -> bookingService.createBooking(request, member.getId(), SESSION_ID)) @@ -349,7 +349,7 @@ void setup() { Optional.empty() ); - given(seatLockManager.getSelectorId(seat.getId())).willReturn(Optional.of(member.getId())); + given(seatLockManager.getSelectorId(seat.getId())).willReturn(Optional.of(SESSION_ID)); // when & then assertThatThrownBy(() -> bookingService.createBooking(request, member.getId(), SESSION_ID)) @@ -401,7 +401,7 @@ void setup() { Optional.empty() ); - given(seatLockManager.getSelectorId(seat.getId())).willReturn(Optional.of(member.getId())); + given(seatLockManager.getSelectorId(seat.getId())).willReturn(Optional.of(SESSION_ID)); // when & then assertThatThrownBy(() -> bookingService.createBooking(request, member.getId(), SESSION_ID)) @@ -453,7 +453,7 @@ void setup() { Optional.empty() ); - given(seatLockManager.getSelectorId(seat.getId())).willReturn(Optional.of(member.getId())); + given(seatLockManager.getSelectorId(seat.getId())).willReturn(Optional.of(SESSION_ID)); // when & then assertThatThrownBy(() -> bookingService.createBooking(request, member.getId(), SESSION_ID))