from typing import Any, List from fastapi import APIRouter, Body, Depends, HTTPException from fastapi.encoders import jsonable_encoder from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from app.api import deps from app.core import security from app.db.session import get_db from app.models.user import User from app.schemas.user import User as UserSchema, UserCreate, UserUpdate router = APIRouter() @router.get("/", response_model=List[UserSchema]) async def read_users( db: AsyncSession = Depends(get_db), skip: int = 0, limit: int = 100, current_user: User = Depends(deps.get_current_user), ) -> Any: """ Retrieve users. """ result = await db.execute(select(User).offset(skip).limit(limit)) users = result.scalars().all() return users @router.post("/", response_model=UserSchema) async def create_user( *, db: AsyncSession = Depends(get_db), user_in: UserCreate, ) -> Any: """ Create new user. """ result = await db.execute(select(User).where(User.email == user_in.email)) user = result.scalars().first() if user: raise HTTPException( status_code=400, detail="The user with this username already exists in the system.", ) db_user = User( email=user_in.email, hashed_password=security.get_password_hash(user_in.password), full_name=user_in.full_name, is_active=user_in.is_active, is_superuser=user_in.is_superuser, ) db.add(db_user) await db.commit() await db.refresh(db_user) return db_user @router.get("/me", response_model=UserSchema) async def read_user_me( current_user: User = Depends(deps.get_current_user), ) -> Any: """ Get current user. """ return current_user