ChatbotRAG / feedback_tracking_service.py
minhvtt's picture
Upload 17 files
24f10ad verified
"""
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 []