Inspiration

Whenever I go to eat lunch or dinner, I often go to one of the dining centers available on the OSU campus. However, when I arrive, typically the restaurant I feel like eating at turns out to be closed or isn't serving the food I like. There is a website available, but it requires users to remember the site to go to, open a browser, and check if the restaurant they want is available. Also, the original website (https://food.oregonstate.edu) for looking at dining center options at the OSU campus isn't the best interface for knowing which restaurants are still open.

What it does

Our app is an all-in-one place for easily seeing which restaurant options are open on the OSU campus. You can select filters based on open/close times. It also shows you the menu options in a more intuitive interface for easier browsing. Searing through dining options has never been easier!

How we built it

There are three main components:

  1. Web Scraper

    - Node.js
    - Jest for unit testing
    - using Puppeteer (later switched to JSDOM to reduce memory and code size), we can gather all the information we needed from the original site at https://food.oregonstate.edu such as locations, restaurant names, whether dining dollars are accepted, open/close times, menu items
    
  2. API

    - Node.js
    - Express
    - SQL database for caching web scraping data
    - backend that serves all web scraped data via a RESTful API service
    - polls web scraped data every 30 minutes since each operation takes ~20s
    - API interface documentation: https://github.com/tobyloki/BeaverEats/blob/backend-server/docs/index.md
    - deployed as a Docker image onto Fly.io cloud hosting service
    
  3. Android App

    - Android Studio
    - Kotlin
    - Retrofit
    - Frontend app to display data obtained via HTTP requests to backend API
    

Challenges we ran into

  • Puppeteer requires too much memory and takes too much code size. This is resolved by using JSDOM (a lightweight web scraping tool without the chrome browser installation)
  • During Android development, we worked simultaneously over Discord
  • For some members, Android development in Kotlin was a new experience, and it was challenging to build an app from scratch

Accomplishments that we're proud of

We got the whole application finished, starting from scratch. For some, this was a new experience in web scraping and Android development. For some, it was also a chance to practice our skills on a real project that would be useful in our lives.

What we learned

  • learned how to use Puppeteer (later switched to JSDOM to reduce memory and code size) for web scraping
  • learned how to develop Android apps (RecyclerView, HTTP requests, navigation, etc.)

What's next for Beaver Eats

  • possibly add caching to the mobile app to reduce API invocations
  • rate limit API
  • When restaurants are closed, their start/end times become NULL. We can update the API to record the last valid start/stop time for reference rather than simply returning null to the front end.
Share this project:

Updates