Skip to content

Commit

Permalink
Merge pull request #75 from pknu-wap/feature/49-feat-스테이지4-진행-상황-기능
Browse files Browse the repository at this point in the history
Feature/49 feat 스테이지4 진행 상황 기능
  • Loading branch information
suhyun113 authored Nov 26, 2024
2 parents c189b9e + dd2150f commit 7ca2f66
Show file tree
Hide file tree
Showing 15 changed files with 616 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package com.example.rememberdokdo.Controller;

import com.example.rememberdokdo.Dto.SessionProgressDto;
import com.example.rememberdokdo.Dto.StageDto;
import com.example.rememberdokdo.Dto.*;
import com.example.rememberdokdo.Service.StageResetService;
import com.example.rememberdokdo.Service.StageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Map;


@RestController
@RequestMapping("/stage")
public class StageController {

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

// 특정 스테이지 접근 가능 여부 확인
@GetMapping("/{stageId}/access")
Expand All @@ -23,8 +28,42 @@ public StageDto checkAccess(@RequestParam String sessionId, @PathVariable("stage
// 스테이지 클리어 정보 저장
@PostMapping("/{stageId}/clear")
public SessionProgressDto clearStage(@RequestParam String sessionId, @PathVariable("stageId") int stageId) {
if (stageId == 7) {
// 스테이지 7 전용 메서드 호출
return stageService.clearStageForStage7(sessionId);
}
return stageService.clearStage(sessionId, stageId);
}

// POST /stage/{stageId}/attempt
@PostMapping("/{stageId}/attempt")
public StageProgressResponseDto attemptMission(
@PathVariable int stageId,
@RequestParam String sessionId,
@RequestParam String itemName // 아이템 이름 추가
) {
// 스테이지 1, 2, 3은 미션 도전 불가
if (stageId >= 1 && stageId <= 3) {
throw new IllegalArgumentException("스테이지 " + stageId + "은 미션 도전이 불가능합니다. 1,2,3 스테이지를 클리어하고 오세요.");
}
return stageService.processItem(sessionId, stageId, itemName);
}

// GET /stage/{stageId}/status
@GetMapping("/{stageId}/status")
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
@@ -1,11 +1,13 @@
package com.example.rememberdokdo.Dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.List;

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
Expand All @@ -23,6 +25,7 @@ public class SessionProgressDto {
public static class StageStatus {
private int stageId;
private boolean isCleared;
private Integer remainingHearts; // 남은 하트 수 (4, 5, 6 스테이지만 값 포함, 나머지는 null)
}

@Data
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.example.rememberdokdo.Dto;

import com.example.rememberdokdo.Entity.Stage4ItemEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Stage4ItemDto {

private String itemName; // 아이템 이름
private String itemDescription; // 아이템 설명
private boolean isCorrectItem; // 정답 여부

// Entity -> DTO 변환
public static Stage4ItemDto fromEntity(Stage4ItemEntity entity) {
return new Stage4ItemDto(
entity.getItemName(),
entity.getItemDescription(),
entity.isCorrectItem() // 정답 여부
);
}

// DTO -> Entity 변환
public Stage4ItemEntity toEntity() {
return Stage4ItemEntity.builder()
.itemName(this.itemName)
.itemDescription(this.itemDescription)
.isCorrectItem(this.isCorrectItem)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.rememberdokdo.Dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class StageProgressResponseDto {
private Integer progressId; // 진행 상태 ID
private String sessionId; // 세션 ID
private int remainingHearts; // 남은 하트
private boolean isCleared; // 스테이지 클리어 여부
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.rememberdokdo.Dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor // 생성자
@Builder
public class StageResetResponseDto {
private int progressId;
private String sessionId;
private String message; // 게임 클리어 여부 메시지
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.example.rememberdokdo.Entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(name = "Stage4Item")
public class Stage4ItemEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int itemId; // 아이템 ID (Primary Key)

@Column(nullable = false)
private String itemName; // 아이템 이름

@Column(length = 500)
private String itemDescription; // 아이템 설명

@Column(nullable = false)
private int relatedMissionId; // 관련된 미션 ID

@Column(nullable = false)
private boolean isCorrectItem; // 정답 여부
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,24 @@ public class StageProgressEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "progressId") // 컬럼 이름 명시
private int progressId; // progressId로 이름 변경

@Column(name = "sessionId", nullable = false)
private String sessionId;
private String sessionId; // 세션 ID

@Column(name = "stageId", nullable = false)
private int stageId;
private int stageId; // 스테이지 ID

@Column(name = "isCleared", nullable = false)
private boolean isCleared;
private boolean isCleared; // 스테이지 클리어 여부

@Column(nullable = false)
private int remainingHearts=3; // 남은 하트 추가

@Column(nullable = false)
private boolean gameOver; // 게임 오버

@Column(nullable = true)
private String message; // 게임 클리어, 게임 오버 메시지 추가
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.example.rememberdokdo.Exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.Map;

@RestControllerAdvice
public class StageExceptionHandler {

@ExceptionHandler(IllegalStateException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> handleIllegalStateException(IllegalStateException ex) {
return Map.of("error", ex.getMessage());
}

// 기타 예외 처리
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Map<String, String> handleGeneralException(Exception ex) {
return Map.of("error", "서버 오류가 발생했습니다.", "details", ex.getMessage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

import com.example.rememberdokdo.Entity.Inventory.InventoryItemsEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
Expand All @@ -19,5 +22,10 @@ public interface InventoryItemsRepository extends JpaRepository<InventoryItemsEn

// 인벤토리 ID로 인벤토리 아이템 목록 조회
List<InventoryItemsEntity> findByInventoryId(Integer inventoryId);

// inventoryId가 같은 모든 레코드 삭제하는 메서드
@Modifying
@Query("DELETE FROM InventoryItemsEntity p WHERE p.inventoryId = :inventoryId")
void deleteAllByInventoryId(@Param("inventoryId") int inventoryId);
}

Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,7 @@
public interface InventoryRepository extends JpaRepository<InventoryEntity, Integer> {
// 세션 식별자와 매핑된 인벤토리 식별자 존재 여부 확인
Optional<InventoryEntity> findBySessionId(String sessionId);

// 특정 세션 ID로 인벤토리 삭제
void deleteBySessionId(String sessionId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.rememberdokdo.Repository;

import com.example.rememberdokdo.Entity.Stage4ItemEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;

@Repository
public interface Stage4ItemRepository extends JpaRepository<Stage4ItemEntity, Integer> {

// 특정 미션 ID와 아이템 이름으로 아이템 검색
Optional<Stage4ItemEntity> findByRelatedMissionIdAndItemName(int relatedMissionId, String itemName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

import com.example.rememberdokdo.Entity.StageProgressEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;

Expand All @@ -11,4 +15,14 @@ public interface StageProgressRepository extends JpaRepository<StageProgressEnti

// 특정 세션과 스테이지 ID로 엔티티 찾기
Optional<StageProgressEntity> findBySessionIdAndStageId(String sessionId, int stageId);

// sessionId가 같은 모든 레코드 삭제하는 메서드
@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 @@ -135,9 +135,21 @@ public SessionProgressDto getSessionStatus(String sessionId) {

// 스테이지 진행 상황 조회
List<SessionProgressDto.StageStatus> stages = stageProgressRepository.findBySessionId(sessionId).stream()
.map(stage -> new SessionProgressDto.StageStatus(stage.getStageId(), stage.isCleared()))
.map(stage -> {
// 스테이지 4, 5, 6에 대해서만 remainingHearts 추가
Integer remainingHearts = (stage.getStageId() >= 4 && stage.getStageId() <= 7)
? stage.getRemainingHearts() // 남은 하트 가져오기
: null;

return new SessionProgressDto.StageStatus(
stage.getStageId(),
stage.isCleared(),
remainingHearts // 나머지 스테이지는 null
);
})
.collect(Collectors.toList());


// 인벤토리 조회
InventoryEntity inventory = inventoryRepository.findBySessionId(sessionId)
.orElse(new InventoryEntity());
Expand All @@ -149,8 +161,7 @@ public SessionProgressDto getSessionStatus(String sessionId) {

// SessionStatusDto 생성하여 반환
return new SessionProgressDto(
null,
//sessionEntity.getSessionId(),
sessionEntity.getSessionId(),
sessionEntity.getUserId(),
stages,
inventoryItems,
Expand All @@ -174,14 +185,4 @@ public void completeStage(String sessionId, int stageId) {
stageProgress.setCleared(true);
stageProgressRepository.save(stageProgress); // 저장
}


/*사용자 게임 클리어 시 userId 저장 (닉네임 저장)
public SessionDto updateUserId(String sessionId, String userId) {
SessionEntity session = sessionRepository.findById(sessionId)
.orElseThrow(() -> new IllegalArgumentException("Session not found"));
session.setUserId(userId); // 사용자 ID(닉네임) 업데이트
sessionRepository.save(session);
return SessionDto.fromEntity(session);
}*/
}
Loading

0 comments on commit 7ca2f66

Please sign in to comment.