diff --git a/backend/main.py b/backend/main.py index 93f42b1..cd5373f 100644 --- a/backend/main.py +++ b/backend/main.py @@ -7,6 +7,9 @@ import json import re import requests +import logger + +logger = logging.getLogger(__name__) load_dotenv() @@ -31,39 +34,52 @@ class SearchInput(BaseModel): } def get_difficulty(stars, open_issues): - if stars < 500 and open_issues > 5: - return "Beginner" - elif stars < 5000: - return "Intermediate" - else: - return "Advanced" + try: + if stars < 500 and open_issues > 5: + return "Beginner" + elif stars < 5000: + return "Intermediate" + else: + return "Advanced" + except Exception: + logger.exception("Failed to determine repository difficulty") + + return "Unknown" def search_github_repos(skills): - skill_list = [s.strip() for s in skills.split(",")] - query = "+".join(skill_list) + "+good-first-issues:>3" - url = f"https://api.github.com/search/repositories?q={query}&sort=updated&per_page=9" + + try: + skill_list = [s.strip() for s in skills.split(",")] + query = "+".join(skill_list) + "+good-first-issues:>3" + url = f"https://api.github.com/search/repositories?q={query}&sort=updated&per_page=9" - response = requests.get(url, headers=GITHUB_HEADERS) - if response.status_code != 200: - return [] + response = requests.get(url, headers=GITHUB_HEADERS, timeout = 10) + + response.raise_for_status() + + data = response.json() + repos = [] - data = response.json() - repos = [] + for repo in data.get("items", []): + repos.append({ + "name": repo["name"], + "full_name": repo["full_name"], + "description": repo["description"] or "No description available", + "stars": repo["stargazers_count"], + "language": repo["language"] or "Various", + "open_issues": repo["open_issues_count"], + "url": repo["html_url"], + "issues_url": repo["html_url"] + "/issues?q=is%3Aopen+label%3A%22good+first+issue%22", + "difficulty": get_difficulty(repo["stargazers_count"], repo["open_issues_count"]) + }) - for repo in data.get("items", []): - repos.append({ - "name": repo["name"], - "full_name": repo["full_name"], - "description": repo["description"] or "No description available", - "stars": repo["stargazers_count"], - "language": repo["language"] or "Various", - "open_issues": repo["open_issues_count"], - "url": repo["html_url"], - "issues_url": repo["html_url"] + "/issues?q=is%3Aopen+label%3A%22good+first+issue%22", - "difficulty": get_difficulty(repo["stargazers_count"], repo["open_issues_count"]) - }) + return repos - return repos + except requests.RequestException: + + logger.exception("Failed to fetch GitHub repositories") + + return [] @app.get("/") def home():