75 lines
2.4 KiB
Python
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()
|