import uuid from repositories.pocketbase_client import pb_client from repositories.repo_config import USE_MOCK_REPOSITORIES COLLECTION = 'trip_watchlist' class WatchlistRepository: """ Data access for the `trip_watchlist` collection — pure CRUD only, per the no-business-logic-in-repositories rule. Cap enforcement and ownership decisions live in services/watchlist_service.py. """ def create(self, data): return pb_client.create(COLLECTION, data) def delete(self, item_id): return pb_client.delete(COLLECTION, item_id) def get_by_id(self, item_id): return pb_client.get_one(COLLECTION, item_id) def list_for_tenant(self, tenant_id): """All watched items for a tenant (every seat's), newest first.""" return pb_client.list( COLLECTION, filter_str=f'tenant_id = "{tenant_id}"', sort='-added_at', per_page=200 ) def count_for_seat(self, seat_id): """Returns how many watchlist slots this seat currently occupies.""" return len(pb_client.list( COLLECTION, filter_str=f'seat_id = "{seat_id}"', per_page=200 )) class MockWatchlistRepository: """In-memory stand-in for WatchlistRepository.""" def __init__(self): self._records = {} # Mirrors MockScrapeRepository's monotonic counter — real # PocketBase auto-populates added_at via autodate(true), and # every "newest first" sort here relies on strict ordering. self._sequence = 0 def create(self, data): record_id = data.get('id') or str(uuid.uuid4()) self._sequence += 1 record = { 'id': record_id, 'added_at': data.get('added_at') or f'{self._sequence:020d}', **data, } self._records[record_id] = record return record def delete(self, item_id): return self._records.pop(item_id, None) is not None def get_by_id(self, item_id): return self._records.get(item_id) def list_for_tenant(self, tenant_id): items = [r for r in self._records.values() if r.get('tenant_id') == tenant_id] items.sort(key=lambda r: r.get('added_at') or '', reverse=True) return items def count_for_seat(self, seat_id): return len([r for r in self._records.values() if r.get('seat_id') == seat_id]) watchlist_repository = MockWatchlistRepository() if USE_MOCK_REPOSITORIES else WatchlistRepository()