| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- # app/services/user_service.py
- from datetime import datetime
- from typing import List
- from sqlalchemy.orm import Session
- from app.utils.search import apply_keyword_search
- from app.utils.pagination import paginate
- from app.core.biz_exception import NotFoundError, PermissionDeniedError, BizLogicError
- from app.models.user import VasUser
- from app.schemas.user import VasUserCreate, VasUserUpdate, VasUserSetProfiles, VasUserOut
- class UserService:
-
- @staticmethod
- def create(db: Session, data: VasUserCreate):
- uid = f'usr-{uuid.uuid4().hex[:8]}'
- user = VasUser(
- id=uid,
- role=data.role,
- nickname=data.nickname,
- phone=data.phone,
- preferred_language="en",
- timezone="Asia/Shanghai",
- )
- db.add(user)
- db.commit()
- return rec
-
- @staticmethod
- def get(db: Session, id: str):
- user = db.query(VasUser).filter_by(id=id).first()
- if not user:
- raise NotFoundError("User not exist")
- return user
-
- @staticmethod
- def update(db: Session, id: str, payload: VasUserUpdate):
- obj = db.query(VasUser).filter(VasUser.id == id).first()
- if not obj:
- raise NotFoundError("User not exist")
- data = payload.dict(exclude_unset=True) # ⭐ 关键
- for key, value in data.items():
- setattr(obj, key, value)
- db.commit()
- db.refresh(obj)
- return obj
-
- @staticmethod
- def set_profiles(db: Session, user: VasUser, payload: VasUserSetProfiles):
- """
- 更新用户资料(profile)
- """
- # 1️⃣ 字段赋值(显式,避免误更新)
- user.phone = payload.phone
- user.nickname = payload.nickname
- user.avatar_url = payload.avatar_url
- # 2️⃣ 更新时间(可选,SQLAlchemy onupdate 也会生效)
- user.updated_at = datetime.utcnow()
- # 3️⃣ 持久化
- db.add(user)
- db.commit()
- db.refresh(user)
- return user
- @staticmethod
- def list_all(db: Session, page: int = 1, size: int = 20, keyword: str=None):
- query = db.query(VasUser)
-
- query = apply_keyword_search(
- query=query,
- model=VasUser,
- keyword=keyword,
- fields=["id", "email", "nickname", "phone"]
- )
- return paginate(query, page, size)
|