sukjenogi-backend/app/api/character.py
2025-05-26 18:17:18 +09:00

110 lines
3.8 KiB
Python

from typing import List
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from app.schemas.character import CharacterCreate, CharacterResponse, CharacterUpdateRequest, CharacterDetailResponse
from app.schemas.homework import HomeworkSelectableResponse
from app.crud.character import create_character, get_characters_by_user
from app.services.character_homework_service import get_homeworks_with_assignment_status, assign_homework_to_character, unassign_homework_from_character
from app.models.user import User
from app.models.character import Character
from app.core.deps import get_db, get_current_user
router = APIRouter()
@router.post("", response_model=CharacterResponse)
def register_character(
character_data: CharacterCreate,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
return create_character(current_user.id, character_data, db)
@router.get("", response_model=List[CharacterResponse])
def list_my_characters(
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
return get_characters_by_user(current_user.id, db)
@router.get("/{character_id}/homeworks/selectable", response_model=List[HomeworkSelectableResponse])
def get_selectable_homeworks(
character_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
character = db.query(Character).filter_by(id=character_id, user_id=current_user.id).first()
if not character:
raise HTTPException(status_code=404, detail="캐릭터를 찾을 수 없습니다.")
return get_homeworks_with_assignment_status(db, current_user.id, character_id)
@router.post("/{character_id}/homeworks/{homework_type_id}")
def assign_homework(
character_id: int,
homework_type_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
return assign_homework_to_character(db, current_user.id, character_id, homework_type_id)
@router.delete("/{character_id}/homeworks/{homework_type_id}")
def unassign_homework(
character_id: int,
homework_type_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
return unassign_homework_from_character(db, current_user.id, character_id, homework_type_id)
@router.put("/{character_id}")
def update_character(
character_id: int,
req: CharacterUpdateRequest,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
character = db.query(Character).filter(Character.id == character_id).first()
if not character or character.user_id != current_user.id:
raise HTTPException(status_code=403, detail="권한이 없습니다.")
character.name = req.name
character.server = req.server
character.power = req.power
db.commit()
return {"message": "캐릭터가 수정되었습니다."}
@router.delete("/{character_id}")
def delete_character(
character_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
character = db.query(Character).filter(Character.id == character_id).first()
if not character or character.user_id != current_user.id:
raise HTTPException(status_code=403, detail="권한이 없습니다.")
db.delete(character)
db.commit()
return {"message": "캐릭터가 삭제되었습니다."}
@router.get("/{character_id}", response_model=CharacterDetailResponse)
def get_character(
character_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
current_user = db.merge(current_user)
character = db.query(Character).filter(Character.id == character_id).first()
if not character or character.user_id != current_user.id:
raise HTTPException(status_code=403, detail="권한이 없습니다.")
return character