diff --git a/src/main/java/site/gachontable/gachontablebe/domain/admin/presentation/AdminController.java b/src/main/java/site/gachontable/gachontablebe/domain/admin/presentation/AdminController.java index c6c508ed..15ef0b56 100644 --- a/src/main/java/site/gachontable/gachontablebe/domain/admin/presentation/AdminController.java +++ b/src/main/java/site/gachontable/gachontablebe/domain/admin/presentation/AdminController.java @@ -101,7 +101,7 @@ public ResponseEntity getWaiting(@AuthenticationPrincipa @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(implementation = ErrorResponse.class))), @ApiResponse(responseCode = "500", content = @Content(schema = @Schema(implementation = ErrorResponse.class))) }) - @PostMapping("/enter") + @PatchMapping("/enter") public ResponseEntity enterUser(@AuthenticationPrincipal AuthDetails authDetails, @RequestBody EnterUserRequest request) { return ResponseEntity.ok(enterUser.execute(authDetails, request)); } diff --git a/src/main/java/site/gachontable/gachontablebe/domain/admin/usecase/EnterUser.java b/src/main/java/site/gachontable/gachontablebe/domain/admin/usecase/EnterUser.java index 2e7305bc..e13a8235 100644 --- a/src/main/java/site/gachontable/gachontablebe/domain/admin/usecase/EnterUser.java +++ b/src/main/java/site/gachontable/gachontablebe/domain/admin/usecase/EnterUser.java @@ -9,7 +9,6 @@ import site.gachontable.gachontablebe.domain.auth.domain.AuthDetails; import site.gachontable.gachontablebe.domain.pub.domain.Pub; import site.gachontable.gachontablebe.domain.pub.domain.repository.PubRepository; -import site.gachontable.gachontablebe.domain.pub.exception.EmptyWaitingCountException; import site.gachontable.gachontablebe.domain.pub.exception.PubMismatchException; import site.gachontable.gachontablebe.domain.waiting.domain.Waiting; import site.gachontable.gachontablebe.domain.waiting.domain.repository.WaitingRepository; @@ -41,10 +40,6 @@ public String execute(AuthDetails authDetails, EnterUserRequest request) { } private void decreaseWaitingCount(Pub Pub) { - if (Pub.getWaitingCount() == 0) { - throw new EmptyWaitingCountException(); - } - Pub.decreaseWaitingCount(); pubRepository.save(Pub); } diff --git a/src/main/java/site/gachontable/gachontablebe/domain/pub/domain/Pub.java b/src/main/java/site/gachontable/gachontablebe/domain/pub/domain/Pub.java index e0c00d95..d1d22cd5 100644 --- a/src/main/java/site/gachontable/gachontablebe/domain/pub/domain/Pub.java +++ b/src/main/java/site/gachontable/gachontablebe/domain/pub/domain/Pub.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.*; import site.gachontable.gachontablebe.domain.menu.domain.Menu; +import site.gachontable.gachontablebe.domain.pub.exception.EmptyWaitingCountException; import java.util.List; @@ -98,6 +99,10 @@ public Pub(String pubName, } public void decreaseWaitingCount() { + if (this.getWaitingCount() == 0) { + throw new EmptyWaitingCountException(); + } + this.waitingCount -= this.waitingCount; } } diff --git a/src/main/java/site/gachontable/gachontablebe/domain/shared/BaseTimeEntity.java b/src/main/java/site/gachontable/gachontablebe/domain/shared/BaseTimeEntity.java index 54151e8d..f5c815aa 100644 --- a/src/main/java/site/gachontable/gachontablebe/domain/shared/BaseTimeEntity.java +++ b/src/main/java/site/gachontable/gachontablebe/domain/shared/BaseTimeEntity.java @@ -20,6 +20,6 @@ public class BaseTimeEntity { private LocalDateTime createdAt; @LastModifiedDate - @Column(updatable = false) + @Column private LocalDateTime updatedAt; } diff --git a/src/main/java/site/gachontable/gachontablebe/domain/waiting/domain/Waiting.java b/src/main/java/site/gachontable/gachontablebe/domain/waiting/domain/Waiting.java index a0b79d96..ccfb4bfc 100644 --- a/src/main/java/site/gachontable/gachontablebe/domain/waiting/domain/Waiting.java +++ b/src/main/java/site/gachontable/gachontablebe/domain/waiting/domain/Waiting.java @@ -75,4 +75,8 @@ public static PubWaitingListResponse.WaitingInfo toWaitingInfo(Waiting waiting) public void enter() { this.waitingStatus = Status.ENTERED; } + + public void cancel() { + this.waitingStatus = Status.CANCELED; + } } diff --git a/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/WaitingController.java b/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/WaitingController.java index 2254989f..050cb7d2 100644 --- a/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/WaitingController.java +++ b/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/WaitingController.java @@ -10,19 +10,17 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import site.gachontable.gachontablebe.domain.auth.domain.AuthDetails; -import site.gachontable.gachontablebe.domain.user.domain.User; -import site.gachontable.gachontablebe.domain.user.domain.repository.UserRepository; -import site.gachontable.gachontablebe.domain.user.exception.UserNotFoundException; +import site.gachontable.gachontablebe.domain.waiting.presentation.dto.request.CancelRequest; import site.gachontable.gachontablebe.domain.waiting.presentation.dto.request.OnsiteWaitingRequest; import site.gachontable.gachontablebe.domain.waiting.presentation.dto.request.RemoteWaitingRequest; import site.gachontable.gachontablebe.domain.waiting.presentation.dto.response.OrderResponse; import site.gachontable.gachontablebe.domain.waiting.presentation.dto.response.WaitingHistoryResponse; import site.gachontable.gachontablebe.domain.waiting.presentation.dto.response.WaitingResponse; +import site.gachontable.gachontablebe.domain.waiting.usecase.CancelWaiting; import site.gachontable.gachontablebe.domain.waiting.usecase.CreateWaiting; import site.gachontable.gachontablebe.domain.waiting.usecase.GetOrder; import site.gachontable.gachontablebe.domain.waiting.usecase.GetWaitingHistory; import site.gachontable.gachontablebe.global.error.ErrorResponse; -import site.gachontable.gachontablebe.global.jwt.JwtProvider; import java.util.List; @@ -32,9 +30,8 @@ public class WaitingController { private final CreateWaiting createWaiting; private final GetOrder getOrder; - private final UserRepository userRepository; - private final JwtProvider jwtProvider; private final GetWaitingHistory getWaitingHistory; + private final CancelWaiting cancelWaiting; @Operation(summary = "원격 웨이팅", description = "원격 웨이팅을 신규로 생성합니다.") @ApiResponses({ @@ -44,7 +41,7 @@ public class WaitingController { @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(implementation = ErrorResponse.class))), @ApiResponse(responseCode = "500", content = @Content(schema = @Schema(implementation = ErrorResponse.class))) }) - @PostMapping("/remote/{pubId}") + @PostMapping("/remote") public ResponseEntity createRemote(@AuthenticationPrincipal AuthDetails authDetails, @RequestBody RemoteWaitingRequest request) { return ResponseEntity.ok(createWaiting.execute(authDetails, request)); @@ -58,7 +55,7 @@ public ResponseEntity createRemote(@AuthenticationPrincipal Aut @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(implementation = ErrorResponse.class))), @ApiResponse(responseCode = "500", content = @Content(schema = @Schema(implementation = ErrorResponse.class))) }) - @PostMapping("/onsite/{pubId}") + @PostMapping("/onsite") public ResponseEntity createOnsite(@RequestBody OnsiteWaitingRequest request) { return ResponseEntity.ok(createWaiting.execute(request)); } @@ -86,6 +83,19 @@ public ResponseEntity> getOrder(@AuthenticationPrincipal Aut }) @GetMapping("/history") public ResponseEntity> getWaitingHistory(@AuthenticationPrincipal AuthDetails authDetails) { - return ResponseEntity.ok(getWaitingHistory.excute(authDetails)); + return ResponseEntity.ok(getWaitingHistory.execute(authDetails)); + } + + @Operation(summary = "웨이팅 취소", description = "회원이 개별 웨이팅을 취소합니다.") + @ApiResponses({ + @ApiResponse(responseCode = "201"), + @ApiResponse(responseCode = "400", content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse(responseCode = "500", content = @Content(schema = @Schema(implementation = ErrorResponse.class))) + }) + @PatchMapping("/cancel") + public ResponseEntity cancel(@RequestBody CancelRequest request) { + return ResponseEntity.ok(cancelWaiting.execute(request)); } } diff --git a/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/dto/request/CancelRequest.java b/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/dto/request/CancelRequest.java new file mode 100644 index 00000000..e5563ee3 --- /dev/null +++ b/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/dto/request/CancelRequest.java @@ -0,0 +1,4 @@ +package site.gachontable.gachontablebe.domain.waiting.presentation.dto.request; + +public record CancelRequest(Long waitingId) { +} diff --git a/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/dto/response/OrderResponse.java b/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/dto/response/OrderResponse.java index 957d907a..6d1f6c26 100644 --- a/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/dto/response/OrderResponse.java +++ b/src/main/java/site/gachontable/gachontablebe/domain/waiting/presentation/dto/response/OrderResponse.java @@ -3,14 +3,17 @@ import lombok.Builder; @Builder -public record OrderResponse(String pubName, +public record OrderResponse(Long waitingId, + String pubName, String orderStatus, Integer order) { - public static OrderResponse of(String pubName, + public static OrderResponse of(Long waitingId, + String pubName, String orderStatus, Integer order) { return new OrderResponse( + waitingId, pubName, orderStatus, order diff --git a/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/CancelWaiting.java b/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/CancelWaiting.java new file mode 100644 index 00000000..f36a43c2 --- /dev/null +++ b/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/CancelWaiting.java @@ -0,0 +1,8 @@ +package site.gachontable.gachontablebe.domain.waiting.usecase; + +import site.gachontable.gachontablebe.domain.waiting.presentation.dto.request.CancelRequest; +import site.gachontable.gachontablebe.domain.waiting.presentation.dto.response.WaitingResponse; + +public interface CancelWaiting { + WaitingResponse execute(CancelRequest request); +} diff --git a/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/CancelWaitingImpl.java b/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/CancelWaitingImpl.java new file mode 100644 index 00000000..d1f1a4a3 --- /dev/null +++ b/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/CancelWaitingImpl.java @@ -0,0 +1,36 @@ +package site.gachontable.gachontablebe.domain.waiting.usecase; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import site.gachontable.gachontablebe.domain.pub.domain.Pub; +import site.gachontable.gachontablebe.domain.pub.domain.repository.PubRepository; +import site.gachontable.gachontablebe.domain.waiting.domain.Waiting; +import site.gachontable.gachontablebe.domain.waiting.domain.repository.WaitingRepository; +import site.gachontable.gachontablebe.domain.waiting.exception.WaitingNotFoundException; +import site.gachontable.gachontablebe.domain.waiting.presentation.dto.request.CancelRequest; +import site.gachontable.gachontablebe.domain.waiting.presentation.dto.response.WaitingResponse; +import site.gachontable.gachontablebe.global.success.SuccessCode; + +@Service +@RequiredArgsConstructor +public class CancelWaitingImpl implements CancelWaiting { + private final WaitingRepository waitingRepository; + private final PubRepository pubRepository; + + @Override + public WaitingResponse execute(CancelRequest request) { + Waiting waiting = waitingRepository.findById(request.waitingId()). + orElseThrow(WaitingNotFoundException::new); + + waiting.cancel(); + waitingRepository.save(waiting); + + decreaseWaitingCountFromPub(waiting.getPub()); + return new WaitingResponse(true, SuccessCode.WAITING_CANCEL_SUCCESS.getMessage()); + } + + private void decreaseWaitingCountFromPub(Pub pub) { + pub.decreaseWaitingCount(); + pubRepository.save(pub); + } +} diff --git a/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/CreateWaiting.java b/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/CreateWaiting.java index 43e474f9..633466e4 100644 --- a/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/CreateWaiting.java +++ b/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/CreateWaiting.java @@ -1,7 +1,6 @@ package site.gachontable.gachontablebe.domain.waiting.usecase; import site.gachontable.gachontablebe.domain.auth.domain.AuthDetails; -import site.gachontable.gachontablebe.domain.user.domain.User; import site.gachontable.gachontablebe.domain.waiting.presentation.dto.request.OnsiteWaitingRequest; import site.gachontable.gachontablebe.domain.waiting.presentation.dto.request.RemoteWaitingRequest; import site.gachontable.gachontablebe.domain.waiting.presentation.dto.response.WaitingResponse; diff --git a/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/GetOrderImpl.java b/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/GetOrderImpl.java index ebb7944d..30d68cca 100644 --- a/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/GetOrderImpl.java +++ b/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/GetOrderImpl.java @@ -37,7 +37,9 @@ public List execute(AuthDetails authDetails) { private static Stream getOrderResponse(User user, Pub pub, List waitings) { return waitings.stream() .filter(waiting -> waiting.matchesUser(user)) - .map(waiting -> OrderResponse.of(pub.getPubName(), + .map(waiting -> OrderResponse.of( + waiting.getWaitingId(), + pub.getPubName(), waiting.getWaitingStatus().getStatusKo(), waitings.indexOf(waiting) + 1)); } diff --git a/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/GetWaitingHistory.java b/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/GetWaitingHistory.java index 0a865dfe..bfb65937 100644 --- a/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/GetWaitingHistory.java +++ b/src/main/java/site/gachontable/gachontablebe/domain/waiting/usecase/GetWaitingHistory.java @@ -19,7 +19,7 @@ public class GetWaitingHistory { private final WaitingRepository waitingRepository; private final UserRepository userRepository; - public List excute(AuthDetails authDetails) { + public List execute(AuthDetails authDetails) { User user = userRepository.findById(authDetails.getUuid()).orElseThrow(UserNotFoundException::new); List waitings = waitingRepository.findAllByUserAndWaitingStatusOrWaitingStatus(user, Status.ENTERED,Status.CANCELED); diff --git a/src/main/java/site/gachontable/gachontablebe/global/success/SuccessCode.java b/src/main/java/site/gachontable/gachontablebe/global/success/SuccessCode.java index 5a224e4a..ed8974f1 100644 --- a/src/main/java/site/gachontable/gachontablebe/global/success/SuccessCode.java +++ b/src/main/java/site/gachontable/gachontablebe/global/success/SuccessCode.java @@ -8,7 +8,8 @@ public enum SuccessCode { ENTERED_SUCCESS(200, "ENTERED_SUCCESS", "입장 완료에 성공하였습니다."), REMOTE_WAITING_SUCCESS(201, "REMOTE_WAITING_SUCCESS", "원격 웨이팅에 성공하였습니다."), - ONSITE_WAITING_SUCCESS(201, "ONSITE_WAITING_SUCCESS", "현장 웨이팅에 성공하였습니다."); + ONSITE_WAITING_SUCCESS(201, "ONSITE_WAITING_SUCCESS", "현장 웨이팅에 성공하였습니다."), + WAITING_CANCEL_SUCCESS(201, "WAITING_CANCEL_SUCCESS", "웨이팅 취소에 성공하였습니다."); private final int httpStatus; private final String code;