Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug/77 bug 스테이지 초기화 버그 수정 #78

Merged
merged 3 commits into from
Nov 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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