CodeJoust

June 23, 2022 ยท View on GitHub

CodeJoust is an online real-time competitive coding platform where users can compete live against friends to solve programming problems. Players can create or join a room, choose a problem difficulty and room duration, invite friends, and begin coding to see who's the best!

Screenshots

Lobby Page: Create a room and invite friends.

Game Page: Race to find a solution.

Results Widgets: Compare your standing amongst competitors.

Problem Page: Create and edit problems to use in the game.

Running Locally

First, ensure you have the necessary languages and frameworks installed (e.g. Java, Maven, Node) and clone this repo.

Then, export the following two environment variables in your local dev environment:

  1. export JASYPT_ENCRYPTOR_PASSWORD=XXXXXXXXXXXX;
  2. export FIREBASE_KEYFILE=XXXXXXXXXXXX;

The first environment variable is for the encrypted password to our database (see application.properties). Please email us at zpchris@wharton.upenn.edu with an explanation if you would like access to this for some reason. Otherwise, replace the spring.datasource variables in application.properties with your own database to proceed.

The second environment variable is a generated JSON keyfile for a service account for Firebase. This is needed to allow communication with Firebase for user authentication logic. The JSON contents of the keyfile are stored directly in the environment variable.

  • Run ./mvnw clean install if it's your first time running the app (or for whatever reason you need to re-download Maven dependencies).

  • Run ./mvnw test to run the project's unit and API tests.

  • Run ./mvnw spring-boot:run to build and start the server (both frontend and backend).

Once the server is started, the site should be running at localhost:8080, and you can send REST requests to the routes at localhost:8080/api/v1/.

Speed Up Build Times

The following two tips can dramatically speed up build times and save you a lot of time when developing (a matter of minutes vs. seconds on each code change):

Tip 1: The full server startup process can take some time, so if you are looking to test some quick frontend changes, you can start ./mvnw spring-boot:run in one bash window and run cd ./frontend && npm start in another. You can then use localhost:3000 instead, and any changes to frontend files will immediately be reflected (so you don't need to re-run Maven every time). Be aware that occasional socket connection errors can occur when using this method.

Tip 2: On the other hand, if you're only testing backend changes, you can avoid re-building the entire frontend by running ./mvnw spring-boot:run -Dfrontend.skip. This will reuse the frontend code built from the latest call to ./mvnw spring-boot:run (so if your previous build failed, you may need to rerun the full command before this tip will work).

Tip 3: Combine tips 1 and 2 if you're making both frontend and backend changes and want a way to quickly build each section separately.

File Structure

The service is written using Java + Spring Boot on the backend and TypeScript + React on the frontend. Data is stored in an SQL database.

The frontend files are mostly located in frontend/src:

frontend/src/*Description
apiFunctions to initiate calls to the backend REST endpoints
componentsReact components that can be used/reused on various pages
utilUtility functions
viewsDifferent pages of the application

The backend files are located under src/main/java/com/codejoust/main:

src/.../main/*Description
configCode used for configuration purposes
controllerClasses used to handle incoming REST calls
daoInterfaces containing methods used to fetch from the database
dtoObjects passed to and from the frontend (plus mapper classes)
exceptionException handlers and error enums
game_objectGame-related objects used on the backend
modelEntity classes corresponding to database return objects
serviceService classes that implement most of the app's functionality
socketSocket events that occur on connect/disconnect
utilUtility functions

Various configuration properties are set in src/main/resources/application.properties, and unit/integration tests are located under src/test/java/com/codejoust/main.