From f2cc6167049d205d2b3f5e30399efe7ba97f956e Mon Sep 17 00:00:00 2001 From: Hk669 Date: Wed, 17 Jul 2024 23:29:06 +0530 Subject: [PATCH] feat: append recommendations into DB --- src/__init__.py | 1 + src/api.py | 10 ++++++-- src/models.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 2 deletions(-) diff --git a/src/__init__.py b/src/__init__.py index faf502a..ba2c4d7 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -11,6 +11,7 @@ GithubUser, RepositoryRecommendation, get_user_collection, + append_recommendations_to_db, # check_daily_limit ) from .db import ( diff --git a/src/api.py b/src/api.py index b8ba24c..d734efc 100644 --- a/src/api.py +++ b/src/api.py @@ -14,7 +14,7 @@ from .user_data import get_repos from src.db import (recommend, get_topic_based_recommendations) -from src.models import User, GithubUser, get_user_collection +from src.models import User, GithubUser, get_user_collection, append_recommendations_to_db load_dotenv() logger = logging.getLogger(__name__) @@ -212,8 +212,14 @@ async def get_recommendations(request: Request, current_user: dict = Depends(get if not unique_recommendations: return {'recommendations': [], 'message': 'No recommendations found'} + rec_name = f"Recommendations for {username} - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" + rec_id = append_recommendations_to_db(username, unique_recommendations, rec_name) + # update_daily_limit(username) # updates the daily limit of the user. - return {'recommendations': unique_recommendations[::-1]} + return { + 'recommendations': unique_recommendations[::-1], + 'recommendations_id': rec_id + } except Exception as e: logger.error(f"Error: {str(e)}") raise HTTPException(status_code=500, detail="An error occurred while generating recommendations") diff --git a/src/models.py b/src/models.py index e4634fe..7c57b6a 100644 --- a/src/models.py +++ b/src/models.py @@ -2,6 +2,7 @@ from typing import Optional, List from motor.motor_asyncio import AsyncIOMotorClient import os +import uuid import logging from dotenv import load_dotenv load_dotenv() @@ -18,6 +19,9 @@ async def get_user_collection(): return db['users'] +async def get_recommendations_collection(): + return db['recommendations'] + class User(BaseModel): username: str @@ -76,6 +80,63 @@ class RepositoryRecommendation(BaseModel): updated_at: str topics: str + +def append_recommendations_to_db(username, recommendations, recommendation_name): + try: + user_recommenations_coll = db['user_recommendations'] + recommendations_collection = db['recommendations'] + + except Exception as e: + logger.error(f"Failed to fetch recommendations from DB: {str(e)}") + raise ValueError("Failed to fetch recommendations from DB") + + recommendation_id = str(uuid.uuid4()) + try: + recommendations_collection.insert_one({ + "recommendation_id": recommendation_id, + "recommendations": recommendations + }) + + except Exception as e: + logger.error(f"Failed to save recommendations to DB: {str(e)}") + raise ValueError("Failed to save recommendations to DB") + + try: + user_recommenations_coll.update_one( + {"username": username}, + {"$push": { + "recommendation_refs": { + "recommendation_id": recommendation_id, + "recommendation_name": recommendation_name + } + }}, + upsert=True + ) + + return recommendation_id + except Exception as e: + logger.error(f"Failed to save user recommendations to DB: {str(e)}") + raise ValueError("Failed to save user recommendations to DB") + + +def get_recommendation_by_id(recommendation_id): + try: + recommendations_collection = db['recommendations'] + recommendation_data = recommendations_collection.find_one({"recommendation_id": recommendation_id}) + + if not recommendation_data: + return None + + return { + "recommendation_id": recommendation_id, + "recommendations": recommendation_data["recommendations"] + } + + except Exception as e: + logger.error(f"Failed to get recommendation from DB: {str(e)}") + raise ValueError("Failed to get recommendation from DB") + + # TODO: v2 # def update_daily_limit_to_all_users(): # try: