CourseCompass – NUS Course Planning Platform
Overview: Full-stack web application showcasing backend service design, database optimization, and API-driven architecture for course planning at NUS.
Tech Stack: Java Spring Boot | PostgreSQL | React (Vite, Shadcn/UI) | GitHub Actions + Render
Backend Highlights:
Designed and implemented RESTful APIs for course retrieval, search, and prerequisite validation.
Implemented secure Google OAuth 2.0 authentication and managed user sessions efficiently.
Optimized PostgreSQL schema for fast queries and reliable data storage.
Integrated unit and end-to-end testing (Vitest + Playwright) to ensure backend correctness and service reliability.
Automated CI/CD pipeline with GitHub Actions and Render for build, test, and deployment.
Links:
GitHub: https://github.com/e-hua/CourseCompass-demo/
Live Demo: https://coursecompass-demo-frontend.onrender.com/
id,userName,email,major,currentSemesterIndex,GPA- Relationships:
takenCourses(TakenCourse[]),courseRatings(CourseRating[])
id,semesterIndex,letterGrade,units,courseCode
id,courseCode,difficulty,workload,enjoyability,createdAt,updatedAt
courseCode,courseTitle,units,semesters[],averageDifficulty,averageWorkload,averageEnjoyability,ratingCount
commentId,content, linked to TakenCourse / parent comment
GET /api/users/{id}→ Fetch user profile with taken courses & ratingsPOST /api/user/update→ Update user profile info (semesterIndex, userName)
GET /api/courses→ List all coursesGET /api/courses/{id}→ Course details with ratingsPOST /api/courses→ Create new courseGET /api/coursePreviews→ Paginated course previews with filters (faculty, semester, SU, sort)
GET /api/takencourses→ List user’s taken coursesPOST /api/takencourses→ Add a taken coursePUT /api/takencourses/{id}→ Update a taken courseDELETE /api/takencourses/{id}→ Delete a taken course
GET /api/ratings→ List all ratingsGET /api/ratings/{id}→ Fetch single ratingPOST /api/ratings→ Create a ratingPUT /api/ratings/{id}→ Update a rating
POST /api/comments→ Create commentPUT /api/comments→ Update commentDELETE /api/comments→ Delete commentPOST /api/commentReplies→ Reply to commentGET /api/comments/{courseCode}→ List comments for a courseGET /api/commentReplies/{commentCode}→ List replies for a comment