Current Functionality:
- Allows users to track classes and get alerts when sections open.
- Users can create accounts to save courses across devices, verify their email, and reset their password.
- Receive alerts every 2 minutes for any course and section at Georgia Tech.
- Get alerts for waitlist openings if there is no space in the course
- Course offerings for current term updated twice daily.
Future Plans:
- Visualize schedules.
- See professor ratings and grade point averages.
- Pre-requisite checker to ensure you are allowed to take all of your planned courses
- Flutter - Mobile App framework written in Dart used to develop cross-platform applications
- Firebase - BaaS (Backend as a service) developed by Google which provides the following services together with GCP (Google Cloud Platform)
- Cloud Firestore - The primary database which stores both user info and an updated copy of Georgia Tech's course offerings for each term
- Authentication - Uses email and password to authenticate users; includes email verification and password resetting
- Cloud Messaging - Used to easily send push notifications from Firebase Cloud Functions
- Cloud Functions - Composed of two functions written in Node.js that use Axios and Cheerio to web scrape the Georgia Tech website:
- Course Offerings Updater - updates current copy of course offerings every 12 hours
- Opening Checker - Checks for openings in tracked courses and sends push notifications to registered devices every 2 minutes
- cron-job.org - Free cronjob scheduler used to trigger execution of Firebase Cloud Functions
I wanted users to be able to track as many courses as they could realistically need, which means my cloud function needed to be as efficient as possible since it runs every two minutes.
However, after using JavaScript's async await with promises to asyncronously process users and courses, my function began to hit rate limits. I haven't determined if this was the Georgia Tech servers or Node.js itself, but I started looking into Node.js rate limiter packages.
After searching, I decided that the added dependency wasn't worth the extra cold boot time, so I designed my own request rate limiter, which processes batches of 50 requests at a time asyncronously and has been working flawlessly during testing even with many users and courses.