Spaces:
Running
Running
| """ | |
| 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 | |
| def get_feedbacked_events(self, user_id: str) -> list: | |
| """ | |
| Get all events where a user has already given feedback (is_feedback: True) | |
| Args: | |
| user_id: User ID | |
| Returns: | |
| List of event_codes with feedback info | |
| """ | |
| try: | |
| results = self.collection.find({ | |
| "user_id": user_id, | |
| "is_feedback": True | |
| }) | |
| feedbacked = [] | |
| for doc in results: | |
| feedbacked.append({ | |
| "event_code": doc.get("event_code"), | |
| "rating": doc.get("rating"), | |
| "comment": doc.get("comment"), | |
| "feedback_date": doc.get("feedback_date") | |
| }) | |
| print(f"π Found {len(feedbacked)} feedbacked events for user {user_id}") | |
| return feedbacked | |
| except Exception as e: | |
| print(f"β Error getting feedbacked events: {e}") | |
| return [] | |