There's a lot of "rare foods" at MSU that are hard to find in the dining halls, such as Mac 'n Cheese bites, Mozzarella sticks, and Char Siu Bao. There's no easy way to find them aside from having to sift between three meals a day for ten dining halls across campus for every single day.

What it does

There's three components to the app

  • A web API that scrapes data from the MSU dining halls website in batches, and parses it into JSON readable data (from a raw HTML request where all data must be manually parsed with DOM manipulation).
  • A backend service that pulls data from this web api, uploads it to mongodb, and has endpoints for querying
  • A client app running on Android that actually queries the data from the backend service

How I built it

  • The web API Is written entirely in TypeScript and Node.JS, using serverside jQuery for easy DOM traversal.
  • The backend is written in TypeScript and Node.JS again, with express.js as the primary webserver runner.
  • The client app is written in Flutter (a dart-based application) so that it can be easily spun up and could be theoretically ported to iOS very easily

Challenges I ran into

  • I had set up the backend to work with Google Cloud Platform (in part for the GCP challenge), but it was near impossible to query substrings which is very unfortunate. I had to go back and refactor the database handling to use a local instance of mongodb
  • Time was a really big challenge since I am alone in developing this app

Accomplishments that I'm proud of

  • The fact that it works! I've been wanting to do it for months, and I'm glad I got the opportunity to do it.

What I learned

  • A lot about indexes and querying on mongo documents, especially with TypeScript
  • Some more advanced flutter techniques like Slivers and Stacks

What's next for Spartan Foods

  • Integration with my separate MSU helper app so that people don't have to go to separate apps for dining hall menus and such
  • Push notifications for favorite foods being available soon
Share this project: