125 lines
4.3 KiB
Python
125 lines
4.3 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, CharacterOrderUpdate
|
|
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.combat_power = req.power
|
|
character.is_public = req.is_public
|
|
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
|
|
|
|
@router.patch("/order")
|
|
def update_character_order(
|
|
updates: List[CharacterOrderUpdate],
|
|
db: Session = Depends(get_db),
|
|
user = Depends(get_current_user),
|
|
):
|
|
for update in updates:
|
|
character = db.query(Character).filter_by(id=update.id, user_id=user.id).first()
|
|
if character:
|
|
character.order = update.order
|
|
db.add(character)
|
|
db.commit()
|
|
return {"status": "ok"} |