2025-12-10 12:02:17 +08:00

62 lines
2.4 KiB
Python

from typing import List
from fastapi import APIRouter, Depends, HTTPException, Request, status
from sqlalchemy.ext.asyncio import AsyncSession
from backend.api.deps import AuthUser, get_current_user, require_roles
from backend.db.session import get_session
from backend.modules.users.models import RoleName
from backend.modules.users.schemas import UserCreate, UserOut, UserUpdate
from backend.modules.users.service import create_user, list_users, update_user, delete_user
router = APIRouter(prefix="/api/v1/users", tags=["users"])
@router.get("", response_model=List[UserOut])
async def get_users(
session: AsyncSession = Depends(get_session),
auth_user: AuthUser = Depends(require_roles([RoleName.ADMIN, RoleName.CUSTOMER_ADMIN])),
) -> List[UserOut]:
users = await list_users(session, None if auth_user.role_name == RoleName.ADMIN.value else auth_user.customer_id)
return [UserOut.model_validate(u) for u in users]
@router.post("", response_model=UserOut, status_code=status.HTTP_201_CREATED)
async def create_user_endpoint(
payload: UserCreate,
session: AsyncSession = Depends(get_session),
auth_user: AuthUser = Depends(require_roles([RoleName.ADMIN, RoleName.CUSTOMER_ADMIN])),
) -> UserOut:
customer_id = payload.customer_id if auth_user.role_name == RoleName.ADMIN.value else auth_user.customer_id
user = await create_user(
session,
username=payload.username,
email=payload.email,
password=payload.password,
role_id=payload.role_id,
customer_id=customer_id,
actor=auth_user.user,
)
return UserOut.model_validate(user)
@router.put("/{user_id}", response_model=UserOut)
async def update_user_endpoint(
user_id: int,
payload: UserUpdate,
session: AsyncSession = Depends(get_session),
auth_user: AuthUser = Depends(require_roles([RoleName.ADMIN, RoleName.CUSTOMER_ADMIN])),
) -> UserOut:
update_data = payload.model_dump(exclude_unset=True)
user = await update_user(session, user_id, update_data, auth_user.user)
return UserOut.model_validate(user)
@router.delete("/{user_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_user_endpoint(
user_id: int,
session: AsyncSession = Depends(get_session),
auth_user: AuthUser = Depends(require_roles([RoleName.ADMIN, RoleName.CUSTOMER_ADMIN])),
):
await delete_user(session, user_id, auth_user.user)