from typing import Optional, List from sqlalchemy.ext.asyncio import AsyncSession from app.models.user import User from app.repositories.user import UserRepository from app.core.security import get_password_hash, verify_password class UserService: def __init__(self, db: AsyncSession): self.db = db self.repo = UserRepository(db) async def get_user(self, user_id: int) -> Optional[User]: return await self.repo.get_by_id(user_id) async def get_user_by_username(self, username: str) -> Optional[User]: return await self.repo.get_by_username(username) async def get_all_users(self) -> List[User]: return await self.repo.get_all() async def create_user(self, data: dict) -> User: if "password" in data: data["password_hash"] = get_password_hash(data.pop("password")) return await self.repo.create(data) async def update_user(self, user_id: int, data: dict) -> Optional[User]: if "password" in data: data["password_hash"] = get_password_hash(data.pop("password")) return await self.repo.update(user_id, data) async def delete_user(self, user_id: int) -> bool: return await self.repo.delete(user_id) async def authenticate(self, username: str, password: str) -> Optional[User]: user = await self.repo.get_by_username(username) if not user: return None if not verify_password(password, user.password_hash): return None if not user.is_active: return None return user async def change_password(self, user_id: int, old_password: str, new_password: str) -> bool: user = await self.repo.get_by_id(user_id) if not user: return False if not verify_password(old_password, user.password_hash): return False await self.repo.update(user_id, {"password_hash": get_password_hash(new_password)}) return True async def reset_password(self, user_id: int, new_password: str) -> bool: user = await self.repo.get_by_id(user_id) if not user: return False await self.repo.update(user_id, {"password_hash": get_password_hash(new_password)}) return True