Vinyl Store
Built a monolithic NestJS backend for an online vinyl store: public catalog with search, sorting, and pagination, product details, reviews, Stripe payments, email notifications, and protected admin routes. MySQL holds the data, Redis caches reads, and Swagger documents the API. NDA - source code is not publicly available.
Context
This project is the backend only. During the LeverX Node.js program, under mentor supervision, I built a REST API for an online vinyl record store. There is no storefront in the repo. Public browsing, accounts, checkout, and admin operations all live in one NestJS application. It is a monolith, not a set of separate services.
What the API does
Anyone can browse vinyl records without an account. The catalog supports pagination, search, and sorting, and each record has a detail payload for a product page. Signed-in users can leave reviews. Checkout goes through Stripe, and Nodemailer sends email for transactions and other tracked events.
How the monolith is built
The app is one NestJS and TypeScript codebase on Node.js. Modules split users, the catalog, reviews, payments, and admin, and they run in a single process. MySQL is the primary database. Redis caches hot reads so catalog and account lookups stay cheap. Docker runs the local dependencies. Swagger documents the REST API.
Accounts and admin routes
Authentication uses a user and admin SSO flow. Profile routes stay protected, so a user can manage their own account without opening admin actions. Separate admin routes manage vinyl records, reviews, and system logs, and those routes stay closed to regular users.
Payments, email, and catalog data
The Stripe integration covers the payment flow and transaction handling. Nodemailer sends the related emails. The catalog was filled with a data migration and three external APIs, so the store had records to browse and buy without entering them by hand.
Tests and checks
Unit and integration tests run with Jest and node:test. ESLint, Prettier, and Husky keep the repo consistent before a commit, and a CI pipeline runs the automated checks.