dbconnectors/FirestoreConnector.py (31 lines of code) (raw):
from google.cloud import firestore
from google.cloud.exceptions import NotFound
import time
from dbconnectors import DBConnector
from abc import ABC
import uuid
def create_unique_id():
"""Creates a unique ID using the UUID4 algorithm.
Returns:
A string representing a unique ID.
"""
return str(uuid.uuid1())
class FirestoreConnector(DBConnector, ABC):
def __init__(self,
project_id:str,
firestore_database:str):
"""Initializes the Firestore connection and authentication."""
self.db = firestore.Client(project=project_id,database=firestore_database)
def log_chat(self,session_id, user_question, bot_response,user_id="TEST",):
"""Logs a chat message to Firestore.
Args:
session_id (str): The ID of the chat session.
user_id (str): The ID of the user who sent the message.
user_question (str): The question the user asked.
bot_response (str): The response from the bot.
"""
log_chat = {
"session_id": session_id,
"user_id": user_id,
"user_question": user_question,
"bot_response": bot_response,
"timestamp": firestore.SERVER_TIMESTAMP,
}
self.db.collection("session_logs").document().set(log_chat)
def get_chat_logs_for_session(self,session_id):
"""Gets all chat logs for a given session.
Args:
session_id (str): The ID of the chat session.
"""
sessions_log_ref = self.db.collection("session_logs")
# sessions_log_ref=sessions_log_ref.order_by("timestamp")
query= sessions_log_ref.where(filter=firestore.FieldFilter("session_id","==",session_id))
# query = sessions_log_ref.where("session_id", "==", session_id).order_by("timestamp")
# Note: Use of CollectionRef stream() is prefered to get()
docs = query.stream()
session_history=[]
for doc in docs:
session_history.append(doc.to_dict()) # Add values to the list
sorted_session_history=sorted(session_history,key=lambda x: x["timestamp"])
return [{'user_question': item['user_question'], 'bot_response': item['bot_response'],'timestamp':item['timestamp']} for item in sorted_session_history]