Files
bakery-ia/services/pos/app/repositories/pos_config_repository.py

120 lines
3.9 KiB
Python

"""
POS Configuration Repository using Repository Pattern
"""
from typing import List, Optional, Dict, Any
from uuid import UUID
from sqlalchemy import select, and_, or_
from sqlalchemy.ext.asyncio import AsyncSession
import structlog
from app.models.pos_config import POSConfiguration
from shared.database.repository import BaseRepository
logger = structlog.get_logger()
class POSConfigurationRepository(BaseRepository[POSConfiguration, dict, dict]):
"""Repository for POS configuration operations"""
def __init__(self, session: AsyncSession):
super().__init__(POSConfiguration, session)
async def get_configurations_by_tenant(
self,
tenant_id: UUID,
pos_system: Optional[str] = None,
is_active: Optional[bool] = None,
skip: int = 0,
limit: int = 100
) -> List[POSConfiguration]:
"""Get POS configurations for a specific tenant with optional filters"""
try:
query = select(self.model).where(self.model.tenant_id == tenant_id)
# Apply filters
conditions = []
if pos_system:
conditions.append(self.model.pos_system == pos_system)
if is_active is not None:
conditions.append(self.model.is_active == is_active)
if conditions:
query = query.where(and_(*conditions))
query = query.offset(skip).limit(limit).order_by(self.model.created_at.desc())
result = await self.session.execute(query)
return result.scalars().all()
except Exception as e:
logger.error("Failed to get configurations by tenant", error=str(e), tenant_id=tenant_id)
raise
async def count_configurations_by_tenant(
self,
tenant_id: UUID,
pos_system: Optional[str] = None,
is_active: Optional[bool] = None
) -> int:
"""Count POS configurations for a specific tenant with optional filters"""
try:
from sqlalchemy import func
query = select(func.count(self.model.id)).where(self.model.tenant_id == tenant_id)
# Apply filters
conditions = []
if pos_system:
conditions.append(self.model.pos_system == pos_system)
if is_active is not None:
conditions.append(self.model.is_active == is_active)
if conditions:
query = query.where(and_(*conditions))
result = await self.session.execute(query)
count = result.scalar() or 0
return count
except Exception as e:
logger.error("Failed to count configurations by tenant", error=str(e), tenant_id=tenant_id)
raise
async def get_by_pos_identifier(
self,
pos_system: str,
identifier: str
) -> Optional[POSConfiguration]:
"""
Get POS configuration by POS-specific identifier
Args:
pos_system: POS system name (square, toast, lightspeed)
identifier: merchant_id, location_id, or other POS-specific ID
Returns:
POSConfiguration if found, None otherwise
"""
try:
query = select(self.model).where(
and_(
self.model.pos_system == pos_system,
or_(
self.model.merchant_id == identifier,
self.model.location_id == identifier
),
self.model.is_active == True
)
).order_by(self.model.created_at.desc())
result = await self.session.execute(query)
return result.scalars().first()
except Exception as e:
logger.error("Failed to get config by POS identifier",
error=str(e),
pos_system=pos_system,
identifier=identifier)
raise