Spaces:
Sleeping
Sleeping
| from typing import Generic, TypeVar, Optional, List, Type | |
| from sqlalchemy import select | |
| from lpm_kernel.common.repository.database_session import DatabaseSession, Base | |
| T = TypeVar("T", bound=Base) | |
| class BaseRepository(Generic[T]): | |
| def __init__(self, model: Type[T]): | |
| self.model = model | |
| self._db = DatabaseSession() | |
| def get_by_id(self, id: int) -> Optional[T]: | |
| with self._db.session() as session: | |
| return session.get(self.model, id) | |
| def create(self, entity: T) -> T: | |
| with self._db.session() as session: | |
| try: | |
| session.add(entity) | |
| session.commit() | |
| session.refresh(entity) | |
| return self.model.from_dict(entity.to_dict()) | |
| except Exception as e: | |
| session.rollback() | |
| raise | |
| def update(self, entity: T) -> Optional[T]: | |
| with self._db.session() as session: | |
| try: | |
| updated = session.merge(entity) | |
| session.commit() | |
| return updated | |
| except Exception as e: | |
| session.rollback() | |
| raise | |
| def delete(self, id: int) -> bool: | |
| with self._db.session() as session: | |
| try: | |
| entity = session.get(self.model, id) | |
| if entity: | |
| session.delete(entity) | |
| session.commit() | |
| return True | |
| return False | |
| except Exception as e: | |
| session.rollback() | |
| raise | |
| def list(self, filters: dict = None, limit: int = 100, offset: int = 0) -> List[T]: | |
| with self._db.session() as session: | |
| try: | |
| query = select(self.model) | |
| if filters: | |
| query = query.filter_by(**filters) | |
| query = query.limit(limit).offset(offset) | |
| results = session.scalars(query).all() | |
| return [self.model.from_dict(item.to_dict()) for item in results] | |
| except Exception as e: | |
| session.rollback() | |
| raise | |