fastapi-demo/app/services/user_service.py

91 lines
3.1 KiB
Python
Raw Permalink Normal View History

from typing import List, Optional
2025-09-28 09:12:13 +08:00
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[type[User]]:
2025-09-28 09:12:13 +08:00
"""获取所有用户"""
return db.query(User).all()
@staticmethod
2025-09-28 09:12:13 +08:00
def get_user_by_id(db: Session, user_id: int) -> Optional[User]:
"""根据ID获取用户"""
return db.query(User).filter(User.id == user_id).first()
@staticmethod
2025-09-28 09:12:13 +08:00
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
2025-09-28 09:12:13 +08:00
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()