python-test/Module 5/routers/users.py

51 lines
1.4 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from typing import Sequence
from models.users import User
from schemas.users import UserOut, UserIn
from sqlalchemy.ext.asyncio import AsyncSession
from db.session import get_db
import services.users as user_service
from sqlalchemy.exc import IntegrityError
from core.security import hash_password, get_current_user
router = APIRouter(prefix="/users", tags=["users"])
@router.get("/me", response_model=UserOut)
async def get_self(user: User = Depends(get_current_user)):
return user
@router.get("/", response_model=list[UserOut])
async def get_users(db: AsyncSession = Depends(get_db)) -> Sequence[User]:
users = await user_service.get_users(db)
return users
@router.get("/{id}", response_model=UserOut)
async def get_user_by_id(id: int, db: AsyncSession = Depends(get_db)) -> User:
user = await user_service.get_user_by_id(id, db)
if user:
return user
else:
raise HTTPException(404, "User not found")
@router.post("/register", response_model=UserOut)
async def register(user: UserIn, db: AsyncSession = Depends(get_db)) -> User:
hashed = hash_password(user.password)
try:
new_user = await user_service.create_user(User(email=user.email, password = hashed), db)
return new_user
except IntegrityError:
await db.rollback()
raise HTTPException(400, f"User with email {user.email} is already exist...")