π€ Heads-up!
The backend is hosted on Railway's free tier, which puts the server to sleep after periods of inactivity. This causes the first request to take few seconds to spin the service back up.
-
Open the backend link first to wake up the server:
π https://bikepartsapibackend-production.up.railway.app/api/v1/bikeparts/ -
Wait for the backend to finish loading (it may show a blank or JSON response β thatβs okay).
-
Once the backend is awake, open the frontend app:
π https://case-study-app.netlify.app/
β Youβll now be able to use the full application with a responsive backend.
π» Disclaimer:
β οΈ BIG APOLOGIES :(β οΈ Due to the limitations of my PC (i work on corporate laptop where i do not have root access) this project runs on older software versions for compatibility. I realize this is not compliant with the requirements of the case study to use latest features of most up to date software, but i working on the case study over weekend gave me no control over my environment.
| Tool | Version |
|---|---|
| Java | OpenJDK 1.8.0 (Java 8) |
| Node.js | v14.15.4 |
All configurations are tailored to these versions. Using others may cause errors.
A full-stack application for managing bicycle parts, built as part of a developer case study. It includes:
- A Java Spring Boot REST API backend
- A React (Vite + Zustand + Tailwind) frontend
-
π Frontend (Netlify):
https://case-study-app.netlify.app/ -
π§ Backend (Railway):
https://bikepartsapibackend-production.up.railway.app/api/v1/bikeparts
- β Full CRUD Operations β Create, Read, Update, Delete articles
- π§Ύ Modal-Based Forms β Seamlessly add/edit articles with automatic article number generation
βοΈ List Sorting β Ascending / Descending / None for Article Number and Name- π Multi-Select Filtering β By Article Category, Bicycle Category, and Material
- π Client-Side Pagination β 10 items per page
- Language: Java 8 (OpenJDK 1.8.0)
- Framework: Spring Boot
- API: RESTful
- Database: PostgreSQL (Production) / H2 (Local)
- ORM & DAO: Spring Data JPA, Hibernate
- Build Tool: Maven
- Testing: JUnit 5, Mockito
- Framework: React 17
- Build Tool: Vite
- Styling: Tailwind CSS
- State Management: Zustand
- API: Axios (with global interceptors)
- Routing: React Router DOM
- Testing: Jest, React Testing Library
- Java JDK 8
- Node.js v14.15.4
- npm
cd backend
mvn spring-boot:runRuns on http://localhost:8080
π Frontend
cd frontend/bike-parts-ui
npm install
npm run startRuns on http://localhost:3000
β Running Tests Backend
cd backend
mvn testFrontend
cd frontend/bike-parts-ui
npm test- Axios interceptors for API failures
- React Error Boundaries for rendering issues
- Popup notifications for user feedback
- Zustand store separates state logic from UI
- Improves scalability and maintainability
- Lazy Loading: Form modal is dynamically imported using
React.lazyandSuspense - Efficient Rendering:
React.memoprevents unnecessary re-renders of pure components
Deployed from a single repository:
- Frontend: Deployed on Netlify
- Backend: Deployed on Railway