ssf-2025-ana/Backend/router/endpoints/user.py
2025-09-13 16:18:28 +09:00

116 lines
3.6 KiB
Python

from typing import List
from fastapi import APIRouter, HTTPException, status, UploadFile, File, Depends
from Backend.schemas.user import UserCreate, UserLogin, UserResponse, User, UserUpdate
from Backend.services.user_service import UserService
from Backend.core.security import create_access_token, get_current_user
router = APIRouter(prefix="/user", tags=["user"])
user_service = UserService()
@router.post(
"/register", response_model=UserResponse, status_code=status.HTTP_201_CREATED
)
async def register_user(
user_data: UserCreate = Depends(UserCreate.as_form),
profile_file: UploadFile = File(default=None),
) -> UserResponse:
existing_user = await user_service.get_user_by_username
if existing_user:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Username already registered"
)
existing_email = await user_service.get_user_by_email(user_data.email)
if existing_email:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Email already registered"
)
try:
user = await user_service.create_user(user_data, profile_file)
return user.to_response()
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Failed to created user: {str(e)}"
)
@router.post("/login")
async def login_user(login_data: UserLogin) -> dict:
user = await user_service.authenticate_user(
login_data.username, login_data.password
)
if not user:
raise HTTPException(
status_code=
detail=
)
if not user.is_active:
raise HTTPException(
status_code=, detail=""
)
access_token =
return {"access_token": access_token, "token_type": "bearer"}
@router.get("/profile/{username}", response_model=UserResponse)
async def get_user_profile(username: str) -> UserResponse:
user = await user_service.get_user_by_username(username)
if not user:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="User not found"
)
return user.to_response()
@router.get("/me", response_model=UserResponse)
async def get_user_me(user: User = Depends(get_current_user)) -> UserResponse:
return user.to_response()
@router.delete("/{username}")
async def delete_user(username: str) -> dict:
is_success = await user_service.delete_user(username)
if not is_success:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="User not found"
)
return {"detail": "User deleted"}
@router.get("/find/{username}", response_model=List[UserResponse])
async def find_user(username: str) -> List[UserResponse]:
users = await user_service.find_user(username)
return users
@router.put("/", response_model=UserResponse)
async def update_user(
current_user: User = Depends(get_current_user),
user_data: UserUpdate = Depends(UserUpdate.as_form),
profile_file: UploadFile = File(default=None),
) -> UserResponse:
try:
updated_user = await user_service.update_user(
user=current_user, user_data=user_data, profile_file=profile_file
)
return updated_user.to_response()
except ValueError as e:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e))
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Failed to update user: {str(e)}",
)