user_service.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # app/services/user_service.py
  2. from datetime import datetime
  3. from typing import List
  4. from sqlalchemy.orm import Session
  5. from app.utils.search import apply_keyword_search
  6. from app.utils.pagination import paginate
  7. from app.core.biz_exception import NotFoundError, PermissionDeniedError, BizLogicError
  8. from app.models.user import VasUser
  9. from app.schemas.user import VasUserCreate, VasUserUpdate, VasUserSetProfiles, VasUserOut
  10. class UserService:
  11. @staticmethod
  12. def create(db: Session, data: VasUserCreate):
  13. uid = f'usr-{uuid.uuid4().hex[:8]}'
  14. user = VasUser(
  15. id=uid,
  16. role=data.role,
  17. nickname=data.nickname,
  18. phone=data.phone,
  19. preferred_language="en",
  20. timezone="Asia/Shanghai",
  21. )
  22. db.add(user)
  23. db.commit()
  24. return rec
  25. @staticmethod
  26. def get(db: Session, id: str):
  27. user = db.query(VasUser).filter_by(id=id).first()
  28. if not user:
  29. raise NotFoundError("User not exist")
  30. return user
  31. @staticmethod
  32. def update(db: Session, id: str, payload: VasUserUpdate):
  33. obj = db.query(VasUser).filter(VasUser.id == id).first()
  34. if not obj:
  35. raise NotFoundError("User not exist")
  36. data = payload.dict(exclude_unset=True) # ⭐ 关键
  37. for key, value in data.items():
  38. setattr(obj, key, value)
  39. db.commit()
  40. db.refresh(obj)
  41. return obj
  42. @staticmethod
  43. def set_profiles(db: Session, user: VasUser, payload: VasUserSetProfiles):
  44. """
  45. 更新用户资料(profile)
  46. """
  47. # 1️⃣ 字段赋值(显式,避免误更新)
  48. user.phone = payload.phone
  49. user.nickname = payload.nickname
  50. user.avatar_url = payload.avatar_url
  51. # 2️⃣ 更新时间(可选,SQLAlchemy onupdate 也会生效)
  52. user.updated_at = datetime.utcnow()
  53. # 3️⃣ 持久化
  54. db.add(user)
  55. db.commit()
  56. db.refresh(user)
  57. return user
  58. @staticmethod
  59. def list_all(db: Session, page: int = 1, size: int = 20, keyword: str=None):
  60. query = db.query(VasUser)
  61. query = apply_keyword_search(
  62. query=query,
  63. model=VasUser,
  64. keyword=keyword,
  65. fields=["id", "email", "nickname", "phone"]
  66. )
  67. return paginate(query, page, size)