import asyncio from src.database.users.crud import UsersCrudActions from src.errors.http_errors.errors import Errors from src.models.pydantic_models.model import UserCreate, UserOut, UserUpdate from src.service.auth.jwt import HashService class CrudService: def __init__(self) -> None: self.errors=Errors() self.crud_db_actions=UsersCrudActions() self.hash_service=HashService() async def _plain_to_hash(self, user_data:dict)->dict: user_data["hashed_password"]=user_data.pop("plain_password") user_data["hashed_password"]= await asyncio.to_thread(self.hash_service.plain_to_hash, user_data["hashed_password"]) return user_data async def get_user_by_email(self, email:str)->UserOut: user_entity=await self.crud_db_actions.get_user_by_email(email) if not user_entity: raise self.errors.not_found_error(detail="User wasn't found") return UserOut.model_validate(user_entity) async def create_user(self, data:UserCreate)->UserOut: user_data=UserCreate.model_dump(data) user_data=await self._plain_to_hash(user_data) user_entity=await self.crud_db_actions.create_user(user_data) if not user_entity: raise self.errors.validation_error(detail="User creation gone wrong") return UserOut.model_validate(user_entity) async def delete_user_soft(self, email:str)->bool: user_entity=await self.crud_db_actions.delete_user_soft(email) if not user_entity: raise self.errors.not_found_error(detail="User not found") return user_entity async def delete_user_hard(self, email:str, current_user)->bool: user_entity=await self.crud_db_actions.delete_user_hard(email) if not user_entity: raise self.errors.not_found_error(detail="User not found") return user_entity async def update_user(self, email:str, data:UserUpdate)->UserOut: user_data=UserUpdate.model_dump(data, exclude_unset=True) if not user_data: raise self.errors.bad_request_error(detail="User info to update can not be empty") if user_data.get("plain_password"): user_data=await self._plain_to_hash(user_data) user_entity=await self.crud_db_actions.update_user_partially(email, user_data) if not user_entity: raise self.errors.not_found_error(detail="User not found") return UserOut.model_validate(user_entity) async def crud_service()->CrudService: return CrudService()