import re from uuid import UUID from typing import List from src.users.repository import repository from src.users.exceptions import is_user_valid, is_password_same, is_email_exist_to_other_user from src.users.schemas import UserUpdateModel, UserResponseModel class UserService: def __init__(self, repository: repository): self.repository = repository async def get_users(self) -> List[UserResponseModel]: return self.repository.get_users() async def get_user_details(self, user: str) -> UserResponseModel: is_user_valid(user) try: UUID(user, version=4) user_details = self.repository.get_user_details(user) except ValueError: if re.match(r"[^@]+@[^@]+\.[^@]+", user): user_details = self.repository.get_user_details_by_email(user) else: user_details = self.repository.get_user_details_by_name(user) return user_details async def update_user(self, user_info: UserUpdateModel) -> dict[str, str]: is_user_valid(user_info.id) is_email_exist_to_other_user(user_info.id, user_info.email) current_user_info = self.repository.get_user_details(user_info.id) if user_info.firstname is None: user_info.firstname = current_user_info["firstname"] if user_info.lastname is None: user_info.lastname = current_user_info["lastname"] if user_info.email is None: user_info.email = current_user_info["email"] if user_info.password: is_password_same(user_info.id,user_info.password) else: current_password = self.repository.get_user_password(user_info.id) user_info.password = current_password["password"] response = self.repository.save_user_info(user_info) return {"message": response} user_service = UserService(repository)