플레이어 세대 기록 초기화 및 세대 계산 및 사망 기록 등 기능 수정
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from fastapi import APIRouter, Depends, Query, BackgroundTasks
|
||||
from sqlalchemy.orm import Session
|
||||
from backend.repository.db_init import get_db
|
||||
from backend.schemas.game_schema import (
|
||||
AncestorDeathCreate,
|
||||
DeathRecordRequest,
|
||||
NextGenerationResponse,
|
||||
AncestorDeathResponse,
|
||||
DialogueResponse,
|
||||
SkillCreateRequest,
|
||||
@@ -14,14 +15,55 @@ from backend.services import game_service
|
||||
router = APIRouter(prefix="/api/game", tags=["Game"])
|
||||
|
||||
@router.post("/death", response_model=AncestorDeathResponse)
|
||||
def record_death(req: DeathRecordRequest, db: Session = Depends(get_db)):
|
||||
return game_service.create_death_history(db=db, cause_of_death=req.cause_of_death)
|
||||
def record_death(req: AncestorDeathCreate, db: Session = Depends(get_db)):
|
||||
death_history = game_service.create_death_history(db=db, death_data=req)
|
||||
|
||||
# 다음 세대 대사 즉시 생성 및 캐싱 보장 (동기식 호출)
|
||||
next_gen = death_history.generation + 1
|
||||
game_service.pregenerate_npc_dialogue(db=db, next_generation=next_gen)
|
||||
|
||||
return death_history
|
||||
|
||||
@router.get("/generation/next", response_model=NextGenerationResponse)
|
||||
def get_next_generation(db: Session = Depends(get_db)):
|
||||
next_gen = game_service.get_next_generation(db=db)
|
||||
return NextGenerationResponse(next_generation=next_gen)
|
||||
|
||||
@router.get("/npc-dialogue", response_model=DialogueResponse)
|
||||
def get_npc_dialogue(current_generation: int = Query(..., description="현재 플레이어 세대"), db: Session = Depends(get_db)):
|
||||
# 1세대일 때는 기본 설정 대사 즉시 리턴 (선조 사망 기록이 존재하지 않으므로)
|
||||
if current_generation == 1:
|
||||
initial_dialogue = "이 던전에는 온갖 무시무시한 몬스터들이 가득하다. 풋내기 1세손아, 목숨이 아깝거든 바짝 긴장하고 들어가거라."
|
||||
return DialogueResponse(dialogue=initial_dialogue)
|
||||
|
||||
# 1. 캐시 테이블에서 기생성된 대사 조회
|
||||
from backend.repository.models import DialogueCache
|
||||
cached = db.query(DialogueCache).filter(DialogueCache.generation == current_generation).first()
|
||||
if cached:
|
||||
print(f"[Cache Hit] {current_generation}대 조언 대사를 캐시에서 즉시 반환합니다.")
|
||||
return DialogueResponse(dialogue=cached.dialogue)
|
||||
|
||||
# 2. 캐시 미스 시 Fallback 실시간 생성
|
||||
print(f"[Cache Miss] {current_generation}대 조언 대사 실시간 생성을 수행합니다. (지연 발생)")
|
||||
dialogue_text = game_service.generate_npc_dialogue(db=db, current_generation=current_generation)
|
||||
return DialogueResponse(dialogue=dialogue_text)
|
||||
|
||||
# 데이터베이스 전체 초기화 API (데이터 비우기 + ID 1번 리셋)
|
||||
from sqlalchemy import text
|
||||
@router.post("/reset")
|
||||
def reset_database(db: Session = Depends(get_db)):
|
||||
try:
|
||||
db.execute(text("SET FOREIGN_KEY_CHECKS = 0;"))
|
||||
db.execute(text("TRUNCATE TABLE ancestor_deaths;"))
|
||||
db.execute(text("TRUNCATE TABLE dialogue_caches;"))
|
||||
db.execute(text("SET FOREIGN_KEY_CHECKS = 1;"))
|
||||
db.commit()
|
||||
return {"status": "success", "message": "데이터베이스 및 ID 자동 증가 값이 초기화되었습니다."}
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
from fastapi import HTTPException
|
||||
raise HTTPException(status_code=500, detail=f"데이터베이스 초기화 에러: {e}")
|
||||
|
||||
@router.post("/generate-skill", response_model=SkillCreateResponse)
|
||||
def create_skill(req: SkillCreateRequest):
|
||||
return game_service.generate_ai_skill(prompt=req.prompt, player_level=req.player_level)
|
||||
|
||||
Reference in New Issue
Block a user