mirror of
https://github.com/zylon-ai/private-gpt.git
synced 2025-12-22 20:12:55 +01:00
165 lines
No EOL
4.6 KiB
Python
165 lines
No EOL
4.6 KiB
Python
from typing import Any, List
|
|
|
|
from private_gpt.users import crud, models, schemas
|
|
from private_gpt.users.api import deps
|
|
from private_gpt.users.constants.role import Role
|
|
from private_gpt.users.core.config import settings
|
|
from fastapi import APIRouter, Body, Depends, HTTPException, Security
|
|
from fastapi.encoders import jsonable_encoder
|
|
from pydantic.networks import EmailStr
|
|
from sqlalchemy.orm import Session
|
|
|
|
router = APIRouter(prefix="/users", tags=["users"])
|
|
|
|
|
|
@router.get("", response_model=List[schemas.User])
|
|
def read_users(
|
|
db: Session = Depends(deps.get_db),
|
|
skip: int = 0,
|
|
limit: int = 100,
|
|
# current_user: models.User = Security(
|
|
# deps.get_current_active_user,
|
|
# scopes=[Role.ADMIN["name"], Role.SUPER_ADMIN["name"]],
|
|
# ),
|
|
) -> Any:
|
|
"""
|
|
Retrieve all users.
|
|
"""
|
|
users = crud.user.get_multi(db, skip=skip, limit=limit,)
|
|
return users
|
|
|
|
|
|
@router.post("", response_model=schemas.User)
|
|
def create_user(
|
|
*,
|
|
db: Session = Depends(deps.get_db),
|
|
user_in: schemas.UserCreate,
|
|
current_user: models.User = Security(
|
|
deps.get_current_active_user,
|
|
scopes=[Role.ADMIN["name"], Role.SUPER_ADMIN["name"]],
|
|
),
|
|
) -> Any:
|
|
"""
|
|
Create new user.
|
|
"""
|
|
user = crud.user.get_by_email(db, email=user_in.email)
|
|
if user:
|
|
raise HTTPException(
|
|
status_code=409,
|
|
detail="The user with this username already exists in the system.",
|
|
)
|
|
user = crud.user.create(db, obj_in=user_in)
|
|
return user
|
|
|
|
|
|
@router.put("/me", response_model=schemas.User)
|
|
def update_user_me(
|
|
*,
|
|
db: Session = Depends(deps.get_db),
|
|
fullname: str = Body(None),
|
|
phone_number: str = Body(None),
|
|
email: EmailStr = Body(None),
|
|
current_user: models.User = Depends(deps.get_current_active_user),
|
|
) -> Any:
|
|
"""
|
|
Update own user.
|
|
"""
|
|
current_user_data = jsonable_encoder(current_user)
|
|
user_in = schemas.UserUpdate(**current_user_data)
|
|
if phone_number is not None:
|
|
user_in.phone_number = phone_number
|
|
if fullname is not None:
|
|
user_in.fullname = fullname
|
|
if email is not None:
|
|
user_in.email = email
|
|
user = crud.user.update(db, db_obj=current_user, obj_in=user_in)
|
|
return user
|
|
|
|
|
|
@router.get("/me", response_model=schemas.User)
|
|
def read_user_me(
|
|
db: Session = Depends(deps.get_db),
|
|
current_user: models.User = Depends(deps.get_current_active_user),
|
|
) -> Any:
|
|
"""
|
|
Get current user.
|
|
"""
|
|
if not current_user.user_role:
|
|
role = None
|
|
else:
|
|
role = current_user.user_role.role.name
|
|
user_data = schemas.User(
|
|
id=current_user.id,
|
|
email=current_user.email,
|
|
is_active=current_user.is_active,
|
|
fullname=current_user.fullname,
|
|
created_at=current_user.created_at,
|
|
updated_at=current_user.updated_at,
|
|
role=role,
|
|
)
|
|
return user_data
|
|
|
|
|
|
@router.get("/me/change-password", response_model=schemas.User)
|
|
def read_user_me(
|
|
db: Session = Depends(deps.get_db),
|
|
current_user: models.User = Depends(deps.get_current_active_user),
|
|
old_password: str = Body(None),
|
|
new_password: str = Body(None),
|
|
) -> Any:
|
|
"""
|
|
Get current user.
|
|
"""
|
|
if not current_user.user_role:
|
|
role = None
|
|
else:
|
|
role = current_user.user_role.role.name
|
|
user_data = schemas.User(
|
|
id=current_user.id,
|
|
email=current_user.email,
|
|
is_active=current_user.is_active,
|
|
fullname=current_user.fullname,
|
|
created_at=current_user.created_at,
|
|
updated_at=current_user.updated_at,
|
|
role=role,
|
|
)
|
|
return user_data
|
|
|
|
@router.get("/{user_id}", response_model=schemas.User)
|
|
def read_user_by_id(
|
|
user_id: int,
|
|
current_user: models.User = Security(
|
|
deps.get_current_active_user,
|
|
scopes=[Role.ADMIN["name"], Role.SUPER_ADMIN["name"]],
|
|
),
|
|
db: Session = Depends(deps.get_db),
|
|
) -> Any:
|
|
"""
|
|
Get a specific user by id.
|
|
"""
|
|
user = crud.user.get(db, id=user_id)
|
|
return user
|
|
|
|
|
|
@router.put("/{user_id}", response_model=schemas.User)
|
|
def update_user(
|
|
*,
|
|
db: Session = Depends(deps.get_db),
|
|
user_id: int,
|
|
user_in: schemas.UserUpdate,
|
|
current_user: models.User = Security(
|
|
deps.get_current_active_user,
|
|
scopes=[Role.ADMIN["name"], Role.SUPER_ADMIN["name"]],
|
|
),
|
|
) -> Any:
|
|
"""
|
|
Update a user.
|
|
"""
|
|
user = crud.user.get(db, id=user_id)
|
|
if not user:
|
|
raise HTTPException(
|
|
status_code=404,
|
|
detail="The user with this username does not exist in the system",
|
|
)
|
|
user = crud.user.update(db, db_obj=user, obj_in=user_in)
|
|
return user |