首个可运行的版本
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
"""用户服务"""
|
||||
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from sqlalchemy import select, or_, func
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.models.user import User
|
||||
|
||||
|
||||
class UserService:
|
||||
def __init__(self, db: AsyncSession):
|
||||
self.db = db
|
||||
|
||||
async def get_by_id(self, user_id: str) -> User | None:
|
||||
"""根据 ID 获取用户"""
|
||||
result = await self.db.execute(select(User).where(User.id == user_id))
|
||||
return result.scalars().first()
|
||||
|
||||
async def get_by_username(self, username: str) -> User | None:
|
||||
"""根据用户名获取用户"""
|
||||
result = await self.db.execute(select(User).where(User.username == username))
|
||||
return result.scalars().first()
|
||||
|
||||
async def search_users(self, query: str, current_user_id: str, limit: int = 20) -> list[User]:
|
||||
"""搜索用户"""
|
||||
result = await self.db.execute(
|
||||
select(User).where(
|
||||
or_(
|
||||
User.username.ilike(f"%{query}%"),
|
||||
User.email.ilike(f"%{query}%"),
|
||||
),
|
||||
User.id != current_user_id,
|
||||
User.is_banned == False,
|
||||
).limit(limit)
|
||||
)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def update_profile(self, user_id: str, **kwargs) -> User:
|
||||
"""更新用户资料"""
|
||||
user = await self.get_by_id(user_id)
|
||||
if not user:
|
||||
raise ValueError("用户不存在")
|
||||
|
||||
for key, value in kwargs.items():
|
||||
if value is not None and hasattr(user, key):
|
||||
setattr(user, key, value)
|
||||
|
||||
user.updated_at = datetime.utcnow()
|
||||
return user
|
||||
|
||||
async def update_status(self, user_id: str, status: str):
|
||||
"""更新用户在线状态"""
|
||||
user = await self.get_by_id(user_id)
|
||||
if user:
|
||||
user.status = status
|
||||
user.last_seen_at = datetime.utcnow()
|
||||
|
||||
async def get_total_count(self) -> int:
|
||||
"""获取用户总数"""
|
||||
result = await self.db.execute(select(func.count(User.id)))
|
||||
return result.scalar() or 0
|
||||
|
||||
async def get_online_count(self) -> int:
|
||||
"""获取在线用户数"""
|
||||
result = await self.db.execute(
|
||||
select(func.count(User.id)).where(User.status == "online")
|
||||
)
|
||||
return result.scalar() or 0
|
||||
Reference in New Issue
Block a user