69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
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
|