68 lines
1.9 KiB
Python
68 lines
1.9 KiB
Python
from typing import Optional
|
|
from uuid import UUID
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from ..model.user import User
|
|
from ..core.security import get_password_hash
|
|
|
|
|
|
class UserService:
|
|
"""用户服务类,提供用户相关的业务逻辑操作"""
|
|
|
|
@staticmethod
|
|
async def get_user_by_email(email: str, session: AsyncSession) -> Optional[User]:
|
|
"""
|
|
根据邮箱地址查询用户
|
|
|
|
Args:
|
|
email: 用户的邮箱地址
|
|
session: 异步数据库会话
|
|
|
|
Returns:
|
|
如果找到则返回用户对象,否则返回None
|
|
"""
|
|
result = await session.execute(select(User).where(User.email == email)) # type: ignore
|
|
return result.scalar_one_or_none()
|
|
|
|
@staticmethod
|
|
async def get_user_by_id(user_id: UUID, session: AsyncSession) -> Optional[User]:
|
|
"""
|
|
根据用户ID查询用户
|
|
|
|
Args:
|
|
user_id: 用户的UUID标识
|
|
session: 异步数据库会话
|
|
|
|
Returns:
|
|
如果找到则返回用户对象,否则返回None
|
|
"""
|
|
return await session.get(User, user_id)
|
|
|
|
@staticmethod
|
|
async def create_user(
|
|
session: AsyncSession, email: str, password: str, **kwargs
|
|
) -> User:
|
|
"""
|
|
创建新用户
|
|
|
|
Args:
|
|
session: 异步数据库会话
|
|
email: 用户的邮箱地址
|
|
password: 用户的明文密码,将自动进行哈希加密
|
|
**kwargs: 其他用户属性参数
|
|
|
|
Returns:
|
|
创建成功的用户对象
|
|
|
|
Raises:
|
|
IntegrityError: 当邮箱已存在时可能抛出完整性错误
|
|
"""
|
|
hashed = get_password_hash(password)
|
|
user = User(email=email, hashed_password=hashed, **kwargs)
|
|
session.add(user)
|
|
await session.commit()
|
|
await session.refresh(user)
|
|
return user
|