import uuid from repositories.pocketbase_client import pb_client from repositories.repo_config import USE_MOCK_REPOSITORIES COLLECTION = 'client_trips' class ClientTripsRepository: """ Data access for the `client_trips` collection (Phase 6) — the PM's own product catalogue, used as the "client" side of semantic comparable-trip matching against competitor products. """ def create(self, data): return pb_client.create(COLLECTION, data) def update(self, trip_id, data): return pb_client.update(COLLECTION, trip_id, data) def get_by_tenant_and_name(self, tenant_id, trip_name): """Used to upsert on repeated /research submissions instead of duplicating rows.""" safe_name = trip_name.replace('"', '\\"') return pb_client.get_first(COLLECTION, f'tenant_id = "{tenant_id}" && trip_name = "{safe_name}"') def list_for_tenant(self, tenant_id): return pb_client.list(COLLECTION, filter_str=f'tenant_id = "{tenant_id}"', per_page=200) def delete(self, trip_id): return pb_client.delete(COLLECTION, trip_id) class MockClientTripsRepository: """In-memory stand-in for ClientTripsRepository.""" def __init__(self): self._records = {} def create(self, data): record_id = data.get('id') or str(uuid.uuid4()) record = {'id': record_id, **data} self._records[record_id] = record return record def update(self, trip_id, data): if trip_id not in self._records: return None self._records[trip_id] = {**self._records[trip_id], **data} return self._records[trip_id] def get_by_tenant_and_name(self, tenant_id, trip_name): return next(( r for r in self._records.values() if r.get('tenant_id') == tenant_id and r.get('trip_name') == trip_name ), None) def list_for_tenant(self, tenant_id): return [r for r in self._records.values() if r.get('tenant_id') == tenant_id] def delete(self, trip_id): return self._records.pop(trip_id, None) is not None client_trips_repository = MockClientTripsRepository() if USE_MOCK_REPOSITORIES else ClientTripsRepository()