🔧 chore(users.py): refactor and improve code readability in users.py
✨ feat(users.py): add docstrings to API endpoints for better documentation 🔥 chore(users.py): remove unnecessary code and comments 🐛 fix(users.py): fix return type hints in API endpoints
This commit is contained in:
parent
0a5026a6ed
commit
580b439b80
1 changed files with 49 additions and 42 deletions
|
|
@ -1,8 +1,10 @@
|
||||||
|
from typing import List
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
from sqlmodel import Session, select
|
|
||||||
from datetime import timezone, datetime
|
from datetime import timezone, datetime
|
||||||
|
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
from fastapi import APIRouter, Depends, HTTPException
|
from fastapi import APIRouter, Depends, HTTPException
|
||||||
|
from sqlmodel import Session, select
|
||||||
|
|
||||||
from langflow.services.utils import get_session
|
from langflow.services.utils import get_session
|
||||||
from langflow.auth.auth import get_current_active_user, get_password_hash
|
from langflow.auth.auth import get_current_active_user, get_password_hash
|
||||||
|
|
@ -18,55 +20,62 @@ from langflow.database.models.user import (
|
||||||
router = APIRouter(tags=["Login"])
|
router = APIRouter(tags=["Login"])
|
||||||
|
|
||||||
|
|
||||||
@router.get("/user", response_model=UserListModel)
|
|
||||||
def read_current_user(current_user: User = Depends(get_current_active_user)):
|
|
||||||
return current_user
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/users")
|
|
||||||
def read_all_users(
|
|
||||||
skip: int = 0,
|
|
||||||
limit: int = 10,
|
|
||||||
_: Session = Depends(get_current_active_user),
|
|
||||||
db: Session = Depends(get_session),
|
|
||||||
):
|
|
||||||
query = select(User)
|
|
||||||
query = query.offset(skip).limit(limit)
|
|
||||||
|
|
||||||
return db.execute(query).fetchall()
|
|
||||||
|
|
||||||
|
|
||||||
@router.post("/user", response_model=UserListModel)
|
@router.post("/user", response_model=UserListModel)
|
||||||
def add_user(
|
def add_user(
|
||||||
user: UserAddModel,
|
user: UserAddModel,
|
||||||
_: Session = Depends(get_current_active_user),
|
_: Session = Depends(get_current_active_user),
|
||||||
db: Session = Depends(get_session),
|
db: Session = Depends(get_session),
|
||||||
):
|
) -> User:
|
||||||
|
"""
|
||||||
|
Add a new user to the database.
|
||||||
|
"""
|
||||||
new_user = User(**user.dict())
|
new_user = User(**user.dict())
|
||||||
try:
|
try:
|
||||||
new_user.password = get_password_hash(user.password)
|
new_user.password = get_password_hash(user.password)
|
||||||
|
|
||||||
db.add(new_user)
|
db.add(new_user)
|
||||||
db.commit()
|
db.commit()
|
||||||
db.refresh(new_user)
|
db.refresh(new_user)
|
||||||
except IntegrityError as e:
|
except IntegrityError as e:
|
||||||
db.rollback()
|
db.rollback()
|
||||||
|
raise HTTPException(status_code=400, detail="User exists") from e
|
||||||
raise HTTPException(
|
|
||||||
status_code=400,
|
|
||||||
detail="User exists",
|
|
||||||
) from e
|
|
||||||
|
|
||||||
return new_user
|
return new_user
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/user", response_model=UserListModel)
|
||||||
|
def read_current_user(current_user: User = Depends(get_current_active_user)) -> User:
|
||||||
|
"""
|
||||||
|
Retrieve the current user's data.
|
||||||
|
"""
|
||||||
|
return current_user
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/users", response_model=List[UserListModel])
|
||||||
|
def read_all_users(
|
||||||
|
skip: int = 0,
|
||||||
|
limit: int = 10,
|
||||||
|
_: Session = Depends(get_current_active_user),
|
||||||
|
db: Session = Depends(get_session),
|
||||||
|
) -> List[UserListModel]:
|
||||||
|
"""
|
||||||
|
Retrieve a list of users from the database with pagination.
|
||||||
|
"""
|
||||||
|
query = select(User).offset(skip).limit(limit)
|
||||||
|
users = db.execute(query).fetchall()
|
||||||
|
|
||||||
|
return [UserListModel(**dict(user.User)) for user in users]
|
||||||
|
|
||||||
|
|
||||||
@router.patch("/user/{user_id}", response_model=UserListModel)
|
@router.patch("/user/{user_id}", response_model=UserListModel)
|
||||||
def update_user(
|
def update_user(
|
||||||
user_id: UUID,
|
user_id: UUID,
|
||||||
user: UserPatchModel,
|
user: UserPatchModel,
|
||||||
_: Session = Depends(get_current_active_user),
|
_: Session = Depends(get_current_active_user),
|
||||||
db: Session = Depends(get_session),
|
db: Session = Depends(get_session),
|
||||||
):
|
) -> User:
|
||||||
|
"""
|
||||||
|
Update an existing user's data.
|
||||||
|
"""
|
||||||
user_db = get_user_by_username(db, user.username)
|
user_db = get_user_by_username(db, user.username)
|
||||||
if user_db and user_db.id != user_id:
|
if user_db and user_db.id != user_id:
|
||||||
raise HTTPException(status_code=409, detail="Username already exists")
|
raise HTTPException(status_code=409, detail="Username already exists")
|
||||||
|
|
@ -77,24 +86,17 @@ def update_user(
|
||||||
|
|
||||||
try:
|
try:
|
||||||
user_data = user.dict(exclude_unset=True)
|
user_data = user.dict(exclude_unset=True)
|
||||||
|
|
||||||
for key, value in user_data.items():
|
for key, value in user_data.items():
|
||||||
setattr(user_db, key, value)
|
setattr(user_db, key, value)
|
||||||
|
|
||||||
user_db.updated_at = datetime.now(timezone.utc)
|
user_db.updated_at = datetime.now(timezone.utc)
|
||||||
user_db = db.merge(user_db)
|
user_db = db.merge(user_db)
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
if db.identity_key(instance=user_db) is not None:
|
if db.identity_key(instance=user_db) is not None:
|
||||||
db.refresh(user_db)
|
db.refresh(user_db)
|
||||||
except IntegrityError as e:
|
except IntegrityError as e:
|
||||||
db.rollback()
|
db.rollback()
|
||||||
|
raise HTTPException(status_code=400, detail=str(e)) from e
|
||||||
raise HTTPException(
|
|
||||||
status_code=400,
|
|
||||||
detail=str(e),
|
|
||||||
) from e
|
|
||||||
|
|
||||||
return user_db
|
return user_db
|
||||||
|
|
||||||
|
|
@ -104,7 +106,10 @@ def delete_user(
|
||||||
user_id: UUID,
|
user_id: UUID,
|
||||||
_: Session = Depends(get_current_active_user),
|
_: Session = Depends(get_current_active_user),
|
||||||
db: Session = Depends(get_session),
|
db: Session = Depends(get_session),
|
||||||
):
|
) -> dict:
|
||||||
|
"""
|
||||||
|
Delete a user from the database.
|
||||||
|
"""
|
||||||
user_db = db.query(User).filter(User.id == user_id).first()
|
user_db = db.query(User).filter(User.id == user_id).first()
|
||||||
if not user_db:
|
if not user_db:
|
||||||
raise HTTPException(status_code=404, detail="User not found")
|
raise HTTPException(status_code=404, detail="User not found")
|
||||||
|
|
@ -117,20 +122,22 @@ def delete_user(
|
||||||
|
|
||||||
# TODO: REMOVE - Just for testing purposes
|
# TODO: REMOVE - Just for testing purposes
|
||||||
@router.post("/super_user", response_model=User)
|
@router.post("/super_user", response_model=User)
|
||||||
def add_super_user_to_testing_purposes(db: Session = Depends(get_session)):
|
def add_super_user_for_testing_purposes_delete_me_before_merge_into_dev(
|
||||||
|
db: Session = Depends(get_session),
|
||||||
|
) -> User:
|
||||||
|
"""
|
||||||
|
Add a superuser for testing purposes.
|
||||||
|
(This should be removed in production)
|
||||||
|
"""
|
||||||
new_user = User(username="superuser", password="12345", is_superuser=True)
|
new_user = User(username="superuser", password="12345", is_superuser=True)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
new_user.password = get_password_hash(new_user.password)
|
new_user.password = get_password_hash(new_user.password)
|
||||||
|
|
||||||
db.add(new_user)
|
db.add(new_user)
|
||||||
db.commit()
|
db.commit()
|
||||||
db.refresh(new_user)
|
db.refresh(new_user)
|
||||||
except IntegrityError as e:
|
except IntegrityError as e:
|
||||||
db.rollback()
|
db.rollback()
|
||||||
raise HTTPException(
|
raise HTTPException(status_code=400, detail="User exists") from e
|
||||||
status_code=400,
|
|
||||||
detail="User exists",
|
|
||||||
) from e
|
|
||||||
|
|
||||||
return new_user
|
return new_user
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue