Skip to content

Commit

Permalink
Merge pull request #78 from pknu-wap/bug/77-bug-스테이지-초기화-버그-수정
Browse files Browse the repository at this point in the history
Bug/77 bug 스테이지 초기화 버그 수정
  • Loading branch information
suhyun113 authored Nov 27, 2024
2 parents 7ca2f66 + 74f59e5 commit c65b324
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 113 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ public class StageController {

@Autowired
private StageService stageService;
@Autowired
private StageResetService stageResetService;

// 특정 스테이지 접근 가능 여부 확인
@GetMapping("/{stageId}/access")
Expand Down Expand Up @@ -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<StageResetResponseDto> resetStage(
@PathVariable int stageId,
@RequestParam String sessionId) {
return ResponseEntity.ok(stageResetService.resetStage(sessionId, stageId));
}
}
Original file line number Diff line number Diff line change
@@ -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<StageResetResponseDto> resetStage(
@RequestParam String sessionId) {
return ResponseEntity.ok(stageResetService.resetStage(sessionId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,5 @@ public interface StageProgressRepository extends JpaRepository<StageProgressEnti
@Modifying
@Query("DELETE FROM StageProgressEntity p WHERE p.sessionId = :sessionId")
void deleteAllBySessionId(@Param("sessionId") String sessionId);

// sessionId가 같은 진행 상황 중 가장 최신의 정보 찾기
@Query("SELECT sp FROM StageProgressEntity sp WHERE sp.sessionId = :sessionId ORDER BY sp.progressId DESC LIMIT 1")
Optional<StageProgressEntity> findLatestBySessionId(@Param("sessionId") String sessionId);
}

Original file line number Diff line number Diff line change
Expand Up @@ -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 유효성 검사
Expand All @@ -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
Expand Down

0 comments on commit c65b324

Please sign in to comment.