from abc import ABC, abstractmethod from api.repository.user import UserRepository class IUnitOfWork(ABC): users: type[UserRepository] @abstractmethod def __init__(self): ... @abstractmethod async def __aenter__(self): ... @abstractmethod async def __aexit__(self): ... @abstractmethod async def commit(self): ... @abstractmethod async def rollback(self): ... class UnitOfWork: def __init__(self, session_factory): self.session_factory = session_factory async def __aenter__(self): self.session = self.session_factory() self.users = UserRepository(self.session) async def __aexit__(self, *args): await self.session.rollback() await self.session.close() async def commit(self): await self.session.commit() async def rollback(self): await self.session.rollback()