""" Feedback Tracking Service Tracks which events users have already given feedback for """ from typing import Optional, Dict from pymongo.collection import Collection from datetime import datetime class FeedbackTrackingService: """ Track feedback status per user per event Prevents redundant "check purchase history" calls """ def __init__(self, mongo_collection: Collection): self.collection = mongo_collection self._ensure_indexes() def _ensure_indexes(self): """Create indexes for fast lookup""" try: # Compound index for quick lookup self.collection.create_index([("user_id", 1), ("event_code", 1)], unique=True) self.collection.create_index("user_id") print("✓ Feedback tracking indexes created") except Exception as e: print(f"Feedback tracking indexes exist: {e}") def has_given_feedback(self, user_id: str, event_code: str) -> bool: """ Check if user has already given feedback for this event Args: user_id: User ID event_code: Event code Returns: True if feedback already given, False otherwise """ result = self.collection.find_one({ "user_id": user_id, "event_code": event_code, "is_feedback": True }) return result is not None def mark_feedback_given(self, user_id: str, event_code: str, rating: int, comment: str = "") -> bool: """ Mark that user has given feedback for this event Args: user_id: User ID event_code: Event code rating: Rating given (1-5) comment: Feedback comment Returns: True if saved successfully """ try: self.collection.update_one( { "user_id": user_id, "event_code": event_code }, { "$set": { "is_feedback": True, "rating": rating, "comment": comment, "feedback_date": datetime.utcnow(), "updated_at": datetime.utcnow() }, "$setOnInsert": { "created_at": datetime.utcnow() } }, upsert=True ) print(f"✅ Marked feedback: {user_id} → {event_code} (rating: {rating})") return True except Exception as e: print(f"❌ Error marking feedback: {e}") return False def get_pending_events(self, user_id: str, purchased_events: list) -> list: """ Filter purchased events to only those without feedback Args: user_id: User ID purchased_events: List of events user has purchased Returns: List of events that need feedback """ pending = [] for event in purchased_events: event_code = event.get("eventCode") if event_code and not self.has_given_feedback(user_id, event_code): pending.append(event) return pending