2025-05-30 20:35:55 +00:00

126 lines
3.2 KiB
Python

"""
User service for managing user operations
"""
from typing import Optional, List, Dict, Any, Union
from sqlalchemy.orm import Session
from app import models, schemas
from app.core.security import get_password_hash, verify_password
def get_by_email(db: Session, email: str) -> Optional[models.User]:
"""
Get a user by email
"""
return db.query(models.User).filter(models.User.email == email).first()
def get_by_username(db: Session, username: str) -> Optional[models.User]:
"""
Get a user by username
"""
return db.query(models.User).filter(models.User.username == username).first()
def get(db: Session, user_id: int) -> Optional[models.User]:
"""
Get a user by ID
"""
return db.query(models.User).filter(models.User.id == user_id).first()
def get_multi(
db: Session, *, skip: int = 0, limit: int = 100
) -> List[models.User]:
"""
Get multiple users
"""
return db.query(models.User).offset(skip).limit(limit).all()
def create(db: Session, *, obj_in: schemas.UserCreate) -> models.User:
"""
Create a new user
"""
db_obj = models.User(
email=obj_in.email,
username=obj_in.username,
hashed_password=get_password_hash(obj_in.password),
first_name=obj_in.first_name,
last_name=obj_in.last_name,
target_calories=obj_in.target_calories,
height_cm=obj_in.height_cm,
weight_kg=obj_in.weight_kg,
date_of_birth=obj_in.date_of_birth,
gender=obj_in.gender,
is_superuser=obj_in.is_superuser,
)
db.add(db_obj)
db.commit()
db.refresh(db_obj)
return db_obj
def update(
db: Session, *, db_obj: models.User, obj_in: Union[schemas.UserUpdate, Dict[str, Any]]
) -> models.User:
"""
Update a user
"""
if isinstance(obj_in, dict):
update_data = obj_in
else:
update_data = obj_in.model_dump(exclude_unset=True)
if update_data.get("password"):
hashed_password = get_password_hash(update_data["password"])
del update_data["password"]
update_data["hashed_password"] = hashed_password
for field in update_data:
if hasattr(db_obj, field):
setattr(db_obj, field, update_data[field])
db.add(db_obj)
db.commit()
db.refresh(db_obj)
return db_obj
def delete(db: Session, *, user_id: int) -> models.User:
"""
Delete a user
"""
user = db.query(models.User).filter(models.User.id == user_id).first()
db.delete(user)
db.commit()
return user
def authenticate(db: Session, *, email_or_username: str, password: str) -> Optional[models.User]:
"""
Authenticate a user with email/username and password
"""
user = get_by_email(db, email=email_or_username)
if not user:
user = get_by_username(db, username=email_or_username)
if not user:
return None
if not verify_password(password, user.hashed_password):
return None
return user
def is_active(user: models.User) -> bool:
"""
Check if a user is active
"""
return user.is_active
def is_superuser(user: models.User) -> bool:
"""
Check if a user is a superuser
"""
return user.is_superuser