├── .gitignore ├── .prettierrc ├── README.md ├── attachments ├── 05 Express.js │ ├── add-product.html │ └── shop.html ├── 06 Dynamic Content Templating │ └── 00-updated-starting-project.zip ├── 07 MVC │ ├── 00-starting-setup.zip │ └── path.js ├── 08 Enhancements │ └── 00-starting-setup.zip ├── 09 Dynamic Routes Advanced Models │ ├── 00-starting-setup.zip │ └── adjustments.zip ├── 10 SQL Introduction │ └── 00-starting-setup.zip ├── 11 Sequelize │ └── 00-starting-setup.zip ├── 12 NoSQL and MongoDB │ └── 00-starting-setup.zip ├── 13 Mongoose │ └── 00-starting-setup.zip ├── 14 Sessions and Cookies │ └── 00-starting-setup.zip ├── 15 Authentication │ └── 00-starting-setup.zip ├── 16 Sending Emails │ └── 00-starting-setup.zip ├── 17 Advanced Auth │ └── 00-starting-setup.zip ├── 18 Validation │ └── 00-starting-setup.zip ├── 19 Error Handling │ └── 00-starting-setup.zip ├── 20 Upload Download │ └── 00-starting-setup.zip ├── 21 Pagination │ └── 00-starting-setup.zip ├── 22 Async Requests │ └── 00-starting-setup.zip ├── 23 Payments │ └── 00-starting-setup.zip ├── 25 Rest Application │ └── 00-starting-setup.zip ├── 26 Async Await │ └── 00-starting-setup.zip ├── 27 Websockets │ ├── 00-starting-setup.zip │ ├── add-post.js │ └── update-post.js ├── 28 GraphQL │ ├── 00-starting-setup.zip │ └── create-post-code.js ├── 29 Deployment │ └── 00-starting-setup.zip ├── 30 Testing │ ├── 00-starting-setup.zip │ └── user-id.txt ├── 32 Modern NodeJS │ └── 00-starting-setup.zip └── 35 Deno App │ └── 00-starting-setup.zip ├── code ├── 03 Basics │ ├── 01-routing-requests │ │ └── app.js │ ├── 02-parsing-request-bodies │ │ └── app.js │ ├── 03-blocking-non-blocking │ │ └── app.js │ ├── 04-using-node-modules │ │ ├── app.js │ │ └── routes.js │ └── zz-assignment-01-solution │ │ └── app.js ├── 04 Workflow Debugging │ ├── 01-understanding-npm-scripts │ │ ├── .gitignore │ │ ├── app.js │ │ ├── package.json │ │ └── routes.js │ ├── 02-using-nodemon │ │ ├── .gitignore │ │ ├── app.js │ │ ├── package.json │ │ └── routes.js │ └── 03-finished │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ └── routes.js ├── 05 Express.js │ ├── 01-adding-middleware │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ └── package.json │ ├── 02-behind-the-scenes │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ └── package.json │ ├── 03-handling-different-routes │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ └── package.json │ ├── 04-limiting-middleware │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ └── package.json │ ├── 05-express-router │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ └── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ ├── 06-filtering-paths │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ └── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ ├── 07-creating-html-pages │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ └── views │ │ │ ├── add-product.html │ │ │ └── shop.html │ ├── 08-serving-html-pages │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ └── views │ │ │ ├── add-product.html │ │ │ └── shop.html │ ├── 09-returning-404-page │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ └── views │ │ │ ├── 404.html │ │ │ ├── add-product.html │ │ │ └── shop.html │ ├── 10-using-helper-function │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.html │ │ │ ├── add-product.html │ │ │ └── shop.html │ ├── 11-styling-pages │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.html │ │ │ ├── add-product.html │ │ │ └── shop.html │ ├── 12-serving-files-statically │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.html │ │ │ ├── add-product.html │ │ │ └── shop.html │ ├── zz-assignment-1-solution │ │ ├── .gitignore │ │ ├── app.js │ │ └── package.json │ └── zz-assignment-2-solution │ │ ├── .gitignore │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ └── main.js │ │ ├── routes │ │ └── index.js │ │ └── views │ │ ├── index.html │ │ └── users.html ├── 06 Dynamic Content Templating │ ├── 00-updated-starting-project │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.html │ │ │ ├── add-product.html │ │ │ └── shop.html │ ├── 01-sharing-data-requests │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.html │ │ │ ├── add-product.html │ │ │ └── shop.html │ ├── 02-adding-pug │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.html │ │ │ ├── add-product.html │ │ │ ├── shop.html │ │ │ └── shop.pug │ ├── 03-outputting-dynamic-content │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.html │ │ │ ├── add-product.html │ │ │ ├── shop.html │ │ │ └── shop.pug │ ├── 04-pug-finished │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.html │ │ │ ├── 404.pug │ │ │ ├── add-product.html │ │ │ ├── add-product.pug │ │ │ ├── layouts │ │ │ └── main-layout.pug │ │ │ ├── shop.html │ │ │ └── shop.pug │ ├── 05-adding-layout-hbs │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.hbs │ │ │ ├── 404.html │ │ │ ├── 404.pug │ │ │ ├── add-product.hbs │ │ │ ├── add-product.html │ │ │ ├── add-product.pug │ │ │ ├── layouts │ │ │ ├── main-layout.hbs │ │ │ └── main-layout.pug │ │ │ ├── shop.hbs │ │ │ ├── shop.html │ │ │ └── shop.pug │ ├── 06-layout-partials │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 404.hbs │ │ │ ├── 404.html │ │ │ ├── 404.pug │ │ │ ├── add-product.ejs │ │ │ ├── add-product.hbs │ │ │ ├── add-product.html │ │ │ ├── add-product.pug │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ ├── layouts │ │ │ ├── main-layout.hbs │ │ │ └── main-layout.pug │ │ │ ├── shop.ejs │ │ │ ├── shop.hbs │ │ │ ├── shop.html │ │ │ └── shop.pug │ ├── 07-finished │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── add-product.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop.ejs │ └── zz-assignment-solutions │ │ ├── assignment-ejs-and-final-solution │ │ ├── .gitignore │ │ ├── app.js │ │ ├── package.json │ │ └── views │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ └── head.ejs │ │ │ ├── index.ejs │ │ │ ├── index.hbs │ │ │ ├── index.pug │ │ │ ├── layouts │ │ │ ├── main-layout.hbs │ │ │ └── main-layout.pug │ │ │ ├── users.ejs │ │ │ ├── users.hbs │ │ │ └── users.pug │ │ ├── assignment-handlebars-solution │ │ ├── .gitignore │ │ ├── app.js │ │ ├── package.json │ │ └── views │ │ │ ├── index.pug │ │ │ ├── layouts │ │ │ └── main-layout.pug │ │ │ └── users.pug │ │ └── assignment-pug-solution │ │ ├── .gitignore │ │ ├── app.js │ │ ├── package.json │ │ └── views │ │ ├── index.pug │ │ ├── layouts │ │ └── main-layout.pug │ │ └── users.pug ├── 07 MVC │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── add-product.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop.ejs │ ├── 01-finishing-controller │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── error.js │ │ │ └── products.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── add-product.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop.ejs │ ├── 02-product-model │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── error.js │ │ │ └── products.js │ │ ├── models │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── add-product.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop.ejs │ ├── 03-fetching-data │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── error.js │ │ │ └── products.js │ │ ├── models │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── add-product.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop.ejs │ └── 04-refactor-file-storage │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── error.js │ │ └── products.js │ │ ├── models │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ └── css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ └── product.css │ │ ├── routes │ │ ├── admin.js │ │ └── shop.js │ │ ├── util │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── add-product.ejs │ │ ├── includes │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop.ejs ├── 08 Enhancements │ ├── 01-working-on-navigation │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── error.js │ │ │ └── products.js │ │ ├── models │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── add-product.ejs │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── product-details.ejs │ │ │ └── product-list.ejs │ ├── 02-registering-routes │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── models │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── add-product.ejs │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── product-details.ejs │ │ │ └── product-list.ejs │ ├── 03-storing-products │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── models │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── add-product.ejs │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── product-details.ejs │ │ │ └── product-list.ejs │ ├── 04-editing-deleting │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── models │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ └── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── add-product.ejs │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── product-details.ejs │ │ │ └── product-list.ejs │ └── 05-finished │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── error.js │ │ └── shop.js │ │ ├── models │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ └── css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ └── product.css │ │ ├── routes │ │ ├── admin.js │ │ └── shop.js │ │ ├── util │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── add-product.ejs │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── includes │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-details.ejs │ │ └── product-list.ejs ├── 09 Dynamic Routes Advanced Models │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ └── products.json │ │ ├── models │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── add-product.ejs │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-extracting-params │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ └── products.json │ │ ├── models │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── add-product.ejs │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-loading-product-detail │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ └── products.json │ │ ├── models │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── add-product.ejs │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-rendering-product-detail │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ └── products.json │ │ ├── models │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── add-product.ejs │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 04-adding-cart-model │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── add-product.ejs │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 05-pre-populating-edit-data │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 06-editing-product-data │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 07-delete-product │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 08-deleting-cart-items │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 09-fixing-delete-bug │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── models │ │ ├── cart.js │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ └── shop.js │ │ ├── util │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 10 SQL Introduction │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-connecting-app │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-fetching-products │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-inserting-data │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 04-fetching-single-product │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── models │ │ ├── cart.js │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ └── shop.js │ │ ├── util │ │ ├── database.js │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 11 Sequelize │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-defining-model │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-inserting-data │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-getting-single-product │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 04-updating-products │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 05-deleting-products │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ └── product.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 06-one-to-many │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 07-creating-dummy-user │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 08-fetching-related-products │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 09-many-many │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 10-fetching-cart │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 11-retrieving-cart-items │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 12-deleting-cart-items │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 13-storing-order-items │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 14-reset-cart │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── models │ │ ├── cart-item.js │ │ ├── cart.js │ │ ├── order-item.js │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ └── shop.js │ │ ├── util │ │ ├── database.js │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 12 NoSQL and MongoDB │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-using-database-conn │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-fetching-products │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-fetching-single-product │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 04-update-product │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 05-deleting-products │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 06-fixing-add-product │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 07-storing-user │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── cart-item.js │ │ │ ├── cart.js │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 08-add-to-cart │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 09-displaying-cart │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 10-deleting-cart-items │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 11-adding-relational-order │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order-item.js │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 12-removing-deleted-cart-items │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── models │ │ ├── order-item.js │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ └── shop.js │ │ ├── util │ │ ├── database.js │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 13 Mongoose │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── database.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-connecting-mongoose │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-saving-data │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-fetching-products │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 04-deleting-products │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 05-adding-user-model │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 06-using-relations │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 07-working-on-cart │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 08-loading-cart │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 09-displaying-orders │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ └── shop.js │ │ ├── util │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 14 Sessions and Cookies │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-creating-login │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ └── login.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-request-solution │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ └── login.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-configuring-cookies │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ └── login.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 04-using-session-middleware │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ └── login.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 05-mongodb-sessions │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ └── login.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 06-required-assignment │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ └── login.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 07-deleting-cookie │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ └── login.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 08-fixing-bugs │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ └── login.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 09-tiny-improvements │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ └── login.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 15 Authentication │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-implement-auth-flow │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-encrypting-passwords │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-small-improvement │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 04-adding-signin │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 05-using-middleware-protect │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 06-adding-csrf │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 07-migrate-csrf-csrf │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 08-fixing-order-button │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 09-providing-user-feedback │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 10-styling-error-message │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 11-finishing-flash │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 12-additional-messages │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ ├── login.ejs │ │ └── signup.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 16 Sending Emails │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 01-sending-emails │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ ├── login.ejs │ │ └── signup.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 17 Advanced Auth │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-resetting-password │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-creating-token │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-password-reset-form │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 04-updating-password │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 05-editing-fail │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ ├── login.ejs │ │ ├── new-password.ejs │ │ ├── reset.ejs │ │ └── signup.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 18 Validation │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-basic-validation │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-using-error-messages │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-builtin-custom-validators │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 04-checking-field-equality │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 05-async-validation │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 06-required-assignment │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 07-keeping-input │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 08-validation-login │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 09-sanitize-data │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 10-validate-product-edit │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ ├── login.ejs │ │ ├── new-password.ejs │ │ ├── reset.ejs │ │ └── signup.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 19 Error Handling │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-error-theory │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── error-playground.js │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-returning-error-page │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-express-error-middleware │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 04-status-codes │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ └── products.json │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── 500.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ ├── login.ejs │ │ ├── new-password.ejs │ │ ├── reset.ejs │ │ └── signup.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 20 Upload Download │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-file-uploads │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-file-mimetype │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-serving-images-static │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 04-restricting-file-access │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ └── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 05-streaming-preloading │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ └── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 06-generating-pdfs │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ └── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 07-deleting-files │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ └── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 08-fixing-invoice-links │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ ├── invoices │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ └── products.json │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ ├── file.js │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── 500.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ ├── login.ejs │ │ ├── new-password.ejs │ │ ├── reset.ejs │ │ └── signup.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ └── navigation.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 21 Pagination │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-adding-pagination-links │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-preparing-server │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-dynamic-page-btns │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ └── navigation.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 04-reusing-pagination-logic │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ ├── invoices │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ └── products.json │ │ ├── images │ │ └── 1711906727751-wallpaper_212325025.jpg │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ ├── file.js │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── 500.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ ├── login.ejs │ │ ├── new-password.ejs │ │ ├── reset.ejs │ │ └── signup.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ ├── navigation.ejs │ │ └── pagination.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 22 Async Requests │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ ├── navigation.ejs │ │ │ └── pagination.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-adding-client-js │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── images │ │ │ └── 1711906727751-wallpaper_212325025.jpg │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ ├── admin.js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ ├── navigation.ejs │ │ │ └── pagination.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 02-manipulating-dom │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ ├── invoices │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ └── products.json │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ ├── admin.js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ ├── file.js │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── 500.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ ├── login.ejs │ │ ├── new-password.ejs │ │ ├── reset.ejs │ │ └── signup.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ ├── navigation.ejs │ │ └── pagination.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 23 Payments │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ ├── admin.js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ ├── navigation.ejs │ │ │ └── pagination.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-adding-checkout │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ ├── admin.js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ ├── navigation.ejs │ │ │ └── pagination.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 02-using-stripe │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ ├── invoices │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ └── products.json │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ ├── admin.js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ ├── file.js │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── 500.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ ├── login.ejs │ │ ├── new-password.ejs │ │ ├── reset.ejs │ │ └── signup.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ ├── navigation.ejs │ │ └── pagination.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 24 Rest Api │ ├── 01-sending-req-res │ │ ├── app.js │ │ ├── controllers │ │ │ └── feed.js │ │ ├── package.json │ │ └── routes │ │ │ └── feed.js │ └── 02-sending-post-req │ │ ├── app.js │ │ ├── codepen.html │ │ ├── controllers │ │ └── feed.js │ │ ├── package.json │ │ └── routes │ │ └── feed.js ├── 25 Rest Application │ ├── 00-starting-setup │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ └── feed.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 01-fetching-posts │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 02-post-model │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── models │ │ │ │ └── post.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 03-storing-posts │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── models │ │ │ │ └── post.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 04-static-images │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── models │ │ │ │ └── post.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 05-fetching-single-post │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── models │ │ │ │ └── post.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 06-uploading-images │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── models │ │ │ │ └── post.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 07-updating-posts │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── models │ │ │ │ └── post.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 08-adding-pagination │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── models │ │ │ │ └── post.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 09-logging-users-in │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 10-auth-middleware │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 11-clearing-relations │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ └── 12-required-assignment │ │ ├── backend │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ └── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ │ └── frontend │ │ ├── .gitignore │ │ ├── package.json │ │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ └── manifest.json │ │ └── src │ │ ├── App.css │ │ ├── App.js │ │ ├── components │ │ ├── Backdrop │ │ │ ├── Backdrop.css │ │ │ └── Backdrop.js │ │ ├── Button │ │ │ ├── Button.css │ │ │ └── Button.js │ │ ├── ErrorHandler │ │ │ └── ErrorHandler.js │ │ ├── Feed │ │ │ ├── FeedEdit │ │ │ │ └── FeedEdit.js │ │ │ └── Post │ │ │ │ ├── Post.css │ │ │ │ └── Post.js │ │ ├── Form │ │ │ └── Input │ │ │ │ ├── FilePicker.js │ │ │ │ ├── Input.css │ │ │ │ └── Input.js │ │ ├── Image │ │ │ ├── Avatar.css │ │ │ ├── Avatar.js │ │ │ ├── Image.css │ │ │ └── Image.js │ │ ├── Layout │ │ │ ├── Layout.css │ │ │ └── Layout.js │ │ ├── Loader │ │ │ ├── Loader.css │ │ │ └── Loader.js │ │ ├── Logo │ │ │ ├── Logo.css │ │ │ └── Logo.js │ │ ├── Modal │ │ │ ├── Modal.css │ │ │ └── Modal.js │ │ ├── Navigation │ │ │ ├── MainNavigation │ │ │ │ ├── MainNavigation.css │ │ │ │ └── MainNavigation.js │ │ │ ├── MobileNavigation │ │ │ │ ├── MobileNavigation.css │ │ │ │ └── MobileNavigation.js │ │ │ ├── MobileToggle │ │ │ │ ├── MobileToggle.css │ │ │ │ └── MobileToggle.js │ │ │ └── NavigationItems │ │ │ │ ├── NavigationItems.css │ │ │ │ └── NavigationItems.js │ │ ├── Paginator │ │ │ ├── Paginator.css │ │ │ └── Paginator.js │ │ └── Toolbar │ │ │ ├── Toolbar.css │ │ │ └── Toolbar.js │ │ ├── hoc │ │ └── with-router.js │ │ ├── index.css │ │ ├── index.js │ │ ├── pages │ │ ├── Auth │ │ │ ├── Auth.css │ │ │ ├── Auth.js │ │ │ ├── Login.js │ │ │ └── Signup.js │ │ └── Feed │ │ │ ├── Feed.css │ │ │ ├── Feed.js │ │ │ └── SinglePost │ │ │ ├── SinglePost.css │ │ │ └── SinglePost.js │ │ └── util │ │ ├── image.js │ │ └── validators.js ├── 26 Async Await │ ├── 00-starting-setup │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 01-transforming-then-catch │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 02-required-assignment │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ ├── 1712068003406-duck.png │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ └── 03-finished │ │ ├── backend │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ └── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ │ └── frontend │ │ ├── .gitignore │ │ ├── package.json │ │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ └── manifest.json │ │ └── src │ │ ├── App.css │ │ ├── App.js │ │ ├── components │ │ ├── Backdrop │ │ │ ├── Backdrop.css │ │ │ └── Backdrop.js │ │ ├── Button │ │ │ ├── Button.css │ │ │ └── Button.js │ │ ├── ErrorHandler │ │ │ └── ErrorHandler.js │ │ ├── Feed │ │ │ ├── FeedEdit │ │ │ │ └── FeedEdit.js │ │ │ └── Post │ │ │ │ ├── Post.css │ │ │ │ └── Post.js │ │ ├── Form │ │ │ └── Input │ │ │ │ ├── FilePicker.js │ │ │ │ ├── Input.css │ │ │ │ └── Input.js │ │ ├── Image │ │ │ ├── Avatar.css │ │ │ ├── Avatar.js │ │ │ ├── Image.css │ │ │ └── Image.js │ │ ├── Layout │ │ │ ├── Layout.css │ │ │ └── Layout.js │ │ ├── Loader │ │ │ ├── Loader.css │ │ │ └── Loader.js │ │ ├── Logo │ │ │ ├── Logo.css │ │ │ └── Logo.js │ │ ├── Modal │ │ │ ├── Modal.css │ │ │ └── Modal.js │ │ ├── Navigation │ │ │ ├── MainNavigation │ │ │ │ ├── MainNavigation.css │ │ │ │ └── MainNavigation.js │ │ │ ├── MobileNavigation │ │ │ │ ├── MobileNavigation.css │ │ │ │ └── MobileNavigation.js │ │ │ ├── MobileToggle │ │ │ │ ├── MobileToggle.css │ │ │ │ └── MobileToggle.js │ │ │ └── NavigationItems │ │ │ │ ├── NavigationItems.css │ │ │ │ └── NavigationItems.js │ │ ├── Paginator │ │ │ ├── Paginator.css │ │ │ └── Paginator.js │ │ └── Toolbar │ │ │ ├── Toolbar.css │ │ │ └── Toolbar.js │ │ ├── hoc │ │ └── with-router.js │ │ ├── index.css │ │ ├── index.js │ │ ├── pages │ │ ├── Auth │ │ │ ├── Auth.css │ │ │ ├── Auth.js │ │ │ ├── Login.js │ │ │ └── Signup.js │ │ └── Feed │ │ │ ├── Feed.css │ │ │ ├── Feed.js │ │ │ └── SinglePost │ │ │ ├── SinglePost.css │ │ │ └── SinglePost.js │ │ └── util │ │ ├── image.js │ │ └── validators.js ├── 27 Websockets │ ├── 00-starting-setup │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 01-connecting-client │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ ├── 1712068003406-duck.png │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 02-synchronizing-posts │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ ├── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ └── socket.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 03-updating-posts-all │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ ├── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ └── socket.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ └── 04-deleting-posts-all │ │ ├── backend │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ │ └── socket.js │ │ └── frontend │ │ ├── .gitignore │ │ ├── package.json │ │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ └── manifest.json │ │ └── src │ │ ├── App.css │ │ ├── App.js │ │ ├── components │ │ ├── Backdrop │ │ │ ├── Backdrop.css │ │ │ └── Backdrop.js │ │ ├── Button │ │ │ ├── Button.css │ │ │ └── Button.js │ │ ├── ErrorHandler │ │ │ └── ErrorHandler.js │ │ ├── Feed │ │ │ ├── FeedEdit │ │ │ │ └── FeedEdit.js │ │ │ └── Post │ │ │ │ ├── Post.css │ │ │ │ └── Post.js │ │ ├── Form │ │ │ └── Input │ │ │ │ ├── FilePicker.js │ │ │ │ ├── Input.css │ │ │ │ └── Input.js │ │ ├── Image │ │ │ ├── Avatar.css │ │ │ ├── Avatar.js │ │ │ ├── Image.css │ │ │ └── Image.js │ │ ├── Layout │ │ │ ├── Layout.css │ │ │ └── Layout.js │ │ ├── Loader │ │ │ ├── Loader.css │ │ │ └── Loader.js │ │ ├── Logo │ │ │ ├── Logo.css │ │ │ └── Logo.js │ │ ├── Modal │ │ │ ├── Modal.css │ │ │ └── Modal.js │ │ ├── Navigation │ │ │ ├── MainNavigation │ │ │ │ ├── MainNavigation.css │ │ │ │ └── MainNavigation.js │ │ │ ├── MobileNavigation │ │ │ │ ├── MobileNavigation.css │ │ │ │ └── MobileNavigation.js │ │ │ ├── MobileToggle │ │ │ │ ├── MobileToggle.css │ │ │ │ └── MobileToggle.js │ │ │ └── NavigationItems │ │ │ │ ├── NavigationItems.css │ │ │ │ └── NavigationItems.js │ │ ├── Paginator │ │ │ ├── Paginator.css │ │ │ └── Paginator.js │ │ └── Toolbar │ │ │ ├── Toolbar.css │ │ │ └── Toolbar.js │ │ ├── hoc │ │ └── with-router.js │ │ ├── index.css │ │ ├── index.js │ │ ├── pages │ │ ├── Auth │ │ │ ├── Auth.css │ │ │ ├── Auth.js │ │ │ ├── Login.js │ │ │ └── Signup.js │ │ └── Feed │ │ │ ├── Feed.css │ │ │ ├── Feed.js │ │ │ └── SinglePost │ │ │ ├── SinglePost.css │ │ │ └── SinglePost.js │ │ └── util │ │ ├── image.js │ │ └── validators.js ├── 28 GraphQL │ ├── 00-starting-setup │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ ├── routes │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ └── socket.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 01-first-query │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 02-mutation-schema │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 03-mutation-resolver │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 04-handling-errors │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 05-connecting-frontend │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 06-login-functionality │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 07-creating-posts │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── is-auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 08-create-post-query │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 09-post-queries │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 10-adding-pagination │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 11-uploading-images │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 12-viewing-single-post │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ └── package.json │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ ├── 13-update-delete-post │ │ ├── backend │ │ │ ├── app.js │ │ │ ├── controllers │ │ │ │ ├── auth.js │ │ │ │ └── feed.js │ │ │ ├── graphql │ │ │ │ ├── resolvers.js │ │ │ │ └── schema.js │ │ │ ├── images │ │ │ │ └── duck.png │ │ │ ├── middleware │ │ │ │ └── auth.js │ │ │ ├── models │ │ │ │ ├── post.js │ │ │ │ └── user.js │ │ │ ├── package.json │ │ │ └── util │ │ │ │ └── file.js │ │ └── frontend │ │ │ ├── .gitignore │ │ │ ├── package.json │ │ │ ├── public │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ └── manifest.json │ │ │ └── src │ │ │ ├── App.css │ │ │ ├── App.js │ │ │ ├── components │ │ │ ├── Backdrop │ │ │ │ ├── Backdrop.css │ │ │ │ └── Backdrop.js │ │ │ ├── Button │ │ │ │ ├── Button.css │ │ │ │ └── Button.js │ │ │ ├── ErrorHandler │ │ │ │ └── ErrorHandler.js │ │ │ ├── Feed │ │ │ │ ├── FeedEdit │ │ │ │ │ └── FeedEdit.js │ │ │ │ └── Post │ │ │ │ │ ├── Post.css │ │ │ │ │ └── Post.js │ │ │ ├── Form │ │ │ │ └── Input │ │ │ │ │ ├── FilePicker.js │ │ │ │ │ ├── Input.css │ │ │ │ │ └── Input.js │ │ │ ├── Image │ │ │ │ ├── Avatar.css │ │ │ │ ├── Avatar.js │ │ │ │ ├── Image.css │ │ │ │ └── Image.js │ │ │ ├── Layout │ │ │ │ ├── Layout.css │ │ │ │ └── Layout.js │ │ │ ├── Loader │ │ │ │ ├── Loader.css │ │ │ │ └── Loader.js │ │ │ ├── Logo │ │ │ │ ├── Logo.css │ │ │ │ └── Logo.js │ │ │ ├── Modal │ │ │ │ ├── Modal.css │ │ │ │ └── Modal.js │ │ │ ├── Navigation │ │ │ │ ├── MainNavigation │ │ │ │ │ ├── MainNavigation.css │ │ │ │ │ └── MainNavigation.js │ │ │ │ ├── MobileNavigation │ │ │ │ │ ├── MobileNavigation.css │ │ │ │ │ └── MobileNavigation.js │ │ │ │ ├── MobileToggle │ │ │ │ │ ├── MobileToggle.css │ │ │ │ │ └── MobileToggle.js │ │ │ │ └── NavigationItems │ │ │ │ │ ├── NavigationItems.css │ │ │ │ │ └── NavigationItems.js │ │ │ ├── Paginator │ │ │ │ ├── Paginator.css │ │ │ │ └── Paginator.js │ │ │ └── Toolbar │ │ │ │ ├── Toolbar.css │ │ │ │ └── Toolbar.js │ │ │ ├── hoc │ │ │ └── with-router.js │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ ├── Auth │ │ │ │ ├── Auth.css │ │ │ │ ├── Auth.js │ │ │ │ ├── Login.js │ │ │ │ └── Signup.js │ │ │ └── Feed │ │ │ │ ├── Feed.css │ │ │ │ ├── Feed.js │ │ │ │ └── SinglePost │ │ │ │ ├── SinglePost.css │ │ │ │ └── SinglePost.js │ │ │ └── util │ │ │ ├── image.js │ │ │ └── validators.js │ └── 14-pagination-bug │ │ ├── backend │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── graphql │ │ │ ├── resolvers.js │ │ │ └── schema.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ └── util │ │ │ └── file.js │ │ └── frontend │ │ ├── .gitignore │ │ ├── package.json │ │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ └── manifest.json │ │ └── src │ │ ├── App.css │ │ ├── App.js │ │ ├── components │ │ ├── Backdrop │ │ │ ├── Backdrop.css │ │ │ └── Backdrop.js │ │ ├── Button │ │ │ ├── Button.css │ │ │ └── Button.js │ │ ├── ErrorHandler │ │ │ └── ErrorHandler.js │ │ ├── Feed │ │ │ ├── FeedEdit │ │ │ │ └── FeedEdit.js │ │ │ └── Post │ │ │ │ ├── Post.css │ │ │ │ └── Post.js │ │ ├── Form │ │ │ └── Input │ │ │ │ ├── FilePicker.js │ │ │ │ ├── Input.css │ │ │ │ └── Input.js │ │ ├── Image │ │ │ ├── Avatar.css │ │ │ ├── Avatar.js │ │ │ ├── Image.css │ │ │ └── Image.js │ │ ├── Layout │ │ │ ├── Layout.css │ │ │ └── Layout.js │ │ ├── Loader │ │ │ ├── Loader.css │ │ │ └── Loader.js │ │ ├── Logo │ │ │ ├── Logo.css │ │ │ └── Logo.js │ │ ├── Modal │ │ │ ├── Modal.css │ │ │ └── Modal.js │ │ ├── Navigation │ │ │ ├── MainNavigation │ │ │ │ ├── MainNavigation.css │ │ │ │ └── MainNavigation.js │ │ │ ├── MobileNavigation │ │ │ │ ├── MobileNavigation.css │ │ │ │ └── MobileNavigation.js │ │ │ ├── MobileToggle │ │ │ │ ├── MobileToggle.css │ │ │ │ └── MobileToggle.js │ │ │ └── NavigationItems │ │ │ │ ├── NavigationItems.css │ │ │ │ └── NavigationItems.js │ │ ├── Paginator │ │ │ ├── Paginator.css │ │ │ └── Paginator.js │ │ └── Toolbar │ │ │ ├── Toolbar.css │ │ │ └── Toolbar.js │ │ ├── hoc │ │ └── with-router.js │ │ ├── index.css │ │ ├── index.js │ │ ├── pages │ │ ├── Auth │ │ │ ├── Auth.css │ │ │ ├── Auth.js │ │ │ ├── Login.js │ │ │ └── Signup.js │ │ └── Feed │ │ │ ├── Feed.css │ │ │ ├── Feed.js │ │ │ └── SinglePost │ │ │ ├── SinglePost.css │ │ │ └── SinglePost.js │ │ └── util │ │ ├── image.js │ │ └── validators.js ├── 29 Deployment │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── images │ │ │ └── 1711912263958-wallpaper_254869459.jpg │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ ├── admin.js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ ├── navigation.ejs │ │ │ └── pagination.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 01-using-env-variables │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── EXAMPLE__nodemon.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── images │ │ │ └── 1711912263958-wallpaper_254869459.jpg │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ ├── admin.js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ ├── navigation.ejs │ │ │ └── pagination.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 02-request-logging │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── EXAMPLE__nodemon.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ ├── admin.js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ ├── navigation.ejs │ │ │ └── pagination.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ ├── 03-ssl-server │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── launch.json │ │ ├── EXAMPLE__nodemon.json │ │ ├── app.js │ │ ├── controllers │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ ├── error.js │ │ │ └── shop.js │ │ ├── data │ │ │ ├── cart.json │ │ │ ├── invoices │ │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ │ └── products.json │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── order.js │ │ │ ├── product.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ │ ├── css │ │ │ │ ├── auth.css │ │ │ │ ├── cart.css │ │ │ │ ├── forms.css │ │ │ │ ├── main.css │ │ │ │ ├── orders.css │ │ │ │ └── product.css │ │ │ └── js │ │ │ │ ├── admin.js │ │ │ │ └── main.js │ │ ├── routes │ │ │ ├── admin.js │ │ │ ├── auth.js │ │ │ └── shop.js │ │ ├── server.cert │ │ ├── server.key │ │ ├── util │ │ │ ├── file.js │ │ │ └── path.js │ │ └── views │ │ │ ├── 404.ejs │ │ │ ├── 500.ejs │ │ │ ├── admin │ │ │ ├── edit-product.ejs │ │ │ └── products.ejs │ │ │ ├── auth │ │ │ ├── login.ejs │ │ │ ├── new-password.ejs │ │ │ ├── reset.ejs │ │ │ └── signup.ejs │ │ │ ├── includes │ │ │ ├── add-to-cart.ejs │ │ │ ├── end.ejs │ │ │ ├── head.ejs │ │ │ ├── navigation.ejs │ │ │ └── pagination.ejs │ │ │ └── shop │ │ │ ├── cart.ejs │ │ │ ├── checkout.ejs │ │ │ ├── index.ejs │ │ │ ├── orders.ejs │ │ │ ├── product-detail.ejs │ │ │ └── product-list.ejs │ └── 04-deployment-example │ │ ├── .gitignore │ │ ├── .vscode │ │ └── launch.json │ │ ├── EXAMPLE__nodemon.json │ │ ├── Procfile │ │ ├── app.js │ │ ├── controllers │ │ ├── admin.js │ │ ├── auth.js │ │ ├── error.js │ │ └── shop.js │ │ ├── data │ │ ├── cart.json │ │ ├── invoices │ │ │ ├── invoice-6609964ec44ad232bc0b5943.pdf │ │ │ └── invoice-66099ff45c8f2004791f2b3a.pdf │ │ └── products.json │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── order.js │ │ ├── product.js │ │ └── user.js │ │ ├── package.json │ │ ├── public │ │ ├── css │ │ │ ├── auth.css │ │ │ ├── cart.css │ │ │ ├── forms.css │ │ │ ├── main.css │ │ │ ├── orders.css │ │ │ └── product.css │ │ └── js │ │ │ ├── admin.js │ │ │ └── main.js │ │ ├── routes │ │ ├── admin.js │ │ ├── auth.js │ │ └── shop.js │ │ ├── util │ │ ├── file.js │ │ └── path.js │ │ └── views │ │ ├── 404.ejs │ │ ├── 500.ejs │ │ ├── admin │ │ ├── edit-product.ejs │ │ └── products.ejs │ │ ├── auth │ │ ├── login.ejs │ │ ├── new-password.ejs │ │ ├── reset.ejs │ │ └── signup.ejs │ │ ├── includes │ │ ├── add-to-cart.ejs │ │ ├── end.ejs │ │ ├── head.ejs │ │ ├── navigation.ejs │ │ └── pagination.ejs │ │ └── shop │ │ ├── cart.ejs │ │ ├── checkout.ejs │ │ ├── index.ejs │ │ ├── orders.ejs │ │ ├── product-detail.ejs │ │ └── product-list.ejs ├── 30 Testing │ ├── 00-starting-setup │ │ ├── .gitignore │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ └── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ ├── 01-first-test │ │ ├── .gitignore │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ │ └── test │ │ │ └── start.mjs │ ├── 02-testing-middleware │ │ ├── .gitignore │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ │ └── test │ │ │ ├── auth-middleware.mjs │ │ │ └── start.mjs │ ├── 03-multiple-tests │ │ ├── .gitignore │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ │ └── test │ │ │ ├── auth-middleware.mjs │ │ │ └── start.mjs │ ├── 04-using-stubs │ │ ├── .gitignore │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ │ └── test │ │ │ ├── auth-middleware.mjs │ │ │ └── start.mjs │ ├── 05-testing-async-code │ │ ├── .gitignore │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ │ └── test │ │ │ ├── auth-controller.mjs │ │ │ ├── auth-middleware.mjs │ │ │ └── start.mjs │ ├── 06-active-database │ │ ├── .gitignore │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ │ └── test │ │ │ ├── auth-controller.mjs │ │ │ ├── auth-middleware.mjs │ │ │ └── start.mjs │ ├── 07-hooks │ │ ├── .gitignore │ │ ├── app.js │ │ ├── controllers │ │ │ ├── auth.js │ │ │ └── feed.js │ │ ├── images │ │ │ └── duck.png │ │ ├── middleware │ │ │ └── is-auth.js │ │ ├── models │ │ │ ├── post.js │ │ │ └── user.js │ │ ├── package.json │ │ ├── routes │ │ │ ├── auth.js │ │ │ └── feed.js │ │ └── test │ │ │ ├── auth-controller.mjs │ │ │ ├── auth-middleware.mjs │ │ │ └── start.mjs │ └── 08-authentication │ │ ├── .gitignore │ │ ├── app.js │ │ ├── controllers │ │ ├── auth.js │ │ └── feed.js │ │ ├── images │ │ └── duck.png │ │ ├── middleware │ │ └── is-auth.js │ │ ├── models │ │ ├── post.js │ │ └── user.js │ │ ├── package.json │ │ ├── routes │ │ ├── auth.js │ │ └── feed.js │ │ └── test │ │ ├── auth-controller.mjs │ │ ├── auth-middleware.mjs │ │ ├── feed-controller.mjs │ │ └── start.mjs ├── 32 Modern NodeJS │ ├── 00-starting-setup │ │ ├── app.js │ │ ├── my-page.html │ │ └── package.json │ ├── 01-es-modules │ │ ├── app.js │ │ ├── my-page.html │ │ ├── package.json │ │ └── response-handler.js │ ├── 02-more-es-modules │ │ ├── app.js │ │ ├── my-page.html │ │ ├── package.json │ │ └── response-handler.js │ └── 03-core-modules-promises │ │ ├── app.js │ │ ├── my-page.html │ │ ├── package.json │ │ └── response-handler.js ├── 33 NodeJS Typescript │ ├── 01-typescript-setup │ │ ├── app.js │ │ ├── app.ts │ │ └── index.html │ ├── 02-assigning-types │ │ ├── app.js │ │ ├── app.ts │ │ └── index.html │ ├── 03-type-inference │ │ ├── app.js │ │ ├── app.ts │ │ └── index.html │ ├── 04-configuring-typescript │ │ ├── app.js │ │ ├── app.ts │ │ ├── index.html │ │ └── tsconfig.json │ ├── 05-union-types │ │ ├── app.js │ │ ├── app.ts │ │ ├── index.html │ │ └── tsconfig.json │ ├── 06-type-alias-interfaces │ │ ├── app.js │ │ ├── app.ts │ │ ├── index.html │ │ └── tsconfig.json │ ├── 07-first-summary │ │ ├── app.js │ │ ├── app.ts │ │ ├── index.html │ │ └── tsconfig.json │ ├── 08-node-typescript-setup │ │ ├── .gitignore │ │ ├── app.js │ │ ├── package.json │ │ └── tsconfig.json │ ├── 09-getting-started │ │ ├── .gitignore │ │ ├── app.ts │ │ ├── package.json │ │ └── tsconfig.json │ ├── 10-adding-rest-routes │ │ ├── .gitignore │ │ ├── app.ts │ │ ├── models │ │ │ └── todo.ts │ │ ├── package.json │ │ ├── routes │ │ │ └── todos.ts │ │ └── tsconfig.json │ ├── 11-finishing-routes │ │ ├── .gitignore │ │ ├── app.ts │ │ ├── models │ │ │ └── todo.ts │ │ ├── package.json │ │ ├── routes │ │ │ └── todos.ts │ │ └── tsconfig.json │ ├── 12-testing-api │ │ ├── .gitignore │ │ ├── app.ts │ │ ├── models │ │ │ └── todo.ts │ │ ├── package.json │ │ ├── routes │ │ │ └── todos.ts │ │ └── tsconfig.json │ └── 13-finished │ │ ├── .gitignore │ │ ├── package.json │ │ ├── src │ │ ├── app.ts │ │ ├── models │ │ │ └── todo.ts │ │ └── routes │ │ │ └── todos.ts │ │ └── tsconfig.json ├── 34 Deno │ ├── 01-first-demo │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── settings.json │ │ └── app.ts │ ├── 02-permissions │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── app.ts │ │ └── message.txt │ ├── 03-node-example │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── app.js │ │ ├── app.ts │ │ └── message.txt │ ├── 04-standard-library │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── app.js │ │ ├── app.ts │ │ └── message.txt │ ├── 05-webserver-node │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── app.js │ │ ├── app.ts │ │ └── message.txt │ ├── 06-oak-framework │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── app.js │ │ ├── app.ts │ │ └── message.txt │ ├── 07-rest-example-node │ │ ├── .gitignore │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── app.js │ │ ├── app.ts │ │ ├── message.txt │ │ └── node │ │ │ ├── app.js │ │ │ ├── package.json │ │ │ └── routes │ │ │ └── todos.js │ └── 08-rest-example-deno │ │ ├── .gitignore │ │ ├── .vscode │ │ └── settings.json │ │ ├── app.js │ │ ├── app.ts │ │ ├── deno │ │ ├── app.ts │ │ └── routes │ │ │ └── todos.ts │ │ ├── message.txt │ │ └── node │ │ ├── app.js │ │ ├── package.json │ │ └── routes │ │ └── todos.js └── 35 Deno App │ ├── 00-starting-setup │ ├── .gitignore │ ├── .vscode │ │ └── settings.json │ ├── deno │ │ ├── app.ts │ │ └── routes │ │ │ └── todos.ts │ └── frontend-app │ │ ├── .gitignore │ │ ├── README.md │ │ ├── package.json │ │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── logo192.png │ │ ├── logo512.png │ │ ├── manifest.json │ │ └── robots.txt │ │ └── src │ │ ├── App.js │ │ ├── components │ │ ├── Todos.css │ │ └── Todos.js │ │ ├── index.css │ │ └── index.js │ ├── 01-handling-cors │ ├── .gitignore │ ├── .vscode │ │ └── settings.json │ ├── deno │ │ ├── app.ts │ │ └── routes │ │ │ └── todos.ts │ └── frontend-app │ │ ├── .gitignore │ │ ├── README.md │ │ ├── package.json │ │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── logo192.png │ │ ├── logo512.png │ │ ├── manifest.json │ │ └── robots.txt │ │ └── src │ │ ├── App.js │ │ ├── components │ │ ├── Todos.css │ │ └── Todos.js │ │ ├── index.css │ │ └── index.js │ ├── 02-using-mongodb │ ├── .gitignore │ ├── .vscode │ │ └── settings.json │ ├── deno │ │ ├── app.ts │ │ ├── helpers │ │ │ └── db_client.ts │ │ └── routes │ │ │ └── todos.ts │ └── frontend-app │ │ ├── .gitignore │ │ ├── README.md │ │ ├── package.json │ │ ├── public │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── logo192.png │ │ ├── logo512.png │ │ ├── manifest.json │ │ └── robots.txt │ │ └── src │ │ ├── App.js │ │ ├── components │ │ ├── Todos.css │ │ └── Todos.js │ │ ├── index.css │ │ └── index.js │ └── 03-finishing-crud │ ├── .gitignore │ ├── .vscode │ └── settings.json │ ├── deno │ ├── app.ts │ ├── helpers │ │ └── db_client.ts │ └── routes │ │ └── todos.ts │ └── frontend-app │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── public │ ├── favicon.ico │ ├── index.html │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.txt │ └── src │ ├── App.js │ ├── components │ ├── Todos.css │ └── Todos.js │ ├── index.css │ └── index.js └── slides └── slides.pdf /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/.gitignore -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/.prettierrc -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/README.md -------------------------------------------------------------------------------- /attachments/05 Express.js/add-product.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/05 Express.js/add-product.html -------------------------------------------------------------------------------- /attachments/05 Express.js/shop.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/05 Express.js/shop.html -------------------------------------------------------------------------------- /attachments/07 MVC/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/07 MVC/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/07 MVC/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/07 MVC/path.js -------------------------------------------------------------------------------- /attachments/08 Enhancements/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/08 Enhancements/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/11 Sequelize/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/11 Sequelize/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/13 Mongoose/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/13 Mongoose/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/15 Authentication/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/15 Authentication/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/16 Sending Emails/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/16 Sending Emails/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/17 Advanced Auth/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/17 Advanced Auth/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/18 Validation/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/18 Validation/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/19 Error Handling/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/19 Error Handling/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/21 Pagination/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/21 Pagination/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/22 Async Requests/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/22 Async Requests/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/23 Payments/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/23 Payments/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/26 Async Await/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/26 Async Await/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/27 Websockets/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/27 Websockets/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/27 Websockets/add-post.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/27 Websockets/add-post.js -------------------------------------------------------------------------------- /attachments/27 Websockets/update-post.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/27 Websockets/update-post.js -------------------------------------------------------------------------------- /attachments/28 GraphQL/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/28 GraphQL/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/28 GraphQL/create-post-code.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/28 GraphQL/create-post-code.js -------------------------------------------------------------------------------- /attachments/29 Deployment/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/29 Deployment/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/30 Testing/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/30 Testing/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/30 Testing/user-id.txt: -------------------------------------------------------------------------------- 1 | 5c0f66b979af55031b34728a 2 | -------------------------------------------------------------------------------- /attachments/32 Modern NodeJS/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/32 Modern NodeJS/00-starting-setup.zip -------------------------------------------------------------------------------- /attachments/35 Deno App/00-starting-setup.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/attachments/35 Deno App/00-starting-setup.zip -------------------------------------------------------------------------------- /code/03 Basics/01-routing-requests/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/03 Basics/01-routing-requests/app.js -------------------------------------------------------------------------------- /code/03 Basics/02-parsing-request-bodies/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/03 Basics/02-parsing-request-bodies/app.js -------------------------------------------------------------------------------- /code/03 Basics/03-blocking-non-blocking/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/03 Basics/03-blocking-non-blocking/app.js -------------------------------------------------------------------------------- /code/03 Basics/04-using-node-modules/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/03 Basics/04-using-node-modules/app.js -------------------------------------------------------------------------------- /code/03 Basics/04-using-node-modules/routes.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/03 Basics/04-using-node-modules/routes.js -------------------------------------------------------------------------------- /code/03 Basics/zz-assignment-01-solution/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/03 Basics/zz-assignment-01-solution/app.js -------------------------------------------------------------------------------- /code/04 Workflow Debugging/01-understanding-npm-scripts/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/04 Workflow Debugging/02-using-nodemon/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/04 Workflow Debugging/02-using-nodemon/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/04 Workflow Debugging/02-using-nodemon/app.js -------------------------------------------------------------------------------- /code/04 Workflow Debugging/03-finished/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/04 Workflow Debugging/03-finished/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/04 Workflow Debugging/03-finished/app.js -------------------------------------------------------------------------------- /code/04 Workflow Debugging/03-finished/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/04 Workflow Debugging/03-finished/package.json -------------------------------------------------------------------------------- /code/04 Workflow Debugging/03-finished/routes.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/04 Workflow Debugging/03-finished/routes.js -------------------------------------------------------------------------------- /code/05 Express.js/01-adding-middleware/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/01-adding-middleware/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/01-adding-middleware/app.js -------------------------------------------------------------------------------- /code/05 Express.js/02-behind-the-scenes/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/02-behind-the-scenes/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/02-behind-the-scenes/app.js -------------------------------------------------------------------------------- /code/05 Express.js/03-handling-different-routes/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/04-limiting-middleware/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/04-limiting-middleware/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/04-limiting-middleware/app.js -------------------------------------------------------------------------------- /code/05 Express.js/05-express-router/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/05-express-router/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/05-express-router/app.js -------------------------------------------------------------------------------- /code/05 Express.js/05-express-router/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/05-express-router/package.json -------------------------------------------------------------------------------- /code/05 Express.js/05-express-router/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/05-express-router/routes/shop.js -------------------------------------------------------------------------------- /code/05 Express.js/06-filtering-paths/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/06-filtering-paths/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/06-filtering-paths/app.js -------------------------------------------------------------------------------- /code/05 Express.js/06-filtering-paths/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/06-filtering-paths/package.json -------------------------------------------------------------------------------- /code/05 Express.js/07-creating-html-pages/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/07-creating-html-pages/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/07-creating-html-pages/app.js -------------------------------------------------------------------------------- /code/05 Express.js/08-serving-html-pages/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/08-serving-html-pages/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/08-serving-html-pages/app.js -------------------------------------------------------------------------------- /code/05 Express.js/09-returning-404-page/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/09-returning-404-page/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/09-returning-404-page/app.js -------------------------------------------------------------------------------- /code/05 Express.js/10-using-helper-function/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/10-using-helper-function/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/10-using-helper-function/app.js -------------------------------------------------------------------------------- /code/05 Express.js/11-styling-pages/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/11-styling-pages/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/11-styling-pages/app.js -------------------------------------------------------------------------------- /code/05 Express.js/11-styling-pages/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/11-styling-pages/package.json -------------------------------------------------------------------------------- /code/05 Express.js/11-styling-pages/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/11-styling-pages/routes/admin.js -------------------------------------------------------------------------------- /code/05 Express.js/11-styling-pages/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/11-styling-pages/routes/shop.js -------------------------------------------------------------------------------- /code/05 Express.js/11-styling-pages/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/11-styling-pages/util/path.js -------------------------------------------------------------------------------- /code/05 Express.js/11-styling-pages/views/404.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/11-styling-pages/views/404.html -------------------------------------------------------------------------------- /code/05 Express.js/11-styling-pages/views/shop.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/11-styling-pages/views/shop.html -------------------------------------------------------------------------------- /code/05 Express.js/12-serving-files-statically/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/zz-assignment-1-solution/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/05 Express.js/zz-assignment-1-solution/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/zz-assignment-1-solution/app.js -------------------------------------------------------------------------------- /code/05 Express.js/zz-assignment-2-solution/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/05 Express.js/zz-assignment-2-solution/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/05 Express.js/zz-assignment-2-solution/app.js -------------------------------------------------------------------------------- /code/05 Express.js/zz-assignment-2-solution/public/main.js: -------------------------------------------------------------------------------- 1 | alert('This works!'); 2 | -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/00-updated-starting-project/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/01-sharing-data-requests/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/02-adding-pug/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/03-outputting-dynamic-content/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/04-pug-finished/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/05-adding-layout-hbs/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/06-layout-partials/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/06-layout-partials/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/07-finished/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/07-finished/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/zz-assignment-solutions/assignment-ejs-and-final-solution/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/zz-assignment-solutions/assignment-ejs-and-final-solution/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/zz-assignment-solutions/assignment-handlebars-solution/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /code/06 Dynamic Content Templating/zz-assignment-solutions/assignment-pug-solution/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/.vscode/launch.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/.vscode/launch.json -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/package.json -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/public/css/forms.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/public/css/forms.css -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/public/css/main.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/public/css/main.css -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/routes/admin.js -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/routes/shop.js -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/util/path.js -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/views/404.ejs -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/views/add-product.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/views/add-product.ejs -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/07 MVC/00-starting-setup/views/shop.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/00-starting-setup/views/shop.ejs -------------------------------------------------------------------------------- /code/07 MVC/01-finishing-controller/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/07 MVC/01-finishing-controller/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/01-finishing-controller/app.js -------------------------------------------------------------------------------- /code/07 MVC/01-finishing-controller/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/01-finishing-controller/package.json -------------------------------------------------------------------------------- /code/07 MVC/01-finishing-controller/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/01-finishing-controller/routes/admin.js -------------------------------------------------------------------------------- /code/07 MVC/01-finishing-controller/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/01-finishing-controller/routes/shop.js -------------------------------------------------------------------------------- /code/07 MVC/01-finishing-controller/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/01-finishing-controller/util/path.js -------------------------------------------------------------------------------- /code/07 MVC/01-finishing-controller/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/01-finishing-controller/views/404.ejs -------------------------------------------------------------------------------- /code/07 MVC/01-finishing-controller/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/07 MVC/01-finishing-controller/views/shop.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/01-finishing-controller/views/shop.ejs -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/.vscode/launch.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/.vscode/launch.json -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/app.js -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/controllers/error.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/controllers/error.js -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/models/product.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/models/product.js -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/package.json -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/public/css/forms.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/public/css/forms.css -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/public/css/main.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/public/css/main.css -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/public/css/product.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/public/css/product.css -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/routes/admin.js -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/routes/shop.js -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/util/path.js -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/views/404.ejs -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/views/add-product.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/views/add-product.ejs -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/07 MVC/02-product-model/views/shop.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/02-product-model/views/shop.ejs -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/.vscode/launch.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/.vscode/launch.json -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/app.js -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/controllers/error.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/controllers/error.js -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/models/product.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/models/product.js -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/package.json -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/public/css/forms.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/public/css/forms.css -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/public/css/main.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/public/css/main.css -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/routes/admin.js -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/routes/shop.js -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/util/path.js -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/views/404.ejs -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/07 MVC/03-fetching-data/views/shop.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/03-fetching-data/views/shop.ejs -------------------------------------------------------------------------------- /code/07 MVC/04-refactor-file-storage/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/07 MVC/04-refactor-file-storage/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/07 MVC/04-refactor-file-storage/app.js -------------------------------------------------------------------------------- /code/07 MVC/04-refactor-file-storage/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/08 Enhancements/01-working-on-navigation/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/08 Enhancements/01-working-on-navigation/views/admin/edit-product.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/01-working-on-navigation/views/admin/products.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/01-working-on-navigation/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/08 Enhancements/01-working-on-navigation/views/shop/cart.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/01-working-on-navigation/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/01-working-on-navigation/views/shop/index.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/01-working-on-navigation/views/shop/product-details.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/02-registering-routes/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/08 Enhancements/02-registering-routes/views/admin/edit-product.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/02-registering-routes/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/08 Enhancements/02-registering-routes/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/02-registering-routes/views/shop/product-details.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/03-storing-products/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/08 Enhancements/03-storing-products/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/08 Enhancements/03-storing-products/app.js -------------------------------------------------------------------------------- /code/08 Enhancements/03-storing-products/views/admin/edit-product.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/03-storing-products/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/08 Enhancements/03-storing-products/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/03-storing-products/views/shop/product-details.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/04-editing-deleting/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/08 Enhancements/04-editing-deleting/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/08 Enhancements/04-editing-deleting/app.js -------------------------------------------------------------------------------- /code/08 Enhancements/04-editing-deleting/views/admin/edit-product.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/04-editing-deleting/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/08 Enhancements/04-editing-deleting/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/04-editing-deleting/views/shop/product-details.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/08 Enhancements/05-finished/app.js -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/08 Enhancements/05-finished/package.json -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/08 Enhancements/05-finished/routes/admin.js -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/08 Enhancements/05-finished/routes/shop.js -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/08 Enhancements/05-finished/util/path.js -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/08 Enhancements/05-finished/views/404.ejs -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/views/admin/edit-product.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/views/includes/end.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/08 Enhancements/05-finished/views/shop/product-details.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/00-starting-setup/views/admin/edit-product.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/00-starting-setup/views/shop/product-detail.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/01-extracting-params/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/01-extracting-params/views/admin/edit-product.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/01-extracting-params/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/01-extracting-params/views/shop/product-detail.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/02-loading-product-detail/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/02-loading-product-detail/views/admin/edit-product.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/02-loading-product-detail/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/02-loading-product-detail/views/shop/product-detail.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/03-rendering-product-detail/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/03-rendering-product-detail/views/admin/edit-product.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/03-rendering-product-detail/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/04-adding-cart-model/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/04-adding-cart-model/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[{"id":"0.6334855236832844","qty":2}],"totalPrice":45.98} -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/04-adding-cart-model/views/admin/edit-product.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/04-adding-cart-model/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/05-pre-populating-edit-data/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/05-pre-populating-edit-data/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[{"id":"0.6334855236832844","qty":2}],"totalPrice":45.98} -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/05-pre-populating-edit-data/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/06-editing-product-data/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/06-editing-product-data/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[{"id":"0.6334855236832844","qty":2}],"totalPrice":45.98} -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/06-editing-product-data/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/07-delete-product/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/07-delete-product/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[{"id":"0.6334855236832844","qty":2}],"totalPrice":45.98} -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/07-delete-product/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/08-deleting-cart-items/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/08-deleting-cart-items/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/08-deleting-cart-items/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/09-fixing-delete-bug/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/09-fixing-delete-bug/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/09 Dynamic Routes Advanced Models/09-fixing-delete-bug/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/10 SQL Introduction/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/10 SQL Introduction/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/10 SQL Introduction/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/10 SQL Introduction/01-connecting-app/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/10 SQL Introduction/01-connecting-app/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/10 SQL Introduction/01-connecting-app/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/10 SQL Introduction/02-fetching-products/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/10 SQL Introduction/02-fetching-products/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/10 SQL Introduction/02-fetching-products/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/10 SQL Introduction/03-inserting-data/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/10 SQL Introduction/03-inserting-data/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/10 SQL Introduction/03-inserting-data/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/10 SQL Introduction/04-fetching-single-product/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/10 SQL Introduction/04-fetching-single-product/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/10 SQL Introduction/04-fetching-single-product/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/00-starting-setup/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/00-starting-setup/package.json -------------------------------------------------------------------------------- /code/11 Sequelize/00-starting-setup/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/00-starting-setup/util/path.js -------------------------------------------------------------------------------- /code/11 Sequelize/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/01-defining-model/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/01-defining-model/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/01-defining-model/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/01-defining-model/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/01-defining-model/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/01-defining-model/package.json -------------------------------------------------------------------------------- /code/11 Sequelize/01-defining-model/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/01-defining-model/util/path.js -------------------------------------------------------------------------------- /code/11 Sequelize/01-defining-model/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/02-inserting-data/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/02-inserting-data/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/02-inserting-data/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/02-inserting-data/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/02-inserting-data/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/02-inserting-data/package.json -------------------------------------------------------------------------------- /code/11 Sequelize/02-inserting-data/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/02-inserting-data/util/path.js -------------------------------------------------------------------------------- /code/11 Sequelize/02-inserting-data/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/03-getting-single-product/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/03-getting-single-product/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/03-getting-single-product/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/04-updating-products/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/04-updating-products/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/04-updating-products/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/04-updating-products/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/04-updating-products/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/05-deleting-products/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/05-deleting-products/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/05-deleting-products/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/05-deleting-products/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/05-deleting-products/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/06-one-to-many/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/models/cart.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/06-one-to-many/models/cart.js -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/06-one-to-many/models/user.js -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/06-one-to-many/package.json -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/06-one-to-many/routes/admin.js -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/06-one-to-many/routes/shop.js -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/06-one-to-many/util/path.js -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/06-one-to-many/views/404.ejs -------------------------------------------------------------------------------- /code/11 Sequelize/06-one-to-many/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/07-creating-dummy-user/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/07-creating-dummy-user/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/07-creating-dummy-user/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/07-creating-dummy-user/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/07-creating-dummy-user/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/08-fetching-related-products/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/08-fetching-related-products/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/08-fetching-related-products/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/models/cart.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/models/cart.js -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/models/product.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/models/product.js -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/models/user.js -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/package.json -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/public/js/main.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/public/js/main.js -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/routes/admin.js -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/routes/shop.js -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/util/database.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/util/database.js -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/util/path.js -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/09-many-many/views/404.ejs -------------------------------------------------------------------------------- /code/11 Sequelize/09-many-many/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/10-fetching-cart/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/10-fetching-cart/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/10-fetching-cart/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/10-fetching-cart/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/10-fetching-cart/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/10-fetching-cart/package.json -------------------------------------------------------------------------------- /code/11 Sequelize/10-fetching-cart/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/10-fetching-cart/util/path.js -------------------------------------------------------------------------------- /code/11 Sequelize/10-fetching-cart/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/10-fetching-cart/views/404.ejs -------------------------------------------------------------------------------- /code/11 Sequelize/10-fetching-cart/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/11-retrieving-cart-items/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/11-retrieving-cart-items/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/11-retrieving-cart-items/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/12-deleting-cart-items/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/12-deleting-cart-items/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/12-deleting-cart-items/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/12-deleting-cart-items/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/12-deleting-cart-items/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/13-storing-order-items/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/13-storing-order-items/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/13-storing-order-items/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/13-storing-order-items/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/13-storing-order-items/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/14-reset-cart/app.js -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/models/cart.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/14-reset-cart/models/cart.js -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/models/order.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/14-reset-cart/models/order.js -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/14-reset-cart/models/user.js -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/14-reset-cart/package.json -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/14-reset-cart/routes/admin.js -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/14-reset-cart/routes/shop.js -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/util/database.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/14-reset-cart/util/database.js -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/14-reset-cart/util/path.js -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/11 Sequelize/14-reset-cart/views/404.ejs -------------------------------------------------------------------------------- /code/11 Sequelize/14-reset-cart/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/01-using-database-conn/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/01-using-database-conn/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/01-using-database-conn/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/02-fetching-products/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/02-fetching-products/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/02-fetching-products/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/03-fetching-single-product/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/03-fetching-single-product/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/03-fetching-single-product/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/04-update-product/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/04-update-product/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/04-update-product/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/05-deleting-products/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/05-deleting-products/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/05-deleting-products/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/06-fixing-add-product/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/06-fixing-add-product/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/06-fixing-add-product/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/07-storing-user/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/07-storing-user/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/12 NoSQL and MongoDB/07-storing-user/app.js -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/07-storing-user/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/07-storing-user/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/08-add-to-cart/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/08-add-to-cart/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/12 NoSQL and MongoDB/08-add-to-cart/app.js -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/08-add-to-cart/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/08-add-to-cart/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/09-displaying-cart/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/09-displaying-cart/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/09-displaying-cart/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/10-deleting-cart-items/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/10-deleting-cart-items/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/10-deleting-cart-items/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/11-adding-relational-order/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/11-adding-relational-order/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/11-adding-relational-order/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/12-removing-deleted-cart-items/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/12-removing-deleted-cart-items/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/12 NoSQL and MongoDB/12-removing-deleted-cart-items/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/13 Mongoose/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/13 Mongoose/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/13 Mongoose/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/13 Mongoose/00-starting-setup/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/00-starting-setup/package.json -------------------------------------------------------------------------------- /code/13 Mongoose/00-starting-setup/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/00-starting-setup/util/path.js -------------------------------------------------------------------------------- /code/13 Mongoose/00-starting-setup/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/00-starting-setup/views/404.ejs -------------------------------------------------------------------------------- /code/13 Mongoose/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/13 Mongoose/01-connecting-mongoose/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/13 Mongoose/01-connecting-mongoose/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/01-connecting-mongoose/app.js -------------------------------------------------------------------------------- /code/13 Mongoose/01-connecting-mongoose/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/13 Mongoose/01-connecting-mongoose/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/13 Mongoose/02-saving-data/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/13 Mongoose/02-saving-data/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/02-saving-data/app.js -------------------------------------------------------------------------------- /code/13 Mongoose/02-saving-data/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/13 Mongoose/02-saving-data/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/02-saving-data/models/user.js -------------------------------------------------------------------------------- /code/13 Mongoose/02-saving-data/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/02-saving-data/package.json -------------------------------------------------------------------------------- /code/13 Mongoose/02-saving-data/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/02-saving-data/routes/admin.js -------------------------------------------------------------------------------- /code/13 Mongoose/02-saving-data/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/02-saving-data/routes/shop.js -------------------------------------------------------------------------------- /code/13 Mongoose/02-saving-data/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/02-saving-data/util/path.js -------------------------------------------------------------------------------- /code/13 Mongoose/02-saving-data/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/02-saving-data/views/404.ejs -------------------------------------------------------------------------------- /code/13 Mongoose/02-saving-data/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/13 Mongoose/03-fetching-products/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/13 Mongoose/03-fetching-products/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/03-fetching-products/app.js -------------------------------------------------------------------------------- /code/13 Mongoose/03-fetching-products/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/13 Mongoose/03-fetching-products/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/13 Mongoose/04-deleting-products/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/13 Mongoose/04-deleting-products/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/04-deleting-products/app.js -------------------------------------------------------------------------------- /code/13 Mongoose/04-deleting-products/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/13 Mongoose/04-deleting-products/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/13 Mongoose/05-adding-user-model/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/13 Mongoose/05-adding-user-model/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/05-adding-user-model/app.js -------------------------------------------------------------------------------- /code/13 Mongoose/05-adding-user-model/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/13 Mongoose/05-adding-user-model/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/13 Mongoose/06-using-relations/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/13 Mongoose/06-using-relations/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/06-using-relations/app.js -------------------------------------------------------------------------------- /code/13 Mongoose/06-using-relations/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/13 Mongoose/06-using-relations/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/06-using-relations/package.json -------------------------------------------------------------------------------- /code/13 Mongoose/06-using-relations/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/06-using-relations/util/path.js -------------------------------------------------------------------------------- /code/13 Mongoose/06-using-relations/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/13 Mongoose/07-working-on-cart/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/13 Mongoose/07-working-on-cart/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/07-working-on-cart/app.js -------------------------------------------------------------------------------- /code/13 Mongoose/07-working-on-cart/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/13 Mongoose/07-working-on-cart/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/07-working-on-cart/package.json -------------------------------------------------------------------------------- /code/13 Mongoose/07-working-on-cart/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/07-working-on-cart/util/path.js -------------------------------------------------------------------------------- /code/13 Mongoose/07-working-on-cart/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/13 Mongoose/08-loading-cart/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/13 Mongoose/08-loading-cart/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/08-loading-cart/app.js -------------------------------------------------------------------------------- /code/13 Mongoose/08-loading-cart/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/13 Mongoose/08-loading-cart/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/08-loading-cart/models/user.js -------------------------------------------------------------------------------- /code/13 Mongoose/08-loading-cart/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/08-loading-cart/package.json -------------------------------------------------------------------------------- /code/13 Mongoose/08-loading-cart/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/08-loading-cart/routes/admin.js -------------------------------------------------------------------------------- /code/13 Mongoose/08-loading-cart/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/08-loading-cart/routes/shop.js -------------------------------------------------------------------------------- /code/13 Mongoose/08-loading-cart/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/08-loading-cart/util/path.js -------------------------------------------------------------------------------- /code/13 Mongoose/08-loading-cart/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/08-loading-cart/views/404.ejs -------------------------------------------------------------------------------- /code/13 Mongoose/08-loading-cart/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/13 Mongoose/09-displaying-orders/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/13 Mongoose/09-displaying-orders/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/13 Mongoose/09-displaying-orders/app.js -------------------------------------------------------------------------------- /code/13 Mongoose/09-displaying-orders/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/13 Mongoose/09-displaying-orders/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/01-creating-login/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/01-creating-login/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/01-creating-login/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/02-request-solution/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/02-request-solution/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/02-request-solution/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/03-configuring-cookies/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/03-configuring-cookies/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/03-configuring-cookies/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/04-using-session-middleware/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/04-using-session-middleware/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/04-using-session-middleware/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/05-mongodb-sessions/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/05-mongodb-sessions/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/05-mongodb-sessions/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/06-required-assignment/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/06-required-assignment/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/06-required-assignment/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/07-deleting-cookie/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/07-deleting-cookie/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/07-deleting-cookie/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/08-fixing-bugs/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/08-fixing-bugs/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/08-fixing-bugs/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/09-tiny-improvements/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/09-tiny-improvements/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/14 Sessions and Cookies/09-tiny-improvements/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/15 Authentication/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/15 Authentication/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/01-implement-auth-flow/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/01-implement-auth-flow/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/01-implement-auth-flow/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/02-encrypting-passwords/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/02-encrypting-passwords/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/02-encrypting-passwords/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/03-small-improvement/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/03-small-improvement/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/03-small-improvement/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/04-adding-signin/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/04-adding-signin/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/15 Authentication/04-adding-signin/app.js -------------------------------------------------------------------------------- /code/15 Authentication/04-adding-signin/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/04-adding-signin/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/05-using-middleware-protect/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/05-using-middleware-protect/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/05-using-middleware-protect/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/06-adding-csrf/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/06-adding-csrf/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/15 Authentication/06-adding-csrf/app.js -------------------------------------------------------------------------------- /code/15 Authentication/06-adding-csrf/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/06-adding-csrf/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/07-migrate-csrf-csrf/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/07-migrate-csrf-csrf/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/07-migrate-csrf-csrf/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/08-fixing-order-button/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/08-fixing-order-button/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/08-fixing-order-button/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/09-providing-user-feedback/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/09-providing-user-feedback/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/09-providing-user-feedback/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/10-styling-error-message/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/10-styling-error-message/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/10-styling-error-message/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/11-finishing-flash/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/11-finishing-flash/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/15 Authentication/11-finishing-flash/app.js -------------------------------------------------------------------------------- /code/15 Authentication/11-finishing-flash/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/11-finishing-flash/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/15 Authentication/12-additional-messages/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/15 Authentication/12-additional-messages/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/15 Authentication/12-additional-messages/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/16 Sending Emails/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/16 Sending Emails/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/16 Sending Emails/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/16 Sending Emails/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/16 Sending Emails/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/16 Sending Emails/01-sending-emails/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/16 Sending Emails/01-sending-emails/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/16 Sending Emails/01-sending-emails/app.js -------------------------------------------------------------------------------- /code/16 Sending Emails/01-sending-emails/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/16 Sending Emails/01-sending-emails/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/17 Advanced Auth/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/17 Advanced Auth/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/17 Advanced Auth/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/17 Advanced Auth/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/17 Advanced Auth/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/17 Advanced Auth/01-resetting-password/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/17 Advanced Auth/01-resetting-password/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/17 Advanced Auth/01-resetting-password/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/17 Advanced Auth/02-creating-token/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/17 Advanced Auth/02-creating-token/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/17 Advanced Auth/02-creating-token/app.js -------------------------------------------------------------------------------- /code/17 Advanced Auth/02-creating-token/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/17 Advanced Auth/02-creating-token/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/17 Advanced Auth/03-password-reset-form/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/17 Advanced Auth/03-password-reset-form/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/17 Advanced Auth/03-password-reset-form/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/17 Advanced Auth/04-updating-password/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/17 Advanced Auth/04-updating-password/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/17 Advanced Auth/04-updating-password/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/17 Advanced Auth/05-editing-fail/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/17 Advanced Auth/05-editing-fail/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/17 Advanced Auth/05-editing-fail/app.js -------------------------------------------------------------------------------- /code/17 Advanced Auth/05-editing-fail/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/17 Advanced Auth/05-editing-fail/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/18 Validation/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/01-basic-validation/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/01-basic-validation/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/01-basic-validation/app.js -------------------------------------------------------------------------------- /code/18 Validation/01-basic-validation/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/01-basic-validation/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/02-using-error-messages/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/02-using-error-messages/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/02-using-error-messages/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/03-builtin-custom-validators/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/03-builtin-custom-validators/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/03-builtin-custom-validators/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/04-checking-field-equality/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/04-checking-field-equality/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/04-checking-field-equality/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/05-async-validation/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/05-async-validation/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/05-async-validation/app.js -------------------------------------------------------------------------------- /code/18 Validation/05-async-validation/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/05-async-validation/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/06-required-assignment/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/06-required-assignment/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/06-required-assignment/app.js -------------------------------------------------------------------------------- /code/18 Validation/06-required-assignment/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/06-required-assignment/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/07-keeping-input/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/07-keeping-input/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/07-keeping-input/app.js -------------------------------------------------------------------------------- /code/18 Validation/07-keeping-input/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/07-keeping-input/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/07-keeping-input/package.json -------------------------------------------------------------------------------- /code/18 Validation/07-keeping-input/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/07-keeping-input/util/path.js -------------------------------------------------------------------------------- /code/18 Validation/07-keeping-input/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/08-validation-login/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/08-validation-login/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/08-validation-login/app.js -------------------------------------------------------------------------------- /code/18 Validation/08-validation-login/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/08-validation-login/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/09-sanitize-data/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/09-sanitize-data/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/09-sanitize-data/app.js -------------------------------------------------------------------------------- /code/18 Validation/09-sanitize-data/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/09-sanitize-data/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/09-sanitize-data/package.json -------------------------------------------------------------------------------- /code/18 Validation/09-sanitize-data/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/18 Validation/09-sanitize-data/util/path.js -------------------------------------------------------------------------------- /code/18 Validation/09-sanitize-data/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/18 Validation/10-validate-product-edit/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/18 Validation/10-validate-product-edit/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/18 Validation/10-validate-product-edit/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/19 Error Handling/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/19 Error Handling/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/19 Error Handling/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/19 Error Handling/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/19 Error Handling/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/19 Error Handling/01-error-theory/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/19 Error Handling/01-error-theory/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/19 Error Handling/01-error-theory/app.js -------------------------------------------------------------------------------- /code/19 Error Handling/01-error-theory/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/19 Error Handling/01-error-theory/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/19 Error Handling/02-returning-error-page/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/19 Error Handling/02-returning-error-page/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/19 Error Handling/02-returning-error-page/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/19 Error Handling/03-express-error-middleware/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/19 Error Handling/03-express-error-middleware/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/19 Error Handling/03-express-error-middleware/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/19 Error Handling/04-status-codes/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/19 Error Handling/04-status-codes/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/19 Error Handling/04-status-codes/app.js -------------------------------------------------------------------------------- /code/19 Error Handling/04-status-codes/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/19 Error Handling/04-status-codes/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/20 Upload Download/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/20 Upload Download/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/20 Upload Download/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/20 Upload Download/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/20 Upload Download/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/20 Upload Download/01-file-uploads/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/20 Upload Download/01-file-uploads/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/20 Upload Download/01-file-uploads/app.js -------------------------------------------------------------------------------- /code/20 Upload Download/01-file-uploads/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/20 Upload Download/01-file-uploads/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/20 Upload Download/02-file-mimetype/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/20 Upload Download/02-file-mimetype/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/20 Upload Download/02-file-mimetype/app.js -------------------------------------------------------------------------------- /code/20 Upload Download/02-file-mimetype/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/20 Upload Download/02-file-mimetype/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/20 Upload Download/03-serving-images-static/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/20 Upload Download/03-serving-images-static/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/20 Upload Download/03-serving-images-static/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/20 Upload Download/04-restricting-file-access/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/20 Upload Download/04-restricting-file-access/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/20 Upload Download/04-restricting-file-access/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/20 Upload Download/05-streaming-preloading/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/20 Upload Download/05-streaming-preloading/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/20 Upload Download/05-streaming-preloading/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/20 Upload Download/06-generating-pdfs/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/20 Upload Download/06-generating-pdfs/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/20 Upload Download/06-generating-pdfs/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/20 Upload Download/07-deleting-files/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/20 Upload Download/07-deleting-files/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/20 Upload Download/07-deleting-files/app.js -------------------------------------------------------------------------------- /code/20 Upload Download/07-deleting-files/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/20 Upload Download/07-deleting-files/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/20 Upload Download/08-fixing-invoice-links/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/20 Upload Download/08-fixing-invoice-links/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/20 Upload Download/08-fixing-invoice-links/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/21 Pagination/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/21 Pagination/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/21 Pagination/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/21 Pagination/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/21 Pagination/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/21 Pagination/01-adding-pagination-links/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/21 Pagination/01-adding-pagination-links/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/21 Pagination/01-adding-pagination-links/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/21 Pagination/02-preparing-server/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/21 Pagination/02-preparing-server/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/21 Pagination/02-preparing-server/app.js -------------------------------------------------------------------------------- /code/21 Pagination/02-preparing-server/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/21 Pagination/02-preparing-server/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/21 Pagination/03-dynamic-page-btns/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/21 Pagination/03-dynamic-page-btns/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/21 Pagination/03-dynamic-page-btns/app.js -------------------------------------------------------------------------------- /code/21 Pagination/03-dynamic-page-btns/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/21 Pagination/03-dynamic-page-btns/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/21 Pagination/04-reusing-pagination-logic/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/21 Pagination/04-reusing-pagination-logic/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/21 Pagination/04-reusing-pagination-logic/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/22 Async Requests/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/22 Async Requests/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/22 Async Requests/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/22 Async Requests/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/22 Async Requests/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/22 Async Requests/01-adding-client-js/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/22 Async Requests/01-adding-client-js/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/22 Async Requests/01-adding-client-js/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/22 Async Requests/02-manipulating-dom/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/22 Async Requests/02-manipulating-dom/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/22 Async Requests/02-manipulating-dom/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/23 Payments/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/23 Payments/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/23 Payments/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/23 Payments/00-starting-setup/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/00-starting-setup/package.json -------------------------------------------------------------------------------- /code/23 Payments/00-starting-setup/util/file.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/00-starting-setup/util/file.js -------------------------------------------------------------------------------- /code/23 Payments/00-starting-setup/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/00-starting-setup/util/path.js -------------------------------------------------------------------------------- /code/23 Payments/00-starting-setup/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/00-starting-setup/views/404.ejs -------------------------------------------------------------------------------- /code/23 Payments/00-starting-setup/views/500.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/00-starting-setup/views/500.ejs -------------------------------------------------------------------------------- /code/23 Payments/00-starting-setup/views/shop/checkout.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/23 Payments/01-adding-checkout/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/23 Payments/01-adding-checkout/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/01-adding-checkout/app.js -------------------------------------------------------------------------------- /code/23 Payments/01-adding-checkout/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/23 Payments/01-adding-checkout/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/01-adding-checkout/package.json -------------------------------------------------------------------------------- /code/23 Payments/01-adding-checkout/util/file.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/01-adding-checkout/util/file.js -------------------------------------------------------------------------------- /code/23 Payments/01-adding-checkout/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/01-adding-checkout/util/path.js -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/app.js -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/models/order.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/models/order.js -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/models/user.js -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/package.json -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/routes/admin.js -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/routes/auth.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/routes/auth.js -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/routes/shop.js -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/util/file.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/util/file.js -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/util/path.js -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/views/404.ejs -------------------------------------------------------------------------------- /code/23 Payments/02-using-stripe/views/500.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/23 Payments/02-using-stripe/views/500.ejs -------------------------------------------------------------------------------- /code/24 Rest Api/01-sending-req-res/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/24 Rest Api/01-sending-req-res/app.js -------------------------------------------------------------------------------- /code/24 Rest Api/01-sending-req-res/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/24 Rest Api/01-sending-req-res/package.json -------------------------------------------------------------------------------- /code/24 Rest Api/02-sending-post-req/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/24 Rest Api/02-sending-post-req/app.js -------------------------------------------------------------------------------- /code/25 Rest Application/00-starting-setup/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/01-fetching-posts/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/02-post-model/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/03-storing-posts/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/04-static-images/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/05-fetching-single-post/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/06-uploading-images/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/07-updating-posts/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/08-adding-pagination/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/09-logging-users-in/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/10-auth-middleware/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/11-clearing-relations/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/25 Rest Application/12-required-assignment/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/26 Async Await/00-starting-setup/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/26 Async Await/01-transforming-then-catch/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/26 Async Await/02-required-assignment/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/26 Async Await/03-finished/backend/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/26 Async Await/03-finished/backend/app.js -------------------------------------------------------------------------------- /code/26 Async Await/03-finished/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/27 Websockets/00-starting-setup/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/27 Websockets/01-connecting-client/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/27 Websockets/02-synchronizing-posts/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/27 Websockets/03-updating-posts-all/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/27 Websockets/04-deleting-posts-all/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/00-starting-setup/backend/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/28 GraphQL/00-starting-setup/backend/app.js -------------------------------------------------------------------------------- /code/28 GraphQL/00-starting-setup/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/01-first-query/backend/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/28 GraphQL/01-first-query/backend/app.js -------------------------------------------------------------------------------- /code/28 GraphQL/01-first-query/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/02-mutation-schema/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/03-mutation-resolver/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/04-handling-errors/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/05-connecting-frontend/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/06-login-functionality/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/07-creating-posts/backend/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/28 GraphQL/07-creating-posts/backend/app.js -------------------------------------------------------------------------------- /code/28 GraphQL/07-creating-posts/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/08-create-post-query/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/09-post-queries/backend/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/28 GraphQL/09-post-queries/backend/app.js -------------------------------------------------------------------------------- /code/28 GraphQL/09-post-queries/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/10-adding-pagination/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/11-uploading-images/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/12-viewing-single-post/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/13-update-delete-post/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/28 GraphQL/14-pagination-bug/backend/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/28 GraphQL/14-pagination-bug/backend/app.js -------------------------------------------------------------------------------- /code/28 GraphQL/14-pagination-bug/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/29 Deployment/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/29 Deployment/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/29 Deployment/00-starting-setup/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/29 Deployment/01-using-env-variables/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/01-using-env-variables/app.js -------------------------------------------------------------------------------- /code/29 Deployment/01-using-env-variables/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/29 Deployment/02-request-logging/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/02-request-logging/.gitignore -------------------------------------------------------------------------------- /code/29 Deployment/02-request-logging/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/02-request-logging/app.js -------------------------------------------------------------------------------- /code/29 Deployment/02-request-logging/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/.gitignore -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/app.js -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/models/order.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/models/order.js -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/models/user.js -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/package.json -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/routes/admin.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/routes/admin.js -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/routes/auth.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/routes/auth.js -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/routes/shop.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/routes/shop.js -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/server.cert: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/server.cert -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/server.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/server.key -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/util/file.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/util/file.js -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/util/path.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/util/path.js -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/views/404.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/views/404.ejs -------------------------------------------------------------------------------- /code/29 Deployment/03-ssl-server/views/500.ejs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/03-ssl-server/views/500.ejs -------------------------------------------------------------------------------- /code/29 Deployment/04-deployment-example/Procfile: -------------------------------------------------------------------------------- 1 | web: node app.js -------------------------------------------------------------------------------- /code/29 Deployment/04-deployment-example/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/29 Deployment/04-deployment-example/app.js -------------------------------------------------------------------------------- /code/29 Deployment/04-deployment-example/data/cart.json: -------------------------------------------------------------------------------- 1 | {"products":[],"totalPrice":0} -------------------------------------------------------------------------------- /code/30 Testing/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/30 Testing/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/30 Testing/00-starting-setup/models/post.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/00-starting-setup/models/post.js -------------------------------------------------------------------------------- /code/30 Testing/00-starting-setup/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/00-starting-setup/models/user.js -------------------------------------------------------------------------------- /code/30 Testing/00-starting-setup/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/00-starting-setup/package.json -------------------------------------------------------------------------------- /code/30 Testing/00-starting-setup/routes/auth.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/00-starting-setup/routes/auth.js -------------------------------------------------------------------------------- /code/30 Testing/00-starting-setup/routes/feed.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/00-starting-setup/routes/feed.js -------------------------------------------------------------------------------- /code/30 Testing/01-first-test/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/30 Testing/01-first-test/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/01-first-test/app.js -------------------------------------------------------------------------------- /code/30 Testing/01-first-test/images/duck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/01-first-test/images/duck.png -------------------------------------------------------------------------------- /code/30 Testing/01-first-test/models/post.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/01-first-test/models/post.js -------------------------------------------------------------------------------- /code/30 Testing/01-first-test/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/01-first-test/models/user.js -------------------------------------------------------------------------------- /code/30 Testing/01-first-test/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/01-first-test/package.json -------------------------------------------------------------------------------- /code/30 Testing/01-first-test/routes/auth.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/01-first-test/routes/auth.js -------------------------------------------------------------------------------- /code/30 Testing/01-first-test/routes/feed.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/01-first-test/routes/feed.js -------------------------------------------------------------------------------- /code/30 Testing/01-first-test/test/start.mjs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/01-first-test/test/start.mjs -------------------------------------------------------------------------------- /code/30 Testing/02-testing-middleware/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/30 Testing/02-testing-middleware/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/02-testing-middleware/app.js -------------------------------------------------------------------------------- /code/30 Testing/03-multiple-tests/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/30 Testing/03-multiple-tests/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/03-multiple-tests/app.js -------------------------------------------------------------------------------- /code/30 Testing/03-multiple-tests/models/post.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/03-multiple-tests/models/post.js -------------------------------------------------------------------------------- /code/30 Testing/03-multiple-tests/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/03-multiple-tests/models/user.js -------------------------------------------------------------------------------- /code/30 Testing/03-multiple-tests/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/03-multiple-tests/package.json -------------------------------------------------------------------------------- /code/30 Testing/03-multiple-tests/routes/auth.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/03-multiple-tests/routes/auth.js -------------------------------------------------------------------------------- /code/30 Testing/03-multiple-tests/routes/feed.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/03-multiple-tests/routes/feed.js -------------------------------------------------------------------------------- /code/30 Testing/03-multiple-tests/test/start.mjs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/03-multiple-tests/test/start.mjs -------------------------------------------------------------------------------- /code/30 Testing/04-using-stubs/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/30 Testing/04-using-stubs/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/04-using-stubs/app.js -------------------------------------------------------------------------------- /code/30 Testing/04-using-stubs/images/duck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/04-using-stubs/images/duck.png -------------------------------------------------------------------------------- /code/30 Testing/04-using-stubs/models/post.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/04-using-stubs/models/post.js -------------------------------------------------------------------------------- /code/30 Testing/04-using-stubs/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/04-using-stubs/models/user.js -------------------------------------------------------------------------------- /code/30 Testing/04-using-stubs/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/04-using-stubs/package.json -------------------------------------------------------------------------------- /code/30 Testing/04-using-stubs/routes/auth.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/04-using-stubs/routes/auth.js -------------------------------------------------------------------------------- /code/30 Testing/04-using-stubs/routes/feed.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/04-using-stubs/routes/feed.js -------------------------------------------------------------------------------- /code/30 Testing/04-using-stubs/test/start.mjs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/04-using-stubs/test/start.mjs -------------------------------------------------------------------------------- /code/30 Testing/05-testing-async-code/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/30 Testing/05-testing-async-code/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/05-testing-async-code/app.js -------------------------------------------------------------------------------- /code/30 Testing/06-active-database/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/30 Testing/06-active-database/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/06-active-database/app.js -------------------------------------------------------------------------------- /code/30 Testing/06-active-database/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/06-active-database/package.json -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/app.js -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/controllers/auth.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/controllers/auth.js -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/controllers/feed.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/controllers/feed.js -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/images/duck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/images/duck.png -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/middleware/is-auth.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/middleware/is-auth.js -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/models/post.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/models/post.js -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/models/user.js -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/package.json -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/routes/auth.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/routes/auth.js -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/routes/feed.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/routes/feed.js -------------------------------------------------------------------------------- /code/30 Testing/07-hooks/test/start.mjs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/07-hooks/test/start.mjs -------------------------------------------------------------------------------- /code/30 Testing/08-authentication/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /code/30 Testing/08-authentication/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/08-authentication/app.js -------------------------------------------------------------------------------- /code/30 Testing/08-authentication/models/post.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/08-authentication/models/post.js -------------------------------------------------------------------------------- /code/30 Testing/08-authentication/models/user.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/08-authentication/models/user.js -------------------------------------------------------------------------------- /code/30 Testing/08-authentication/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/08-authentication/package.json -------------------------------------------------------------------------------- /code/30 Testing/08-authentication/routes/auth.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/08-authentication/routes/auth.js -------------------------------------------------------------------------------- /code/30 Testing/08-authentication/routes/feed.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/08-authentication/routes/feed.js -------------------------------------------------------------------------------- /code/30 Testing/08-authentication/test/start.mjs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/30 Testing/08-authentication/test/start.mjs -------------------------------------------------------------------------------- /code/32 Modern NodeJS/00-starting-setup/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/32 Modern NodeJS/00-starting-setup/app.js -------------------------------------------------------------------------------- /code/32 Modern NodeJS/01-es-modules/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/32 Modern NodeJS/01-es-modules/app.js -------------------------------------------------------------------------------- /code/32 Modern NodeJS/01-es-modules/my-page.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/32 Modern NodeJS/01-es-modules/my-page.html -------------------------------------------------------------------------------- /code/32 Modern NodeJS/01-es-modules/package.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/32 Modern NodeJS/01-es-modules/package.json -------------------------------------------------------------------------------- /code/32 Modern NodeJS/02-more-es-modules/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/32 Modern NodeJS/02-more-es-modules/app.js -------------------------------------------------------------------------------- /code/33 NodeJS Typescript/05-union-types/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/33 NodeJS Typescript/05-union-types/app.js -------------------------------------------------------------------------------- /code/33 NodeJS Typescript/05-union-types/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/33 NodeJS Typescript/05-union-types/app.ts -------------------------------------------------------------------------------- /code/33 NodeJS Typescript/08-node-typescript-setup/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /code/33 NodeJS Typescript/09-getting-started/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /code/33 NodeJS Typescript/10-adding-rest-routes/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /code/33 NodeJS Typescript/11-finishing-routes/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /code/33 NodeJS Typescript/12-testing-api/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /code/33 NodeJS Typescript/12-testing-api/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/33 NodeJS Typescript/12-testing-api/app.ts -------------------------------------------------------------------------------- /code/33 NodeJS Typescript/13-finished/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | -------------------------------------------------------------------------------- /code/33 NodeJS Typescript/13-finished/src/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/33 NodeJS Typescript/13-finished/src/app.ts -------------------------------------------------------------------------------- /code/34 Deno/01-first-demo/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/34 Deno/01-first-demo/.vscode/settings.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/01-first-demo/.vscode/settings.json -------------------------------------------------------------------------------- /code/34 Deno/01-first-demo/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/01-first-demo/app.ts -------------------------------------------------------------------------------- /code/34 Deno/02-permissions/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/34 Deno/02-permissions/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/02-permissions/app.ts -------------------------------------------------------------------------------- /code/34 Deno/02-permissions/message.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/02-permissions/message.txt -------------------------------------------------------------------------------- /code/34 Deno/03-node-example/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/34 Deno/03-node-example/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/03-node-example/app.js -------------------------------------------------------------------------------- /code/34 Deno/03-node-example/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/03-node-example/app.ts -------------------------------------------------------------------------------- /code/34 Deno/03-node-example/message.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/03-node-example/message.txt -------------------------------------------------------------------------------- /code/34 Deno/04-standard-library/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/34 Deno/04-standard-library/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/04-standard-library/app.js -------------------------------------------------------------------------------- /code/34 Deno/04-standard-library/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/04-standard-library/app.ts -------------------------------------------------------------------------------- /code/34 Deno/04-standard-library/message.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/04-standard-library/message.txt -------------------------------------------------------------------------------- /code/34 Deno/05-webserver-node/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/34 Deno/05-webserver-node/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/05-webserver-node/app.js -------------------------------------------------------------------------------- /code/34 Deno/05-webserver-node/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/05-webserver-node/app.ts -------------------------------------------------------------------------------- /code/34 Deno/05-webserver-node/message.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/05-webserver-node/message.txt -------------------------------------------------------------------------------- /code/34 Deno/06-oak-framework/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/34 Deno/06-oak-framework/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/06-oak-framework/app.js -------------------------------------------------------------------------------- /code/34 Deno/06-oak-framework/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/06-oak-framework/app.ts -------------------------------------------------------------------------------- /code/34 Deno/06-oak-framework/message.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/06-oak-framework/message.txt -------------------------------------------------------------------------------- /code/34 Deno/07-rest-example-node/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/34 Deno/07-rest-example-node/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/07-rest-example-node/app.js -------------------------------------------------------------------------------- /code/34 Deno/07-rest-example-node/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/07-rest-example-node/app.ts -------------------------------------------------------------------------------- /code/34 Deno/07-rest-example-node/message.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/07-rest-example-node/message.txt -------------------------------------------------------------------------------- /code/34 Deno/07-rest-example-node/node/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/07-rest-example-node/node/app.js -------------------------------------------------------------------------------- /code/34 Deno/08-rest-example-deno/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/34 Deno/08-rest-example-deno/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/08-rest-example-deno/app.js -------------------------------------------------------------------------------- /code/34 Deno/08-rest-example-deno/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/08-rest-example-deno/app.ts -------------------------------------------------------------------------------- /code/34 Deno/08-rest-example-deno/deno/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/08-rest-example-deno/deno/app.ts -------------------------------------------------------------------------------- /code/34 Deno/08-rest-example-deno/message.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/08-rest-example-deno/message.txt -------------------------------------------------------------------------------- /code/34 Deno/08-rest-example-deno/node/app.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/34 Deno/08-rest-example-deno/node/app.js -------------------------------------------------------------------------------- /code/35 Deno App/00-starting-setup/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/35 Deno App/00-starting-setup/deno/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/35 Deno App/00-starting-setup/deno/app.ts -------------------------------------------------------------------------------- /code/35 Deno App/01-handling-cors/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/35 Deno App/01-handling-cors/deno/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/35 Deno App/01-handling-cors/deno/app.ts -------------------------------------------------------------------------------- /code/35 Deno App/02-using-mongodb/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/35 Deno App/02-using-mongodb/deno/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/35 Deno App/02-using-mongodb/deno/app.ts -------------------------------------------------------------------------------- /code/35 Deno App/03-finishing-crud/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /code/35 Deno App/03-finishing-crud/deno/app.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/code/35 Deno App/03-finishing-crud/deno/app.ts -------------------------------------------------------------------------------- /slides/slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unsivilaudio/node.js-complete-guide-2024/HEAD/slides/slides.pdf --------------------------------------------------------------------------------