Backend-focused project showcasing real-world authentication, subscription, and payment workflows.
A backend-focused Resume Builder system designed to handle secure authentication, resume management, subscription-based access, payments, cloud storage, and email workflows.
Built to understand and implement real-world backend architecture and business logic, beyond basic CRUD applications.
This project implements the backend of a Resume Builder application, focusing on secure user management, resume CRUD operations, and subscription-based feature access.
Users can create and manage resumes, upload images, unlock premium features through payments, and share resumes via email — all handled through secure and well-structured REST APIs.
- User registration and login
- JWT-based authentication and authorization
- Email verification with token and expiry
- Secure access to protected endpoints
- Create, update, fetch, and delete resumes
- Structured resume sections (profile, education, skills, projects, experience, etc.)
- Ownership checks to ensure users access only their data
- Free and paid subscription plans
- Premium resume features restricted to paid users
- Secure payment workflow:
- Order creation
- Payment verification
- Automatic subscription upgrade
- Image uploads using Cloudinary
- Resume thumbnails and profile image handling
- Email verification and resume sharing with PDF attachments
POST /api/auth/register POST /api/auth/login GET /api/auth/verify-email
POST /api/resumes GET /api/resumes GET /api/resumes/{id} PUT /api/resumes/{id} DELETE /api/resumes/{id}
POST /api/payments/create-order POST /api/payments/verify GET /api/payments/history
POST /api/email/send-resume
This project uses Swagger / OpenAPI for interactive API documentation.
Once the application is running, Swagger UI is available at:
http://localhost:8080/swagger-ui/index.html
- Call Login API to get JWT token
- Click Authorize
- Enter: Bearer
controller → request handling service → business logic repository → database access security → JWT & authorization dto → request / response models exception → global error handling
Configure sensitive values using environment variables or application.properties:
spring.data.mongodb.uri=
jwt.secret=
cloudinary.api.key=
cloudinary.api.secret=
razorpay.key.id=
razorpay.key.secret=
spring.mail.username=
spring.mail.password=This project was built to move beyond basic CRUD applications and understand how real backend systems handle authentication, payments, subscriptions, and secure data access.
Rustam Poonia Backend Developer | Java & Spring Boot
⭐ If you find this project useful, feel free to star the repository.