Spaces:
Sleeping
Sleeping
from google.cloud import firestore | |
from langchain_core.tools import tool | |
from datetime import datetime, timedelta | |
import pytz | |
from backend.credentials import setup_google_credentials | |
setup_google_credentials() | |
APP_TO_DB_CATEGORY = { | |
"vocational": "occupational", | |
} | |
def to_db_category(slug): | |
return APP_TO_DB_CATEGORY.get(slug, slug) | |
def add_goal_to_firestore(user_id, goal_name, goal_description, category_slug, | |
timeframe="Month", reminder_enabled=True, duration_weeks=6): | |
""" | |
Add a goal to Firestore with proper timestamps and fields | |
Args: | |
user_id: User's Firebase UID | |
goal_name: Name of the goal | |
goal_description: Description of the goal | |
category_slug: Wellness dimension (physical, mental, etc.) | |
timeframe: Goal timeframe (Month, Week, Year) | |
reminder_enabled: Whether to enable reminders | |
duration_weeks: How many weeks the goal should run | |
""" | |
db = firestore.Client() | |
# Map app slug to db slug | |
category_slug = to_db_category(category_slug) | |
# Look up the category | |
cat_docs = db.collection("goals_categories").where("cat_slug", "==", category_slug).stream() | |
cat_doc = next(cat_docs, None) | |
if not cat_doc: | |
raise Exception(f"Category with slug '{category_slug}' not found.") | |
cat_id = cat_doc.id | |
cat_data = cat_doc.to_dict() | |
# Create timestamps | |
now = datetime.now(pytz.UTC) | |
end_date = now + timedelta(weeks=duration_weeks) | |
goal_data = { | |
"endDate": end_date, | |
"goalDescription": goal_description, | |
"goalName": goal_name, | |
"goalReminder": reminder_enabled, | |
"startDate": now, | |
"status": True, | |
"timeFrame": timeframe, | |
"user_id": user_id, | |
"wellnessDimension": cat_id, | |
"wellnessDimension_ref": f"/goals_categories/{cat_id}", | |
} | |
# Add to Firestore | |
doc_ref = db.collection("goals").add(goal_data) | |
# Return the data with the document ID | |
result = goal_data.copy() | |
result["id"] = doc_ref[1].id # doc_ref is a tuple (timestamp, document_reference) | |
return result | |
def add_goal_tool(user_id: str, goal_name: str, goal_description: str, category_slug: str, | |
timeframe: str = "Month", reminder_enabled: bool = True, duration_weeks: int = 6): | |
""" | |
Add a new user goal to Firestore with category_slug (physical, mental, social, etc). | |
Args: | |
user_id: User's Firebase UID | |
goal_name: Short name for the goal | |
goal_description: Detailed description of what the goal entails | |
category_slug: Wellness dimension slug (physical, mental, spiritual, etc.) | |
timeframe: Goal timeframe - "Month", "Week", or "Year" (default: "Month") | |
reminder_enabled: Whether to enable reminders (default: True) | |
duration_weeks: How many weeks the goal should run (default: 6) | |
""" | |
try: | |
result = add_goal_to_firestore( | |
user_id, | |
goal_name, | |
goal_description, | |
category_slug, | |
timeframe, | |
reminder_enabled, | |
duration_weeks | |
) | |
print("INSIDE TOOL RESULT:", result, type(result)) | |
from backend.cache_utils import clear_user_cache | |
clear_user_cache(user_id) | |
if isinstance(result, dict): | |
# Convert datetime objects to strings for JSON serialization | |
serializable_result = {} | |
for key, value in result.items(): | |
if isinstance(value, datetime): | |
serializable_result[key] = value.isoformat() | |
else: | |
serializable_result[key] = value | |
return serializable_result | |
elif hasattr(result, "dict"): | |
return result.dict() | |
else: | |
return {"error": "Unexpected result type", "result": str(result)} | |
except Exception as e: | |
print(f"Error in add_goal_tool: {e}") | |
return {"error": str(e), "success": False} | |
def list_goal_categories(): | |
"""List all available wellness dimension categories for goals.""" | |
try: | |
db = firestore.Client() | |
categories = [] | |
for doc in db.collection("goals_categories").stream(): | |
cat_data = doc.to_dict() | |
categories.append({ | |
"id": doc.id, | |
"name": cat_data.get("cat_name", "Unknown"), | |
"slug": cat_data.get("cat_slug", "unknown"), | |
"description": cat_data.get("cat_description", "") | |
}) | |
return {"categories": categories} | |
except Exception as e: | |
return {"error": str(e), "categories": []} |