Files
bakery-ia/services/procurement/app/repositories/base_repository.py

63 lines
2.1 KiB
Python
Raw Normal View History

2025-10-30 21:08:07 +01:00
# ================================================================
# services/procurement/app/repositories/base_repository.py
# ================================================================
"""
Base Repository Pattern for Procurement Service
"""
from typing import Generic, TypeVar, Type, Optional, List, Dict, Any
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from shared.database.base import Base
ModelType = TypeVar("ModelType", bound=Base)
class BaseRepository(Generic[ModelType]):
"""Base repository with common database operations"""
def __init__(self, model: Type[ModelType]):
self.model = model
async def get_by_id(self, db: AsyncSession, id: Any) -> Optional[ModelType]:
"""Get entity by ID"""
result = await db.execute(select(self.model).where(self.model.id == id))
return result.scalar_one_or_none()
async def get_all(self, db: AsyncSession, skip: int = 0, limit: int = 100) -> List[ModelType]:
"""Get all entities with pagination"""
result = await db.execute(select(self.model).offset(skip).limit(limit))
return result.scalars().all()
async def create(self, db: AsyncSession, **kwargs) -> ModelType:
"""Create new entity"""
instance = self.model(**kwargs)
db.add(instance)
await db.flush()
await db.refresh(instance)
return instance
async def update(self, db: AsyncSession, id: Any, **kwargs) -> Optional[ModelType]:
"""Update entity"""
instance = await self.get_by_id(db, id)
if not instance:
return None
for key, value in kwargs.items():
if hasattr(instance, key):
setattr(instance, key, value)
await db.flush()
await db.refresh(instance)
return instance
async def delete(self, db: AsyncSession, id: Any) -> bool:
"""Delete entity"""
instance = await self.get_by_id(db, id)
if not instance:
return False
await db.delete(instance)
await db.flush()
return True