Home

Awesome

WedemyServer

Static Badge Maintenance License: MIT Static Badge

(Backend repo). Clone of Udemy, an e-learning platform, built using SpringBoot + Vue 3 + Typescript. With CreditCard and PayPal checkout (both powered by Braintree Payments). Uses Spring Security & Spring Session Redis (via cookies1 or sessionID Headers) for auth, instead of stateless JWT Tokens. CSRF protection is enabled. You can easily customize these settings in SecurityConfig. By default, the app runs on port 9000.

Frontend & Live Demo

Click to view Frontend Repo and live Demo built using Vue 3, Vite and Typescript. However, you can still use any frontend stack with this project. See the API Docs for this project.

Requirements

Environmental Variables

You MUST set these variables on your Local or Cloud ENV before you launch this SpringBoot app. πŸ’‘TIP: During dev/test, you can pass them via args, OR store inside your IDE: e.g. In either Eclipse or IntelliJ IDE, in the top toolbar, find the "Run" menu > Edit/Run Configuration > Environment > Environmental Variables. Add (+) each key and its value, then click Apply. If using Docker CLI, follow this quick official guide.

MYSQL_PASSWORD=
# below are for Google OAuth
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
# below are for Braintree Payments
BT_MERCHANT_ID=
BT_PUBLIC_KEY=
BT_PRIVATE_KEY=
# For production, set these:
SPRING_PROFILES_ACTIVE=prod
PORT=#{for Spring server}

Important ⚠

Please examine the files application.yml (default), and application-prod.yml (meant for production). Replace all the necessary Spring Application properties with yours. But for sensitive info (like Passwords or API Keys), DON'T PASTE THEM IN THERE DIRECTLY❌ . It's safer to store them as Environmental Variables instead (see section above), then either declare them as property.name = ${ENV_KEY_NAME}, OR refer them directly in your source code as shown in BraintreeConfig.

Database Setup

Using any MySQL client, CREATE new database called wedemy (any name is OK), with charset utf8mb4. Then follow carefully the rest of instructions in HELP.md, for both MySQL and Redis.

Quick Start πŸš€

With Maven (natively)

Assuming you have requirements listed above, and both your Dbs are running. Using your Terminal, execute the commands below. That's it! Server will be available at http://localhost:9000

./mvnw clean package
java -jar target/wedemyserver.jar

With Docker

I have attached Dockerfile for the Spring server only. You will need to set up MySQL & Redis separately. Refer to official Docker docs on how to pass Env variables.

  docker build -t wedemy-server .
  docker run --name "wedemy" -d -p9000:9000 wedemy-server

TipπŸ’‘ : If using Docker Desktop (latest), before starting container, you can fill in the ENV vars in the GUI directly. See screenshot

Deploying your App 🌍

This App can be easily deployed within few minutes, straight from GitHub to your Cloud PaaS of choice. You can either use the Dockerfile provided, or as a pure Java app. Popular PaaS with CI/CD for Java include: Heroku, AWS ElasticBeanstalk, Google App Engine, Azure Web Apps. The following may require a Dockerfile: Dokku, Railway, Render.com, Fly.io. Please note, you will also need a separate MySQL & Redis instance!

Payments Handling

All payments are securely handled by Braintree Payments (owned by PayPal), which also supports cards, Apple Pay, GooglePay, Venmo and many other methods. This project implements Credit-Card and PayPal Checkout only, in Sandbox (Dev) mode: No actual money is deducted at Checkout. Make sure you obtain a set of 3 API Keys from your own Braintree Dev Account and store them as ENV variables: BT_MERCHANT_ID, BT_PUBLIC_KEY and BT_PRIVATE_KEY. For Braintree tutorials and samples, please check their official docs.

License

MIT License


Footnotes

  1. In production, for Browser clients, ensure both your Backend and Frontend share the same ROOT domain (same-site policy), AND set property session.cookie.Secure=true (strictly https) for Session Cookies to work properly. Learn more at WebDev. Alternatively, you can replace Cookies entirely with special Header X-AUTH-TOKEN (by Spring; expires too). See file SecurityConfig.java. ↩