app.bettersight.io/backend/repositories/watchlist_repository.py

75 lines
2.4 KiB
Python

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()