fastapi-demo/app/services/user_service.py

91 lines
3.1 KiB
Python

from typing import List, Optional
from sqlalchemy.orm import Session
from sqlalchemy.exc import IntegrityError
from fastapi import HTTPException
from app.database.models import User
from app.schemas.user import UserCreate, UserUpdate
class UserService:
@staticmethod
def get_all_users(db: Session) -> List[User]:
"""获取所有用户"""
return db.query(User).all()
@staticmethod
def get_user_by_id(db: Session, user_id: int) -> Optional[User]:
"""根据ID获取用户"""
return db.query(User).filter(User.id == user_id).first()
@staticmethod
def create_user(db: Session, user_data: UserCreate) -> User:
"""创建新用户"""
try:
db_user = User(
username=user_data.username,
email=user_data.email,
full_name=user_data.full_name
)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
except IntegrityError as e:
db.rollback()
error_msg = str(e.orig)
if "username" in error_msg:
raise HTTPException(status_code=409, detail="Username already exists")
elif "email" in error_msg:
raise HTTPException(status_code=409, detail="Email already exists")
else:
raise HTTPException(status_code=409, detail="Data conflict")
except Exception as e:
db.rollback()
raise HTTPException(status_code=500, detail="Internal server error")
@staticmethod
def update_user(db: Session, user_id: int, user_data: UserUpdate) -> Optional[User]:
"""更新用户信息"""
try:
db_user = db.query(User).filter(User.id == user_id).first()
if not db_user:
return None
update_data = user_data.model_dump(exclude_unset=True)
for field, value in update_data.items():
setattr(db_user, field, value)
db.commit()
db.refresh(db_user)
return db_user
except IntegrityError as e:
db.rollback()
error_msg = str(e.orig)
if "username" in error_msg:
raise HTTPException(status_code=409, detail="Username already exists")
elif "email" in error_msg:
raise HTTPException(status_code=409, detail="Email already exists")
else:
raise HTTPException(status_code=409, detail="Data conflict")
except Exception as e:
db.rollback()
raise HTTPException(status_code=500, detail="Internal server error")
@staticmethod
def delete_user(db: Session, user_id: int) -> bool:
"""删除用户"""
try:
db_user = db.query(User).filter(User.id == user_id).first()
if not db_user:
return False
db.delete(db_user)
db.commit()
return True
except Exception as e:
db.rollback()
raise HTTPException(status_code=500, detail="Internal server error")
user_service = UserService()