76 lines
2.6 KiB
Python
76 lines
2.6 KiB
Python
# app/api/user.py
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status, Query
|
|
from fastapi.logger import logger
|
|
import traceback
|
|
import sys
|
|
from sqlalchemy.orm import Session
|
|
from app.schemas.user import UserCreate, UserResponse, PasswordUpdateRequest, UserPublicInfoResponse, UserByCharacterResponse
|
|
from app.crud.user import create_user
|
|
from app.models.user import User
|
|
from app.core.database import SessionLocal
|
|
from app.core.deps import get_current_user
|
|
from app.core.security import verify_password, get_password_hash
|
|
from app.services import user_service
|
|
|
|
router = APIRouter()
|
|
|
|
# DB 세션 주입 함수
|
|
def get_db():
|
|
db = SessionLocal()
|
|
try:
|
|
yield db
|
|
finally:
|
|
db.close()
|
|
|
|
@router.post("/", response_model=UserResponse)
|
|
def register_user(user_create: UserCreate, db: Session = Depends(get_db)):
|
|
return create_user(db, user_create)
|
|
|
|
@router.get("/me", response_model=UserResponse)
|
|
def get_my_profile(current_user: User = Depends(get_current_user)):
|
|
return current_user
|
|
|
|
@router.put("/me/password", status_code=204)
|
|
def update_password(
|
|
pw_req: PasswordUpdateRequest,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user)
|
|
):
|
|
try:
|
|
if not verify_password(pw_req.current_password, current_user.password_hash):
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="현재 비밀번호가 일치하지 않습니다."
|
|
)
|
|
|
|
print("기존:", current_user.password_hash)
|
|
print("신규:", get_password_hash(pw_req.new_password))
|
|
|
|
current_user = db.merge(current_user) # 세션에 붙임
|
|
current_user.password_hash = get_password_hash(pw_req.new_password)
|
|
db.flush()
|
|
db.expunge(current_user)
|
|
print("✅ flush 완료됨. 커밋 시도 중...")
|
|
db.commit()
|
|
print("✅ 커밋 완료됨.")
|
|
except Exception as e:
|
|
logger.error(f"❌ 비밀번호 변경 중 예외 발생: {e}")
|
|
traceback.print_exc(file=sys.stdout) # ← 여기가 핵심
|
|
raise
|
|
|
|
@router.get("/public-info", response_model=UserPublicInfoResponse)
|
|
def get_public_info(
|
|
email: str = Query(...),
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user)
|
|
):
|
|
return user_service.get_user_public_info(db, current_user.id, email)
|
|
|
|
@router.get("/by-character", response_model=UserByCharacterResponse)
|
|
def get_by_character(
|
|
server: str,
|
|
name: str,
|
|
db: Session = Depends(get_db)
|
|
):
|
|
return user_service.get_user_by_character(db, server, name) |