from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from pydantic import BaseModel, ConfigDict, EmailStr from typing import List, Optional import uuid from app.core.database import get_db from app.core.security import security from app.models.user import User, UserRole from app.api import deps router = APIRouter() class UserBase(BaseModel): email: EmailStr first_name: str last_name: str role: UserRole is_active: bool = True tenant_id: Optional[uuid.UUID] = None class UserCreate(UserBase): password: str class UserUpdate(BaseModel): email: Optional[EmailStr] = None first_name: Optional[str] = None last_name: Optional[str] = None role: Optional[UserRole] = None is_active: Optional[bool] = None password: Optional[str] = None # Optional password update class UserResponse(UserBase): id: uuid.UUID model_config = ConfigDict(from_attributes=True) @router.get("/", response_model=List[UserResponse]) async def read_users( skip: int = 0, limit: int = 100, db: AsyncSession = Depends(get_db), current_user = Depends(deps.get_current_active_superuser) ): query = select(User).offset(skip).limit(limit) result = await db.execute(query) return result.scalars().all() @router.post("/", response_model=UserResponse) async def create_user( user: UserCreate, db: AsyncSession = Depends(get_db), current_user = Depends(deps.get_current_active_superuser) ): query = select(User).where(User.email == user.email) result = await db.execute(query) if result.scalar_one_or_none(): raise HTTPException(status_code=400, detail="Email already registered") user_data = user.model_dump(exclude={"password"}) password_hash = security.get_password_hash(user.password) db_user = User(**user_data, password_hash=password_hash) db.add(db_user) await db.commit() await db.refresh(db_user) return db_user