{"id":30802131,"url":"https://github.com/noogler-eng/contesttracker","last_synced_at":"2026-04-21T20:06:04.581Z","repository":{"id":283283578,"uuid":"951234937","full_name":"noogler-eng/ContestTracker","owner":"noogler-eng","description":"this is TLE eliminators assignment which is contest tracker fetches realtime contest data and automation of uploading of youtube channel contest solution link to the database.","archived":false,"fork":false,"pushed_at":"2025-09-01T17:20:17.000Z","size":757,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-01T18:25:39.511Z","etag":null,"topics":["cron-jobs","docker","express","googleauth","mongodb","mongoose","oauth2","react","react-router-dom","recoil","scadcn-ui","tailwindcss","youtube-api"],"latest_commit_sha":null,"homepage":"https://assignment-psi-ivory.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/noogler-eng.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-19T11:15:01.000Z","updated_at":"2025-09-01T17:20:22.000Z","dependencies_parsed_at":"2025-07-16T03:30:01.532Z","dependency_job_id":"18826074-2c03-4738-868e-37e1480c5a2f","html_url":"https://github.com/noogler-eng/ContestTracker","commit_stats":null,"previous_names":["noogler-eng/assignment","noogler-eng/contesttracker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/noogler-eng/ContestTracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noogler-eng%2FContestTracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noogler-eng%2FContestTracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noogler-eng%2FContestTracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noogler-eng%2FContestTracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/noogler-eng","download_url":"https://codeload.github.com/noogler-eng/ContestTracker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/noogler-eng%2FContestTracker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273827000,"owners_count":25175235,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-05T02:00:09.113Z","response_time":402,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cron-jobs","docker","express","googleauth","mongodb","mongoose","oauth2","react","react-router-dom","recoil","scadcn-ui","tailwindcss","youtube-api"],"created_at":"2025-09-05T21:47:05.803Z","updated_at":"2025-12-28T20:24:45.745Z","avatar_url":"https://github.com/noogler-eng.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 Contest Tracker Web App\n\n- Check out the demo video here 👉 [Project Demo - Loom](https://www.loom.com/share/fcc64a0aca7b43e9927594b70af096b4?sid=c89332bd-54a9-4335-9878-cfe0c6dfa0c9)\n\n  \nNOTE: sometime it will take 1 or 2 min to start as it is a free service from render --- --- -- ---\n\nBackend Deployment Link: [https://assignment-qh3o.onrender.com](https://assignment-qh3o.onrender.com)\n\nFrontend Deployment Link: [https://assignment-psi-ivory.vercel.app/](https://assignment-psi-ivory.vercel.app/)\n\n## 📖 Description\n\n- This project is a contest tracker web application that helps users stay updated with coding contests from platforms like Codeforces, CodeChef, and LeetCode.\n\n### ✨ Key Features:\n\n- View upcoming and past contests\n- Bookmark contests\n- Filter contests by platform\n- Watch video solutions\n- Admins can manually add solution videos\n- Automated YouTube video solution fetcher via a backend cron job\n-  ❤️❤️I am not scrapping the data instead of that i am fetching the data from offical API's which reduce the latency and increase efficiency.❤️❤️\n\n### 🛠️ Tech Stack\n\n- Frontend: React, Next.js, Tailwind CSS, Next UI\n- Backend: Node.js, Express, REST APIs\n- Database: MongoDB\n- Others: Docker, Google OAuth, YouTube API, Cron Jobs, Recoil\n\n## 🚀 Features\n\n- ✅ Fetch contests from multiple platforms\n- ✅ View upcoming and past contests\n- ✅ Google Authentication (Login)\n- ✅ Automatic YouTube video fetcher\n- ✅ Bookmark contests\n- ✅ Pagination support\n- ✅ Responsive UI\n- ✅ Admin functionality to add video solutions manually\n\n## 📽️ Demo\n\n- Check out the demo video here 👉 [Project Demo - Loom](https://www.loom.com/share/fcc64a0aca7b43e9927594b70af096b4?sid=c89332bd-54a9-4335-9878-cfe0c6dfa0c9)\n\n## 📷 Screenshots\n\n### 🏠 Homepage\n\n- Platform filter bar, User login with Google\n\n\u003cimg width=\"1440\" alt=\"Screenshot 2025-03-24 at 11 51 27 PM\" src=\"https://github.com/user-attachments/assets/5e038f39-de5e-42d5-961a-9041bce2977b\" /\u003e\n\n\u003cimg width=\"1440\" alt=\"Screenshot 2025-03-24 at 11 52 16 PM\" src=\"https://github.com/user-attachments/assets/dd0bd510-4ce8-4069-882a-df21ecca077e\" /\u003e\n\n### 📑 Pagination Example\n\n\u003cimg width=\"1440\" alt=\"Screenshot 2025-03-24 at 11 58 06 PM\" src=\"https://github.com/user-attachments/assets/27069b8c-e536-4ff7-8d52-d789e564f741\" /\u003e\n\n### 👤 Profile Page\n\n- Displays logged-in user details\n- Admin badge for admin users\n  \n\u003cimg width=\"1440\" alt=\"Screenshot 2025-03-24 at 11 52 50 PM\" src=\"https://github.com/user-attachments/assets/36fd9d1f-a26b-4c14-9d6b-0f558d237178\" /\u003e\n\n### 🏆 Bookmarks Card Example\n\n- Watch video solution\n- Navigate to the contest platform\n- Admin-only manual video upload option\n\n\u003cimg width=\"1434\" alt=\"Screenshot 2025-03-24 at 11 52 32 PM\" src=\"https://github.com/user-attachments/assets/25c9fe56-8800-4e75-859c-85821851460c\" /\u003e\n\n### 🔄 Cron Job (Backend)\n\n- Automatic YouTube video fetch at 8 AM daily\n- Updates contest video solutions\n\n \u003cimg width=\"1440\" alt=\"Cron Job Screenshot\" src=\"https://github.com/user-attachments/assets/e3fd6f65-8d62-432a-a1f3-d2b01a85b9ed\" /\u003e\n\n### Tablet view \n\n\u003cimg width=\"519\" alt=\"Screenshot 2025-03-24 at 11 56 29 PM\" src=\"https://github.com/user-attachments/assets/4bd7e65f-4d80-4480-96d2-063c147a0cb1\" /\u003e\n\n\u003cimg width=\"519\" alt=\"Screenshot 2025-03-24 at 11 56 09 PM\" src=\"https://github.com/user-attachments/assets/b162fa6c-c3c3-4986-9ba1-cca54561a7c6\" /\u003e\n\n### Mobile view\n\n\u003cimg width=\"334\" alt=\"Screenshot 2025-03-24 at 11 54 46 PM\" src=\"https://github.com/user-attachments/assets/961a0e9c-68d0-4c5b-bd02-b0823bacc01b\" /\u003e\n\n\u003cimg width=\"324\" alt=\"Screenshot 2025-03-24 at 11 54 18 PM\" src=\"https://github.com/user-attachments/assets/31e756b9-0c69-47ac-869b-a1157edd4dbd\" /\u003e\n\n### 🧠 Future Improvements\n\n- Add contest reminders/notifications\n- Enhance authentication features\n- Integrate more competitive programming platforms\n\n### 📥 Installation Guide\n\n### Clone the Project\n\n```bash\ngit clone \u003cyour-repo-link\u003e\ncd \u003cproject-folder\u003e\n```\n\n### 🌐 Environment Variables (.env)\n\n```.env\nPORT=\nMONGO_URI=\"\"\nYOUTUBE_API=\"\"\n```\n\n### 🔌 Backend Setup\n\n```bash\ncd backend\nnpm install\ntsc -b\nnode dist/index.js\n```\n\n### 🎨 Frontend Setup\n\n```bash\ncd frontend\nnpm install\nnpm run dev\n```\n\n# API Endpoints and System Overview\n\nThis document outlines the API endpoints and system architecture for the contest tracking and management application.\n\n## API Endpoints\n\n### Contest Management\n\n* **`/contests/upcoming_contest` (GET)**\n    * Fetches upcoming contests from CodeChef, LeetCode, and Codeforces.\n    * Response: JSON array of contest objects.\n* **`/contests/past_contest` (GET)**\n    * Fetches past contests from CodeChef, LeetCode, and Codeforces.\n    * Response: JSON array of contest objects.\n* **`/contests/upload_solution` (POST)**\n    * Allows administrators to manually upload contest solutions.\n    * Request: JSON payload containing solution details.\n    * Authentication: Requires administrator privileges.\n\n### User Management\n\n* **`/user/profile` (GET)**\n    * Retrieves the current user's profile information.\n    * Authentication: Requires user authentication.\n    * Response: JSON object containing user profile data.\n* **`/user/bookmarks` (GET)**\n    * Retrieves all bookmarked contests for the logged-in user.\n    * Authentication: Requires user authentication.\n    * Response: JSON array of bookmarked contest objects.\n* **`/user/bookmarks` (POST)**\n    * Adds a selected contest to the user's bookmarks.\n    * Request: JSON payload containing the contest identifier.\n    * Authentication: Requires user authentication.\n\n### Authentication\n\n* **`/auth/google` (POST)**\n    * Handles Google OAuth authentication.\n    * Request: Google OAuth token.\n    * Response: User authentication token.\n\n## Background Processes\n\n### Cron Jobs\n\n* **Daily Contest Update (8:00 AM)**\n    * Scheduled cron job that runs daily at 8:00 AM.\n    * Fetches and updates contest information from CodeChef, LeetCode, and Codeforces.\n    * Can be configured to run hourly.\n* **Testing Cron Job (Instant)**\n    * On demand execution of the contest data fetching logic, for testing purposes.\n\n## System Architecture\n\n* The system utilizes a backend API to manage contest data, user profiles, and authentication.\n* Contest data is fetched from external platforms (CodeChef, LeetCode, Codeforces) using web scraping or official APIs (if available).\n* User authentication is handled via Google OAuth.\n* A database stores contest information, user profiles, and bookmarks.\n* Cron jobs automate the process of updating contest data.\n\n## Project Structure\n\n```pgsql\n📦 Project Root\n├── 📂 backend\n│   ├── 📂 src\n│   │   ├── 📂 controllers\n│   │   ├── 📂 cron\n│   │   ├── 📂 middleware\n│   │   ├── 📂 models\n│   │   ├── 📂 routers\n│   │   ├── 📂 types\n│   │   ├── index.ts\n│   │   ├── .env\n│   │   └── docker-compose.yml\n│\n├── 📂 frontend\n│   ├── 📂 public\n│   ├── 📂 src\n│   │   ├── 📂 assets\n│   │   ├── 📂 components\n│   │   │   ├── 📂 common\n│   │   │   ├── 📂 providers\n│   │   │   │   ├── authprovider.tsx\n│   │   │   │   └── recoilprovider.tsx\n│   │   │   ├── 📂 ui\n│   │   ├── 📂 hooks\n│   │   │   ├── useMyContests.tsx\n│   │   │   ├── usePastContests.tsx\n│   │   │   └── useUpcomingContests.tsx\n│   │   ├── 📂 lib\n│   │   ├── 📂 pages\n│   │   │   ├── Bookmarks.tsx\n│   │   │   ├── Home.tsx\n│   │   │   ├── Profile.tsx\n│   │   ├── 📂 store\n│   │   │   └── user_atom.ts\n│   │   ├── 📂 types\n│   │   │   └── contest_type.tsx\n│   │   ├── 📂 utils\n│   │   │   ├── format_time.tsx\n│   │   │   └── platform_color.tsx\n│   │   ├── app.tsx\n│   │   ├── index.css\n│   │   └── main.tsx\n│   └── .gitignore\n```\n\n### ⭐️ If you like this project, don't forget to give it a star!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoogler-eng%2Fcontesttracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnoogler-eng%2Fcontesttracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnoogler-eng%2Fcontesttracker/lists"}