> KeepCoding Projects - Web 18: 📁 repos-kc-web-18.md
> Select your Language: Spanish 🔄 German
In order to practice and demonstrate the knowledge acquired in virtual classes, this project consists of developing an SSR (EJS) application for a second-hand items marketplace called Nodepop. The service maintains products for sale and allows searching with filters by various criteria.
- Node.js: event-driven model, V8 engine, version management with nvm/nvs, and package management with NPM/NPX.
- Advanced JavaScript: hoisting, scope (var/let/const), prototypes and classes, callbacks, asynchronicity with promises andasync/await.
- Event Loop and EventEmitter in Node.js for event handling.
- Modularization with CommonJS (require/module.exports) and ES Modules (import/export).
- MVC Architecture with Express and EJS templates; usage of Express Generator.
- Express.js: REST routes (GET,POST,PUT,DELETE), parameters (req.params,req.query,req.body), middlewares (cookie-parser, express-validator), error handling and responses (res.json,res.render, etc.).
- SQL Databases (MySQL/MariaDB) with mysql2/promiseand Docker; basic CRUD queries.
- ORMs: usage and comparison of Sequelize, TypeORM, Prisma, and Mikro-ORM.
- MongoDB (official driver): advanced CRUD operations (operators, geospatial queries, transactions); Mongoose as an ODM to define schemas, validations, methods, pagination, and geospatial indexes.
- Authentication: Basic HTTP Auth and session/cookie-based authentication (cookie anatomy and session storage).
- Password Security: using bcrypt, scrypt, and argon2 (instead of PBKDF2).
- Development Tools: Docker for reproducible environments, nodemon and cross-env for automatic reload and environment variables in development.
- Each post shows an image (or placeholder), name, description, price, and buy/sell indicator.
- Retrieved via
 GET /api/v1/adverts
 with optional filters:name=,sale=,price=,tags=,skip=,limit=,sort=.
- UI states: Empty (no posts), Loading, Error, Success (display list).
- Each post is clickable and leads to /posts/:id.
- If the user is logged in (token present), a “Create Post” button appears → /posts/new.
- Displays an image (or placeholder), name, description, price, buy/sell status, tags, and owner.
- Retrieved via
 GET /api/v1/adverts/:id
 Returns 404 if not found.
- UI states: Empty (404), Loading, Error, Success (display details).
- If the authenticated user is the owner, a “Delete” button appears →
 DELETE /api/v1/adverts/:id
 with confirmation.
- Accessible only if logged in; otherwise redirects to /postswith a notice.
- Form fields: Photo (optional), Name*, Description*, Price*, Buy/Sell*, Tags*.
- On submit:
 POST /api/v1/adverts
 (headerAuthorization: Bearer <token>), body asmultipart/form-dataor JSON.
- UI states: Loading, Error (validation or server), Success (redirect to /posts/:id).
- Form fields: Email*, Password*, (Remember session).
- POST /api/auth/login
 payload- { "email": "user@example.com", "password": "********" }.
- UI states: Loading, Error (invalid credentials), Success (save token and redirect to /posts).
- Similar to login, with Email*, Password*, Confirm Password*.
- POST /api/auth/signup
 payload- { "email": "new@example.com", "password": "********" }.
- UI states: Loading, Error (email taken or validation), Success (save token and redirect or go to login).
- Pagination in listing: ?limit=10&skip=<offset>, “Previous”/“Next” buttons.
- Dynamic search: input with debounce querying
 GET /api/v1/adverts?name=.
- Post editing (owner only): prefilled form at /posts/:id/edit,
 PUT /api/v1/adverts/:id.
- Filtering by static tags: checkboxes or dropdown with tags (work,lifestyle,motor,mobile).
- Dynamic tags: get list from
 GET /api/v1/adverts/tags
 and build frontend filter.
- The initDB.jsscript must include sample users and products for testing.
- For filters, build a filtersobject based on received parameters and pass it to
 Product.find(filters)
 along with pagination and sorting options.
- When sending arrays (for example, tags), ensure to use JSON in the request body.
- Languages: EJS, CSS, JavaScript.
- Notable Dependencies (Node.js): express, eslint, nodemon, mongoose, morgan, and multer.
- Node.js (tested on version v22.15.1)
- Git (tested on version 2.47.1.windows.1)
- Visual Studio Code (tested on version 1.99.0)
- MongoDB (tested on version 8.0.5)
- NoSQLBooster for MongoDB (tested on version 9.1.5)
- Live Server (VS Code extension, optional)
git clone https://github.com/pablo-sch/keepcoding-04-node-backend.git> View Cloning Demo in VSCode: 🎥 Gif Demo
Note: Make sure MongoDB is running on your local machine.
Then, follow these steps:
# Install project dependencies.
npm install
# Initialize the database (only required on first deployment).
npm run initDB
# Run the project in development mode.
npm run dev
npx nodemon .\bin\www> Project Preview: 👀 Preview
Project licensed under the MIT License. Free to use and distribute with attribution. External contributions are not accepted, but suggestions are welcome.