diff --git a/sever/src/main/java/com/example/rememberdokdo/Controller/StageController.java b/sever/src/main/java/com/example/rememberdokdo/Controller/StageController.java index 77ce259..618d172 100644 --- a/sever/src/main/java/com/example/rememberdokdo/Controller/StageController.java +++ b/sever/src/main/java/com/example/rememberdokdo/Controller/StageController.java @@ -16,8 +16,6 @@ public class StageController { @Autowired private StageService stageService; - @Autowired - private StageResetService stageResetService; // 특정 스테이지 접근 가능 여부 확인 @GetMapping("/{stageId}/access") @@ -55,15 +53,6 @@ public StageProgressResponseDto getStageStatus( @PathVariable int stageId, @RequestParam String sessionId ) { - return stageService.getStageStatus(sessionId, stageId); } - - // POST /stage/{stageId}/retry - @PostMapping("/{stageId}/reset") - public ResponseEntity resetStage( - @PathVariable int stageId, - @RequestParam String sessionId) { - return ResponseEntity.ok(stageResetService.resetStage(sessionId, stageId)); - } } \ No newline at end of file diff --git a/sever/src/main/java/com/example/rememberdokdo/Controller/StageResetController.java b/sever/src/main/java/com/example/rememberdokdo/Controller/StageResetController.java new file mode 100644 index 0000000..e50d3c0 --- /dev/null +++ b/sever/src/main/java/com/example/rememberdokdo/Controller/StageResetController.java @@ -0,0 +1,21 @@ +package com.example.rememberdokdo.Controller; + +import com.example.rememberdokdo.Dto.StageResetResponseDto; +import com.example.rememberdokdo.Service.StageResetService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/stage") +public class StageResetController { + @Autowired + private StageResetService stageResetService; + + // POST /stage/reset + @PostMapping("/reset") + public ResponseEntity resetStage( + @RequestParam String sessionId) { + return ResponseEntity.ok(stageResetService.resetStage(sessionId)); + } +} diff --git a/sever/src/main/java/com/example/rememberdokdo/Repository/StageProgressRepository.java b/sever/src/main/java/com/example/rememberdokdo/Repository/StageProgressRepository.java index f1c11b3..e8d23fa 100644 --- a/sever/src/main/java/com/example/rememberdokdo/Repository/StageProgressRepository.java +++ b/sever/src/main/java/com/example/rememberdokdo/Repository/StageProgressRepository.java @@ -20,9 +20,5 @@ public interface StageProgressRepository extends JpaRepository findLatestBySessionId(@Param("sessionId") String sessionId); } diff --git a/sever/src/main/java/com/example/rememberdokdo/Service/StageResetService.java b/sever/src/main/java/com/example/rememberdokdo/Service/StageResetService.java index 917b7af..a5a19d3 100644 --- a/sever/src/main/java/com/example/rememberdokdo/Service/StageResetService.java +++ b/sever/src/main/java/com/example/rememberdokdo/Service/StageResetService.java @@ -23,22 +23,11 @@ public class StageResetService { private InventoryItemsRepository inventoryItemsRepository; - // 초기화(게임 오버, 클리어) 기능 + // 초기화 기능 @Transactional - public StageResetResponseDto resetStage(String sessionId, int stageId) { - validateSessionId(sessionId); - validateStageId(stageId); - - // Stage 4, 5, 6 처리 (공통 처리 로직) - if (stageId == 4 || stageId == 5 || stageId == 6) { - return progressStage456(sessionId); - } - // Stage 7 (퍼즐 게임) 처리 - else if (stageId == 7) { - return progressStage7(sessionId, stageId); - } - - throw new IllegalArgumentException("알 수 없는 스테이지 ID입니다."); + public StageResetResponseDto resetStage(String sessionId) { + validateSessionId(sessionId); // 세션 ID 유효성 검사 + return progressStage(sessionId); // 스테이지 처리(4,5,6,7 공통 처리 로직) } // 세션 ID 유효성 검사 @@ -48,105 +37,30 @@ private void validateSessionId(String sessionId) { } } - // 초기화 불가능한 스테이지 ID 검증 - private void validateStageId(int stageId) { - if (stageId == 1 || stageId == 2 || stageId == 3) { - throw new IllegalArgumentException("해당 스테이지는 초기화할 수 없습니다."); - } - } - - // stage 4,5,6 처리(남은 하트 수 기반) - private StageResetResponseDto progressStage456(String sessionId){ - // 새로운 Dto 생성 - StageResetResponseDto responseDto = new StageResetResponseDto(); - responseDto.setSessionId(sessionId); // sessionId에 따라 한 번 생성 - - InventoryEntity inventory = getInventoryBySessionId(sessionId); - StageProgressEntity progressEntity = getLatestStageProgress(sessionId); - - validateStageResetConditions(progressEntity); - - // 조건 충족 : 데이터 삭제 - deleteAllSessionData(sessionId, inventory.getInventoryId()); // 모든 관련 데이터 삭제 - - // 실패 메시지와 함께 새로운 진행 상태 저장 - progressEntity = resetStageProgress(sessionId, "하트를 모두 소진하여 방탈출에 실패하였습니다."); - - // 응답 Dto에 데이터 설정 - responseDto.setMessage("하트를 모두 소진하여 방탈출에 실패하였습니다."); - responseDto.setProgressId(progressEntity.getProgressId()); - - return responseDto; - } - - // 스테이지7(퍼즐 게임) 처리 - private StageResetResponseDto progressStage7(String sessionId, int stageId){ + // 스테이지 초기화 처리 + private StageResetResponseDto progressStage(String sessionId){ // 새로운 Dto 생성 StageResetResponseDto responseDto = new StageResetResponseDto(); responseDto.setSessionId(sessionId); // sessionId에 따라 한 번 생성 - InventoryEntity inventory = getInventoryBySessionId(sessionId); - StageProgressEntity stageProgress = getStageProgressBySessionAndStage(sessionId, stageId); + InventoryEntity inventory = getInventoryBySessionId(sessionId); // 인벤토리 조회 + StageProgressEntity progressEntity; // 엔티티 생성 + deleteAllSessionData(sessionId, inventory.getInventoryId()); // 데이터 삭제 - // 스테이지 7 진입 전 남은 하트 수 검증 - checkRemainingHearts(stageProgress.getRemainingHearts()); + progressEntity = resetStageProgress(sessionId, "게임이 종료되었습니다."); // 게임 종료 데이터 저장 + responseDto.setMessage("게임이 종료되었습니다."); // 새로운 Dto에 방탈출 게임 종료 메시지 추가 - StageProgressEntity progressEntity; - - // 조건 충족 : 데이터 삭제 - deleteAllSessionData(sessionId, inventory.getInventoryId()); - if (stageProgress.isCleared()) { - // 성공 데이터 저장 - progressEntity = resetStageProgress(sessionId, "퍼즐 게임을 클리어하여 방탈출에 성공하였습니다."); - // 새로운 Dto에 방탈출 성공 메시지 추가 - responseDto.setMessage("퍼즐 게임을 클리어하여 방탈출에 성공하였습니다."); - } else { - // 실패 데이터 저장 - progressEntity = resetStageProgress(sessionId, "퍼즐 게임을 시간 안에 클리어하지 못 해 방탈출에 실패하였습니다."); - // 새로운 Dto에 방탈출 실패 메시지 추가 - responseDto.setMessage("퍼즐 게임을 시간 안에 클리어하지 못 해 방탈출에 실패하였습니다."); - } responseDto.setProgressId(progressEntity.getProgressId()); return responseDto; } - // 남은 하트 수 확인 - private void checkRemainingHearts(int remainingHearts){ - if (remainingHearts <= 0) { - throw new IllegalArgumentException("남은 하트가 0개이므로 스테이지 7에 진입할 수 없습니다."); - } - } - // 인벤토리 조회 private InventoryEntity getInventoryBySessionId(String sessionId) { return inventoryRepository.findBySessionId(sessionId) .orElseThrow(() -> new IllegalArgumentException("인벤토리가 존재하지 않습니다.")); } - // 최신 스테이지 진행 상황 조회 - private StageProgressEntity getLatestStageProgress(String sessionId) { - return stageProgressRepository.findLatestBySessionId(sessionId) - .orElseThrow(() -> new IllegalArgumentException("스테이지 진행 정보가 존재하지 않습니다.")); - } - - // 특정 스테이지 진행 상황 조회 - private StageProgressEntity getStageProgressBySessionAndStage(String sessionId, int stageId) { - return stageProgressRepository.findBySessionIdAndStageId(sessionId, stageId) - .orElseThrow(() -> new IllegalArgumentException("유효하지 않은 스테이지 상태입니다. 세션 ID 또는 스테이지 ID를 확인해주세요.")); - } - - // 초기화 조건 검증 => 하트 수가 0개이고, isCleared가 false - private void validateStageResetConditions(StageProgressEntity progressEntity) { - if (progressEntity.getRemainingHearts() > 0) { - throw new IllegalArgumentException("하트가 남아있어 초기화할 수 없습니다."); - } - - if (progressEntity.isCleared()) { - throw new IllegalArgumentException("현재 스테이지가 클리어된 상태여서 초기화할 수 없습니다."); - } - } - - // 스테이지 4 진행 상황 초기화 + // 스테이지 진행 상황 초기화 private StageProgressEntity resetStageProgress(String sessionId, String message) { StageProgressEntity newProgress = new StageProgressEntity(); newProgress.setSessionId(sessionId); // 기존 세션 ID