| import json |
| from datetime import datetime, timezone |
| from uuid import uuid4 |
| from controllers.mongo import users_collection |
| from redis_client import redis_client, CACHE_TTL |
|
|
| def save_user_memories(user_id: str, memories: list[str]): |
| if not memories: |
| return |
|
|
| docs = [ |
| { |
| "id": str(uuid4()), |
| "text": m, |
| "created_at": datetime.now(timezone.utc) |
| } |
| for m in memories |
| ] |
|
|
| users_collection.update_one( |
| {"_id": user_id}, |
| { |
| "$push": {"memories": {"$each": docs}}, |
| "$set": {"memory_updated_at": datetime.now(timezone.utc)} |
| }, |
| upsert=True |
| ) |
| redis_client.delete(f"user_memories:{user_id}") |
|
|
|
|
| def get_user_memories(user_id: str): |
| cache_key = f"user_memories:{user_id}" |
| |
| cached_memories = redis_client.get(cache_key) |
| if cached_memories: |
| return json.loads(cached_memories) |
|
|
| user = users_collection.find_one({"_id": user_id}, {"memories": 1}) |
| |
| if not user: |
| return [] |
|
|
| memories = user.get("memories", []) |
| |
| for m in memories: |
| if 'created_at' in m and isinstance(m['created_at'], datetime): |
| m['created_at'] = m['created_at'].isoformat() |
|
|
| redis_client.setex(cache_key, CACHE_TTL, json.dumps(memories)) |
| |
| return memories |
|
|
|
|
| def update_user_memory(user_id: str, memory_id: str, new_text: str): |
| users_collection.update_one( |
| { |
| "_id": user_id, |
| "memories.id": memory_id |
| }, |
| { |
| "$set": { |
| "memories.$.text": new_text, |
| "memory_updated_at": datetime.now(timezone.utc) |
| } |
| } |
| ) |
| redis_client.delete(f"user_memories:{user_id}") |
|
|
| def delete_user_memory(user_id: str, memory_id: str): |
| users_collection.update_one( |
| {"_id": user_id}, |
| { |
| "$pull": {"memories": {"id": memory_id}}, |
| "$set": {"memory_updated_at": datetime.now(timezone.utc)} |
| } |
| ) |
| redis_client.delete(f"user_memories:{user_id}") |
|
|
| def clear_user_memories(user_id: str): |
| users_collection.update_one( |
| {"_id": user_id}, |
| {"$set": {"memories": []}} |
| ) |
| redis_client.delete(f"user_memories:{user_id}") |
|
|
| def get_memory_enabled(user_id: str) -> bool: |
| cache_key = f"user_memory_enabled:{user_id}" |
| |
| cached_flag = redis_client.get(cache_key) |
| if cached_flag is not None: |
| return json.loads(cached_flag) |
|
|
| user = users_collection.find_one( |
| {"_id": user_id}, |
| {"memory_enabled": 1} |
| ) |
|
|
| enabled = user.get("memory_enabled", True) if user else True |
| |
| redis_client.setex(cache_key, CACHE_TTL, json.dumps(enabled)) |
| return enabled |
|
|
|
|
| def set_memory_enabled(user_id: str, enabled: bool): |
| users_collection.update_one( |
| {"_id": user_id}, |
| { |
| "$set": { |
| "memory_enabled": enabled, |
| } |
| }, |
| upsert=True |
| ) |
| redis_client.setex(f"user_memory_enabled:{user_id}", CACHE_TTL, json.dumps(enabled)) |