├── server-mock ├── jest.config.js ├── .gitignore ├── public │ ├── favicon.ico │ ├── icons │ │ ├── logo.png │ │ ├── logo2.png │ │ ├── zap.svg │ │ ├── user.svg │ │ ├── book.svg │ │ ├── bag.svg │ │ ├── coffee.svg │ │ ├── box.svg │ │ ├── github.svg │ │ └── shopping-bag.svg │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── mstile-150x150.png │ ├── apple-touch-icon.png │ ├── fonts │ │ ├── Sahel-VF.woff2 │ │ ├── dana-bold.woff │ │ ├── dana2webGX.woff │ │ ├── DubaiW23-Bold.eot │ │ ├── DubaiW23-Bold.ttf │ │ ├── DubaiW23-Bold.woff │ │ ├── DubaiW23-Light.eot │ │ ├── DubaiW23-Light.ttf │ │ ├── dana-regular.woff │ │ ├── DubaiW23-Bold.woff2 │ │ ├── DubaiW23-Light.woff │ │ ├── DubaiW23-Light.woff2 │ │ ├── DubaiW23-Medium.eot │ │ ├── DubaiW23-Medium.ttf │ │ ├── DubaiW23-Medium.woff │ │ ├── DubaiW23-Regular.eot │ │ ├── DubaiW23-Regular.ttf │ │ ├── DubaiW23-Medium.woff2 │ │ ├── DubaiW23-Regular.woff │ │ └── DubaiW23-Regular.woff2 │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── img │ │ ├── 51Y5NI-I5jL._AC_UX679_.jpg │ │ ├── 51eg55uWmdL._AC_UX679_.jpg │ │ ├── 61IBBVJvSDL._AC_SY879_.jpg │ │ ├── 61U7T1koQqL._AC_SX679_.jpg │ │ ├── 61mtL65D4cL._AC_SX679_.jpg │ │ ├── 61pHAEJ4NML._AC_UX679_.jpg │ │ ├── 71YXzeOuslL._AC_UY879_.jpg │ │ ├── 71kWymZ+c+L._AC_SX679_.jpg │ │ ├── 71li-ujtlUL._AC_UX679_.jpg │ │ ├── 71z3kpMAYsL._AC_UY879_.jpg │ │ ├── 81QpkIctqPL._AC_SX679_.jpg │ │ ├── 81XH0e8fefL._AC_UY879_.jpg │ │ ├── 81Zt42ioCgL._AC_SX679_.jpg │ │ ├── 81fPKd-2AYL._AC_SL1500_.jpg │ │ ├── 71HblAHs5xL._AC_UY879_-2.jpg │ │ ├── 51UDEzMJVpL._AC_UL640_QL65_ML3_.jpg │ │ ├── 61sbMiUnoGL._AC_UL640_QL65_ML3_.jpg │ │ ├── 71YAIFU48IL._AC_UL640_QL65_ML3_.jpg │ │ ├── 71pWzhdJNwL._AC_UL640_QL65_ML3_.jpg │ │ └── 71-3HjGNDUL._AC_SY879._SX._UX._SY._UY_.jpg │ ├── scss │ │ ├── _badge.scss │ │ ├── _table.scss │ │ ├── master.scss │ │ ├── _filters.scss │ │ ├── _fonts.scss │ │ ├── _variables.scss │ │ ├── _modal.scss │ │ ├── _typo.scss │ │ ├── _code.scss │ │ ├── _colors.scss │ │ ├── _form.scss │ │ ├── _reset.scss │ │ ├── _grids.scss │ │ ├── _nav.scss │ │ ├── _buttons.scss │ │ ├── _custom.scss │ │ └── _general.scss │ ├── browserconfig.xml │ ├── site.webmanifest │ ├── safari-pinned-tab.svg │ ├── js │ │ └── polyfill.min.js │ └── dist │ │ ├── master.min.css │ │ └── master.min.css.map ├── controller │ ├── home.js │ ├── auth.js │ ├── cart.js │ ├── product.js │ └── user.js ├── routes │ ├── auth.js │ ├── home.js │ ├── user.js │ ├── cart.js │ └── product.js ├── README.md ├── docker-compose.yml ├── model │ ├── product.js │ ├── cart.js │ └── user.js ├── package.json ├── dummyData.js ├── LICENSE ├── server.js ├── views │ ├── shared │ │ ├── footer.ejs │ │ ├── authDocs.ejs │ │ ├── aside.ejs │ │ ├── header.ejs │ │ ├── cartDocs.ejs │ │ ├── productDocs.ejs │ │ └── userDocs.ejs │ └── home │ │ ├── docs.ejs │ │ └── index.ejs └── __test__ │ ├── product.spec.js │ ├── user.spec.js │ └── cart.spec.js ├── nextjs-blog ├── public │ ├── favicon.ico │ └── vercel.svg ├── README.md ├── package.json ├── .gitignore └── pages │ ├── index.js │ └── best │ └── [category].js └── README.md /server-mock/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | testEnvironment: 'node' 3 | }; -------------------------------------------------------------------------------- /server-mock/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | package-lock.json 4 | .vscode 5 | app.js 6 | Procfile -------------------------------------------------------------------------------- /nextjs-blog/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/nextjs-blog/public/favicon.ico -------------------------------------------------------------------------------- /server-mock/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/favicon.ico -------------------------------------------------------------------------------- /nextjs-blog/README.md: -------------------------------------------------------------------------------- 1 | This is a starter template for [Learn Next.js](https://nextjs.org/learn). 2 | 3 | 4 | ### Start 5 | `npm run dev` -------------------------------------------------------------------------------- /server-mock/public/icons/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/icons/logo.png -------------------------------------------------------------------------------- /server-mock/public/icons/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/icons/logo2.png -------------------------------------------------------------------------------- /server-mock/public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/favicon-16x16.png -------------------------------------------------------------------------------- /server-mock/public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/favicon-32x32.png -------------------------------------------------------------------------------- /server-mock/public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/mstile-150x150.png -------------------------------------------------------------------------------- /server-mock/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/apple-touch-icon.png -------------------------------------------------------------------------------- /server-mock/public/fonts/Sahel-VF.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/Sahel-VF.woff2 -------------------------------------------------------------------------------- /server-mock/public/fonts/dana-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/dana-bold.woff -------------------------------------------------------------------------------- /server-mock/public/fonts/dana2webGX.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/dana2webGX.woff -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Bold.eot -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Bold.ttf -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Bold.woff -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Light.eot -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Light.ttf -------------------------------------------------------------------------------- /server-mock/public/fonts/dana-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/dana-regular.woff -------------------------------------------------------------------------------- /server-mock/public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /server-mock/public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Bold.woff2 -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Light.woff -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Light.woff2 -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Medium.eot -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Medium.ttf -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Medium.woff -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Regular.eot -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Regular.ttf -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Medium.woff2 -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Regular.woff -------------------------------------------------------------------------------- /server-mock/public/fonts/DubaiW23-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/fonts/DubaiW23-Regular.woff2 -------------------------------------------------------------------------------- /server-mock/public/img/51Y5NI-I5jL._AC_UX679_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/51Y5NI-I5jL._AC_UX679_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/51eg55uWmdL._AC_UX679_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/51eg55uWmdL._AC_UX679_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/61IBBVJvSDL._AC_SY879_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/61IBBVJvSDL._AC_SY879_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/61U7T1koQqL._AC_SX679_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/61U7T1koQqL._AC_SX679_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/61mtL65D4cL._AC_SX679_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/61mtL65D4cL._AC_SX679_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/61pHAEJ4NML._AC_UX679_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/61pHAEJ4NML._AC_UX679_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/71YXzeOuslL._AC_UY879_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/71YXzeOuslL._AC_UY879_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/71kWymZ+c+L._AC_SX679_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/71kWymZ+c+L._AC_SX679_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/71li-ujtlUL._AC_UX679_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/71li-ujtlUL._AC_UX679_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/71z3kpMAYsL._AC_UY879_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/71z3kpMAYsL._AC_UY879_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/81QpkIctqPL._AC_SX679_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/81QpkIctqPL._AC_SX679_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/81XH0e8fefL._AC_UY879_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/81XH0e8fefL._AC_UY879_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/81Zt42ioCgL._AC_SX679_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/81Zt42ioCgL._AC_SX679_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/81fPKd-2AYL._AC_SL1500_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/81fPKd-2AYL._AC_SL1500_.jpg -------------------------------------------------------------------------------- /server-mock/public/scss/_badge.scss: -------------------------------------------------------------------------------- 1 | .badge { 2 | padding: 3px; 3 | border-radius: 2px; 4 | background-color: lighten($primary, 0.2); 5 | color: #fff; 6 | } -------------------------------------------------------------------------------- /server-mock/public/img/71HblAHs5xL._AC_UY879_-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/71HblAHs5xL._AC_UY879_-2.jpg -------------------------------------------------------------------------------- /server-mock/public/img/51UDEzMJVpL._AC_UL640_QL65_ML3_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/51UDEzMJVpL._AC_UL640_QL65_ML3_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/61sbMiUnoGL._AC_UL640_QL65_ML3_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/61sbMiUnoGL._AC_UL640_QL65_ML3_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/71YAIFU48IL._AC_UL640_QL65_ML3_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/71YAIFU48IL._AC_UL640_QL65_ML3_.jpg -------------------------------------------------------------------------------- /server-mock/public/img/71pWzhdJNwL._AC_UL640_QL65_ML3_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/71pWzhdJNwL._AC_UL640_QL65_ML3_.jpg -------------------------------------------------------------------------------- /server-mock/controller/home.js: -------------------------------------------------------------------------------- 1 | module.exports.indexPage = (req,res) => { 2 | res.render('home/index') 3 | } 4 | 5 | module.exports.docsPage = (req,res) => { 6 | res.render('home/docs') 7 | } -------------------------------------------------------------------------------- /server-mock/public/img/71-3HjGNDUL._AC_SY879._SX._UX._SY._UY_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agamm/next-programmatic-seo-tutorial/HEAD/server-mock/public/img/71-3HjGNDUL._AC_SY879._SX._UX._SY._UY_.jpg -------------------------------------------------------------------------------- /server-mock/routes/auth.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const auth = require("../controller/auth"); 4 | 5 | router.post("/login", auth.login); 6 | 7 | module.exports = router; 8 | -------------------------------------------------------------------------------- /server-mock/routes/home.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const home = require('../controller/home') 4 | 5 | router.get('/',home.indexPage) 6 | router.get('/docs',home.docsPage) 7 | 8 | module.exports = router -------------------------------------------------------------------------------- /server-mock/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Setup 4 | ``` 5 | npm install . 6 | docker-compose up -d 7 | ``` 8 | 9 | # Running 10 | `MONGO_MOCK_DB_CREDS='mongodb://admin:123456@127.0.0.1:27017' node server.js` 11 | 12 | # Populat with data (while server is running) 13 | `node dummyData.js` -------------------------------------------------------------------------------- /server-mock/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | mongodb: 5 | image: mongo:5.0 6 | ports: 7 | - 27017:27017 8 | volumes: 9 | - ~/apps/mongo:/data/db 10 | environment: 11 | - MONGO_INITDB_ROOT_USERNAME=admin 12 | - MONGO_INITDB_ROOT_PASSWORD=123456 -------------------------------------------------------------------------------- /server-mock/public/icons/zap.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server-mock/public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #802c6e 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /nextjs-blog/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "next dev", 5 | "build": "next build", 6 | "start": "next start" 7 | }, 8 | "dependencies": { 9 | "next": "latest", 10 | "next-seo": "^5.2.0", 11 | "react": "17.0.2", 12 | "react-dom": "17.0.2" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /server-mock/public/scss/_table.scss: -------------------------------------------------------------------------------- 1 | table{ 2 | width: 100%; 3 | border-collapse: collapse; 4 | } 5 | table tr td{ 6 | border: 1px solid rgba(123,123,123,0.2); 7 | padding: 10px; 8 | } 9 | table a{ 10 | margin: 10px; 11 | } 12 | table thead td{ 13 | font-weight: 500; 14 | background-color: #f5f5f5; 15 | } -------------------------------------------------------------------------------- /server-mock/public/icons/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server-mock/public/icons/book.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server-mock/public/scss/master.scss: -------------------------------------------------------------------------------- 1 | @import "fonts"; 2 | @import "typo"; 3 | @import "variables"; 4 | @import "reset"; 5 | @import "grids"; 6 | @import "buttons"; 7 | @import "general"; 8 | @import "form"; 9 | @import "colors"; 10 | @import "filters"; 11 | @import "modal"; 12 | @import "table"; 13 | @import "nav"; 14 | @import "code"; 15 | @import "custom"; 16 | @import "badge"; -------------------------------------------------------------------------------- /server-mock/public/scss/_filters.scss: -------------------------------------------------------------------------------- 1 | @mixin grayscale($val){ 2 | filter: grayscale($val); 3 | -webkit-filter: grayscale($val); 4 | } 5 | .grayscale-max{ 6 | @include grayscale(100); 7 | } 8 | .grayscale-semi-max{ 9 | @include grayscale(80); 10 | } 11 | .grayscale-mid{ 12 | @include grayscale(50); 13 | } 14 | .grayscale-min{ 15 | @include grayscale(30); 16 | } -------------------------------------------------------------------------------- /server-mock/public/icons/bag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server-mock/routes/user.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const user = require('../controller/user') 4 | 5 | router.get('/',user.getAllUser) 6 | router.get('/:id',user.getUser) 7 | router.post('/',user.addUser) 8 | router.put('/:id',user.editUser) 9 | router.patch('/:id',user.editUser) 10 | router.delete('/:id',user.deleteUser) 11 | 12 | module.exports = router -------------------------------------------------------------------------------- /server-mock/public/icons/coffee.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server-mock/public/icons/box.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nextjs-blog/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | 21 | # debug 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | # local env files 27 | .env.local 28 | .env.development.local 29 | .env.test.local 30 | .env.production.local 31 | -------------------------------------------------------------------------------- /server-mock/public/scss/_fonts.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'dana VF'; 3 | src: url('../fonts/dana2webGX.woff') format('woff-variations'), 4 | url('../fonts/dana2webGX.woff') format('woff'); 5 | font-display: fallback; 6 | } 7 | 8 | 9 | @font-face { 10 | font-family: dana; 11 | src: url('../fonts/dana-regular.woff') format('woff'); 12 | } 13 | @font-face { 14 | font-family: dana; 15 | src: url('../fonts/dana-bold.woff') format('woff'); 16 | font-weight: 700; 17 | } -------------------------------------------------------------------------------- /server-mock/routes/cart.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const cart = require('../controller/cart') 4 | 5 | router.get('/',cart.getAllCarts) 6 | router.get('/:id',cart.getSingleCart) 7 | router.get('/user/:userid',cart.getCartsbyUserid) 8 | 9 | router.post('/',cart.addCart) 10 | //router.post('/:id',cart.addtoCart) 11 | 12 | router.put('/:id',cart.editCart) 13 | router.patch('/:id',cart.editCart) 14 | router.delete('/:id',cart.deleteCart) 15 | 16 | module.exports = router 17 | -------------------------------------------------------------------------------- /server-mock/public/icons/github.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server-mock/public/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | $primary:#802c6e; 2 | $secondary:#f7aa35; 3 | $danger:#a71e22; 4 | $success:rgb(0, 233, 136); 5 | $warning:rgb(255, 211, 13); 6 | $muted:rgb(162, 162, 162); 7 | $light:#f5f5f5; 8 | $dark:rgb(121, 121, 121); 9 | $grey:rgb(143, 143, 148); 10 | $darkgrey:#494949; 11 | $black:rgb(27, 27, 27); 12 | $white:#fff; 13 | $mobile: 'only screen and (max-width:480px)'; 14 | $tablet: 'only screen and (max-width:769px)'; 15 | $small-desktop: 'only screen and (min-width:769px)'; 16 | $desktop: 'only screen and (min-width:992px)'; -------------------------------------------------------------------------------- /server-mock/public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Fake Store", 3 | "short_name": "Fake Store", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /server-mock/routes/product.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const router = express.Router(); 3 | const product = require("../controller/product"); 4 | 5 | router.get("/", product.getAllProducts); 6 | router.get("/categories", product.getProductCategories); 7 | router.get("/category/:category", product.getProductsInCategory); 8 | router.get("/:id", product.getProduct); 9 | router.post("/", product.addProduct); 10 | router.put("/:id", product.editProduct); 11 | router.patch("/:id", product.editProduct); 12 | router.delete("/:id", product.deleteProduct); 13 | 14 | module.exports = router; 15 | -------------------------------------------------------------------------------- /server-mock/model/product.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const schema = mongoose.Schema 3 | 4 | const productSchema = new schema({ 5 | id:{ 6 | type:Number, 7 | required:true 8 | }, 9 | title:{ 10 | type:String, 11 | required:true 12 | }, 13 | price:{ 14 | type:Number, 15 | required:true 16 | }, 17 | rating:{ 18 | type:Number, 19 | required:true 20 | }, 21 | description:String, 22 | image:String, 23 | category:String 24 | }) 25 | 26 | module.exports = mongoose.model('product',productSchema) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # next-programmatic-seo-tutorial 2 | 3 | > **Warning** 4 | > This is an old repo, use the new one: 5 | 6 | 7 | **New Next-13 Repository:** 8 | [agamm/pseo-next](https://github.com/agamm/pseo-next) 9 | 10 | --- 11 | 12 | A simplistic guide on how to use Next.js for a programmatic SEO project. 13 | 14 | Check more here: https://unzip.dev/0x003-programmatic-seo/ 15 | 16 | Tutorial at: https://dev.to/agamm/programmatic-seo-with-nextjs-pmh 17 | 18 | 19 | ### Notes 20 | 21 | Make sure you are running: 22 | ``` 23 | npm run build 24 | npm run start 25 | ``` 26 | So Next.js will not re-generate the page each time (it does so in dev mode). 27 | -------------------------------------------------------------------------------- /server-mock/controller/auth.js: -------------------------------------------------------------------------------- 1 | const User = require("../model/user"); 2 | 3 | module.exports.login = (req, res) => { 4 | const username = req.body.username; 5 | const password = req.body.password; 6 | 7 | if (username && password) { 8 | User.findOne({ 9 | username, 10 | }) 11 | .then((user) => { 12 | if (!user) { 13 | res.json({ 14 | status: "Error", 15 | msg: "username or password is incorrect", 16 | }); 17 | } else { 18 | res.json({ 19 | token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9", 20 | }); 21 | } 22 | }) 23 | .catch((err) => { 24 | console.log(err); 25 | }); 26 | } 27 | }; 28 | -------------------------------------------------------------------------------- /server-mock/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "1.0.0", 4 | "description": "FakeStoreAPI is a free online REST API that provides you fake e-commerce JSON data", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "jest", 8 | "start": "node server.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^0.24.0", 14 | "bcryptjs": "^2.4.3", 15 | "cors": "^2.8.5", 16 | "express": "^4.17.1", 17 | "faker": "^5.5.3", 18 | "jsonwebtoken": "^8.5.1", 19 | "mongoose": "^5.9.6" 20 | }, 21 | "devDependencies": { 22 | "ejs": "^3.1.6", 23 | "jest": "^27.0.6", 24 | "nodemon": "^2.0.9", 25 | "supertest": "^6.1.3" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /server-mock/public/scss/_modal.scss: -------------------------------------------------------------------------------- 1 | .modalwrapper{ 2 | width: 100%; 3 | height: 100vh; 4 | position: fixed; 5 | top: 0; 6 | right: 0; 7 | left: 0; 8 | bottom: 0; 9 | z-index: 100; 10 | background-color: rgba(0,0,0,0.7); 11 | display: none; 12 | } 13 | .modal{ 14 | width: 80%; 15 | height: 80vh; 16 | overflow: auto; 17 | position: absolute; 18 | top: 50%; 19 | left: 50%; 20 | transform: translate(-50%,-50%); 21 | border-radius: 3px; 22 | z-index: 99; 23 | background-color: #fff; 24 | padding: 30px; 25 | } 26 | .close{ 27 | background-color: unset; 28 | border: unset; 29 | box-shadow: none; 30 | outline: none; 31 | float: right; 32 | font-size: 2.2em; 33 | cursor: pointer; 34 | } 35 | .hide{ 36 | display: none; 37 | } 38 | .block{ 39 | display: block; 40 | } -------------------------------------------------------------------------------- /server-mock/model/cart.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const schema = mongoose.Schema 3 | const Product = require('./product') 4 | const User = require('./user') 5 | 6 | const cartSchema = new schema({ 7 | id:{ 8 | type:Number, 9 | required:true 10 | }, 11 | userId:{ 12 | type:schema.Types.Number, 13 | ref:User, 14 | required:true 15 | }, 16 | date:{ 17 | type:Date, 18 | required:true 19 | }, 20 | products:[ 21 | { 22 | productId:{ 23 | type:schema.Types.Number, 24 | ref:Product, 25 | required:true 26 | }, 27 | quantity:{ 28 | type:Number, 29 | required:true 30 | } 31 | } 32 | ] 33 | }) 34 | 35 | module.exports =mongoose.model('cart',cartSchema) -------------------------------------------------------------------------------- /server-mock/dummyData.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | 3 | const faker = require('Faker'); // let's hope this doesn't break again ;) 4 | 5 | const serverURL = 'http://127.0.0.1:6400'; 6 | 7 | const amountOfData = 500; 8 | let requests = []; 9 | 10 | 11 | function between(min, max) { 12 | return Math.floor( 13 | Math.random() * (max - min) + min 14 | ) 15 | } 16 | 17 | 18 | for (let i = 0; i < amountOfData; i++) { 19 | const data = { 20 | 'title': faker.commerce.productName(), 21 | 'price': faker.commerce.price(), 22 | 'description': faker.commerce.productDescription(), 23 | 'image': faker.image.cats(), 24 | 'category': faker.commerce.department(), 25 | 'rating': between(1,100) 26 | } 27 | const req = axios.post(`${serverURL}/products`, data); 28 | 29 | requests.push(req); 30 | } 31 | 32 | axios.all(requests).then(res => { 33 | console.log("Saved data."); 34 | }).catch(err => { 35 | console.log(err); 36 | }); -------------------------------------------------------------------------------- /server-mock/public/scss/_typo.scss: -------------------------------------------------------------------------------- 1 | body{ 2 | font-size: 16px; 3 | } 4 | // *:not(.fab):not(.fas):not(.far):not(.fa){ 5 | // font-family: Dubai; 6 | // } 7 | 8 | * { 9 | font-family: dana; 10 | } 11 | @supports (font-variation-settings: normal) { 12 | * { 13 | font-family: 'dana VF'; 14 | font-variation-settings: "FANU" 0; 15 | } 16 | } 17 | h1,h2,h3{ 18 | letter-spacing: -1px; 19 | } 20 | h1{ 21 | font-variation-settings: "wght" 600; 22 | } 23 | h2{ 24 | font-variation-settings: "wght" 500 25 | } 26 | h3{ 27 | font-variation-settings: "wght" 400 28 | } 29 | 30 | h4,h5,h6{ 31 | line-height: 2; 32 | margin: 15px 0; 33 | font-variation-settings: "wght" 300 34 | } 35 | p{ 36 | line-height: 1.5; 37 | font-size: 1.1em; 38 | font-variation-settings: "wght" 200 39 | } 40 | a{ 41 | // color: rgb(0, 0, 87); 42 | //font-size: 0.9em; 43 | color: rgb(0, 153, 255); 44 | } 45 | h1,h2,h3,h4,h5,h6,p,label{ 46 | color: #3a3134; 47 | } -------------------------------------------------------------------------------- /server-mock/model/user.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const schema = mongoose.Schema 3 | 4 | const userSchema = new schema({ 5 | id:{ 6 | type:Number, 7 | required:true 8 | }, 9 | email:{ 10 | type:String, 11 | required:true 12 | }, 13 | username:{ 14 | type:String, 15 | required:true 16 | }, 17 | password:{ 18 | type:String, 19 | required:true 20 | }, 21 | name:{ 22 | firstname:{ 23 | type:String, 24 | required:true 25 | }, 26 | lastname:{ 27 | type:String, 28 | required:true 29 | } 30 | }, 31 | address:{ 32 | city:String, 33 | street:String, 34 | number:Number, 35 | zipcode:String, 36 | geolocation:{ 37 | lat:String, 38 | long:String 39 | } 40 | }, 41 | phone:String 42 | }) 43 | 44 | module.exports = mongoose.model('user',userSchema) -------------------------------------------------------------------------------- /server-mock/public/scss/_code.scss: -------------------------------------------------------------------------------- 1 | pre{ 2 | width: 100%; 3 | border-radius: 7px; 4 | margin-bottom: 20px; 5 | } 6 | code{ 7 | width: 100%; 8 | background-color: #f5f5f5; 9 | padding:20px; 10 | display: block; 11 | line-height: 1.5; 12 | font-size: 1.1em; 13 | font-weight: 300; 14 | letter-spacing: 2px; 15 | } 16 | code:empty{ 17 | padding: 0; 18 | } 19 | #try{ 20 | margin-top: 100px; 21 | code{ 22 | overflow-x: auto; 23 | } 24 | } 25 | .c-comment{ 26 | color: rgb(189, 189, 189); 27 | } 28 | .c-api{ 29 | color: $primary; 30 | 31 | } 32 | .code-area{ 33 | h2{ 34 | font-size: 1.7em; 35 | } 36 | h3{ 37 | margin-top: 50px; 38 | @media screen and (max-width:480px){ 39 | margin-top: 30px; 40 | } 41 | font-size: 1.4em; 42 | } 43 | } 44 | pre{ 45 | code{ 46 | overflow-x: auto; 47 | } 48 | } 49 | .tips{ 50 | color: $secondary; 51 | } 52 | .output-result{ 53 | display: none; 54 | } 55 | .block{ 56 | display: block; 57 | } -------------------------------------------------------------------------------- /nextjs-blog/public/vercel.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /server-mock/public/scss/_colors.scss: -------------------------------------------------------------------------------- 1 | /*background-color*/ 2 | .primary{ 3 | background-color: $primary; 4 | } 5 | .secondary{ 6 | background-color: $secondary; 7 | } 8 | .danger{ 9 | background-color: $danger; 10 | } 11 | .success{ 12 | background-color: $success; 13 | } 14 | .warning{ 15 | background-color: $warning; 16 | } 17 | .muted{ 18 | background-color: $muted; 19 | } 20 | .light{ 21 | background-color: $light; 22 | } 23 | .dark{ 24 | background-color: $dark; 25 | } 26 | .black{ 27 | background-color: $black; 28 | } 29 | .white{ 30 | background-color: $white; 31 | } 32 | /*color*/ 33 | .text-primary{ 34 | color: $primary; 35 | } 36 | .text-secondary{ 37 | color: $secondary; 38 | } 39 | .text-danger{ 40 | color: $danger 41 | } 42 | .text-success{ 43 | color: $success; 44 | } 45 | .text-warning{ 46 | color: $warning; 47 | } 48 | .text-muted{ 49 | color: $muted; 50 | } 51 | .text-light{ 52 | color: $light; 53 | } 54 | .text-dark{ 55 | color: $dark; 56 | } 57 | .text-black{ 58 | color: $black; 59 | } 60 | .text-white{ 61 | color: $white; 62 | } -------------------------------------------------------------------------------- /server-mock/public/icons/shopping-bag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server-mock/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 MohammadReza Keikavousi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /server-mock/server.js: -------------------------------------------------------------------------------- 1 | //initializes 2 | const mongoose = require("mongoose"); 3 | const express = require("express"); 4 | const cors = require("cors"); 5 | const path = require("path"); 6 | 7 | //app 8 | const app = express(); 9 | 10 | //port 11 | const port = 6400; 12 | const mongoCreds = process.env.MONGO_MOCK_DB_CREDS; // process.env.MONGO_MOCK_DB_CREDS 13 | 14 | //routes 15 | const productRoute = require("./routes/product"); 16 | const homeRoute = require("./routes/home"); 17 | const cartRoute = require("./routes/cart"); 18 | const userRoute = require("./routes/user"); 19 | const authRoute = require("./routes/auth"); 20 | 21 | //middleware 22 | app.use(cors()); 23 | 24 | app.use(express.static(path.join(__dirname, "/public"))); 25 | app.use(express.urlencoded({ extended: true })); 26 | app.use(express.json()); 27 | 28 | //view engine 29 | app.set("view engine", "ejs"); 30 | app.set("views", "views"); 31 | 32 | app.disable("view cache"); 33 | 34 | app.use("/", homeRoute); 35 | app.use("/products", productRoute); 36 | app.use("/carts", cartRoute); 37 | app.use("/users", userRoute); 38 | app.use("/auth", authRoute); 39 | 40 | //mongoose 41 | mongoose.set("useFindAndModify", false); 42 | mongoose.set("useUnifiedTopology", true); 43 | mongoose 44 | .connect(mongoCreds, { useNewUrlParser: true }) 45 | .then(() => { 46 | app.listen(process.env.PORT || port, () => { 47 | console.log(`eCommerce API listening at ${process.env.PORT || port}...`); 48 | }); 49 | }) 50 | .catch((err) => { 51 | console.log(err); 52 | }); 53 | 54 | module.exports = app; 55 | -------------------------------------------------------------------------------- /server-mock/views/shared/footer.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 12 | 13 | 24 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /server-mock/public/scss/_form.scss: -------------------------------------------------------------------------------- 1 | %inputs{ 2 | &:focus{ 3 | border-color: $black; 4 | } 5 | border: none; 6 | margin-bottom: 20px; 7 | padding: 0 10px; 8 | font-size: 1em; 9 | } 10 | input{ 11 | height: 40px; 12 | @extend %inputs; 13 | width: 30%; 14 | } 15 | select{ 16 | height: 40px; 17 | @extend %inputs; 18 | } 19 | textarea{ 20 | @extend %inputs; 21 | width: 97%; 22 | } 23 | textarea::-moz-placeholder { /* Mozilla Firefox 19+ */ 24 | line-height:6; 25 | } 26 | textarea::-webkit-input-placeholder { /* Webkit */ 27 | line-height:6; 28 | } 29 | textarea:-ms-input-placeholder { /* IE */ 30 | line-height:6; 31 | } 32 | input[type="button"]{ 33 | @extend %inputs; 34 | cursor: pointer; 35 | } 36 | input[type="submit"]{ 37 | @extend %inputs; 38 | cursor: pointer; 39 | } 40 | button{ 41 | @extend %inputs; 42 | display: inline-block; 43 | width: auto; 44 | cursor: pointer; 45 | } 46 | ::placeholder{ 47 | color: rgb(184, 183, 183) 48 | } 49 | input,button,textarea{ 50 | appearance: none; 51 | -webkit-appearance: none; 52 | -moz-appearance:none; 53 | } 54 | .form-element{ 55 | position: relative; 56 | margin: 30px auto; 57 | } 58 | .flt-label{ 59 | color: rgba(123,123,123,0.7); 60 | position: absolute; 61 | top:5px; 62 | right:12px; 63 | font-size: 0.9em; 64 | cursor: text; 65 | } 66 | .flt-label-focus{ 67 | top:-15px; 68 | padding: 2px; 69 | background-color: #fff; 70 | color: rgba(123,123,123,0.5); 71 | } 72 | .no-block{ 73 | width:unset; 74 | } 75 | .red{ 76 | color: red; 77 | } 78 | input[readonly]{ 79 | background-color: #ccc; 80 | } -------------------------------------------------------------------------------- /server-mock/views/shared/authDocs.ejs: -------------------------------------------------------------------------------- 1 |

2 | 5 | 6 | 7 | 8 | Login

9 |

User login

10 |
fetch('https://fakestoreapi.com/auth/login',{
11 |             method:'POST',
12 |             body:JSON.stringify({
13 |                 username: "mor_2314",
14 |                 password: "83r5^_"
15 |             })
16 |         })
17 |             .then(res=>res.json())
18 |             .then(json=>console.log(json))
19 | 20 |

21 |             //output
22 |         {
23 |             token: "eyJhbGciOiJIUzI1NiIsInR"
24 |         }
25 |         
26 | 27 |

28 | 29 | 32 | 33 | 34 | 35 | You can use any of the users' username and password available in users API to get token. 36 | any other usernames return error. 37 |

-------------------------------------------------------------------------------- /server-mock/views/shared/aside.ejs: -------------------------------------------------------------------------------- 1 | 16 | 17 | 35 | 36 | 51 | 52 | -------------------------------------------------------------------------------- /server-mock/public/scss/_reset.scss: -------------------------------------------------------------------------------- 1 | :root{ 2 | --green:#66c3d0; 3 | --blue:#008dd2; 4 | --shadow:0 0 20px 10px rgba(134, 134, 134, 0.05); 5 | } 6 | *{ 7 | margin:0; 8 | padding: 0; 9 | outline: none; 10 | transition: all 0.5s ease; 11 | } 12 | *, 13 | *::before, 14 | *::after { 15 | box-sizing: border-box; 16 | } 17 | html{ 18 | -webkit-tap-highlight-color: transparent; 19 | scroll-behavior: smooth; 20 | } 21 | body, html { 22 | width: 100% !important; 23 | overflow-x: hidden !important; 24 | top: 0 !important; 25 | } 26 | body{ 27 | background-color: #fffdfd; 28 | position: absolute !important; 29 | } 30 | *:active, 31 | *:focus{ 32 | outline: none 33 | } 34 | ::selection{ 35 | color: $light; 36 | background-color: $dark 37 | } 38 | ::-moz-selection{ 39 | color: $light; 40 | background-color: $dark 41 | } 42 | %no-text-decoration{ 43 | text-decoration: none; 44 | } 45 | h1,h2,h3,h4,h5,h6{ 46 | color: var(--dark-green); 47 | } 48 | a{ 49 | &:hover, 50 | &:active, 51 | &:focus{ 52 | @extend %no-text-decoration; 53 | } 54 | @extend %no-text-decoration; 55 | } 56 | 57 | ul{ 58 | li{ 59 | list-style: none; 60 | } 61 | } 62 | img{ 63 | max-width: 100%; 64 | } 65 | @media only screen and (min-width:768px){ 66 | .reset-padding{ 67 | padding: 0 !important; 68 | } 69 | .reset-margin{ 70 | margin: 0 !important; 71 | } 72 | .reset-margin-top{ 73 | margin-top: 0 !important; 74 | } 75 | .reset-margin-right{ 76 | margin-right: 0 !important; 77 | } 78 | .reset-margin-left{ 79 | margin-left: 0 !important; 80 | } 81 | .reset-margin-bottom{ 82 | margin-bottom: 0 !important; 83 | } 84 | .reset-padding-top{ 85 | padding-top: 0 !important; 86 | } 87 | .reset-padding-right{ 88 | padding-right: 0 !important; 89 | } 90 | .reset-padding-left{ 91 | padding-left: 0 !important; 92 | } 93 | .reset-padding-bottom{ 94 | padding-bottom: 0 !important; 95 | } 96 | } -------------------------------------------------------------------------------- /server-mock/public/scss/_grids.scss: -------------------------------------------------------------------------------- 1 | .container{ 2 | width: 60%; 3 | margin-right: auto; 4 | margin-left: auto; 5 | // display: flex; 6 | // flex-flow: row nowrap; 7 | // justify-content: space-evenly; 8 | @media #{$tablet}{ 9 | width: 100%; 10 | } 11 | } 12 | .container-fluid{ 13 | width: 100%; 14 | margin-right: auto; 15 | margin-left: auto; 16 | // display: flex; 17 | // flex-flow: row nowrap; 18 | } 19 | .row{ 20 | width: 100%; 21 | display: -webkit-box; 22 | display: -ms-flexbox; 23 | display: flex; 24 | 25 | -ms-flex-wrap: wrap; 26 | flex-wrap: wrap; 27 | 28 | justify-content: space-between; 29 | } 30 | %col{ 31 | flex-grow: 1; 32 | max-width: 100%; 33 | padding: 15px; 34 | min-height: 1px; 35 | position: relative; 36 | } 37 | .col{ 38 | flex-basis: 0; 39 | // border: 1px solid black; 40 | @media #{$tablet}{ 41 | flex-basis: 100%; 42 | } 43 | } 44 | 45 | @mixin colgrid(){ 46 | @for $i from 1 to 13 { 47 | .col-#{$i}{ 48 | -ms-flex-preferred-size: percentage($i / 12); 49 | max-width: percentage($i / 12); 50 | flex-basis: percentage($i / 12); 51 | } 52 | } 53 | } 54 | 55 | @include colgrid; 56 | 57 | @mixin grid-generator($size) { 58 | @for $i from 1 through 12 { 59 | .col-#{$size}-#{$i} { 60 | -ms-flex-preferred-size: percentage($i / 12); 61 | max-width: percentage($i / 12); 62 | flex-basis: percentage($i / 12); 63 | } 64 | } 65 | } 66 | 67 | @media #{$mobile}{ 68 | @include grid-generator(xs); 69 | } 70 | @media #{$tablet}{ 71 | @include grid-generator(sm); 72 | } 73 | @media #{$small-desktop}{ 74 | @include grid-generator(md); 75 | } 76 | @media #{$desktop}{ 77 | @include grid-generator(lg); 78 | } 79 | 80 | [class^="col"]{ 81 | @extend %col; 82 | } 83 | .wrap{ 84 | flex-wrap: wrap; 85 | } 86 | .flex-end{ 87 | justify-content: flex-end; 88 | } 89 | .flex-start{ 90 | justify-content: flex-start; 91 | } 92 | 93 | -------------------------------------------------------------------------------- /server-mock/public/scss/_nav.scss: -------------------------------------------------------------------------------- 1 | nav{ 2 | background-color: transparent; 3 | padding: 10px; 4 | #menu-icon{ 5 | display: none; 6 | @media only screen and (max-width:768px){ 7 | position: absolute; 8 | right: 20px; 9 | top: 20px; 10 | background: transparent; 11 | border: none; 12 | outline: none; 13 | display: block; 14 | width: 40px; 15 | height: 40px; 16 | padding: 10px; 17 | z-index: 100; 18 | &.open{ 19 | span{ 20 | &:first-child{ 21 | transform:rotate(-45deg) translate(-5px,5px) 22 | } 23 | &:last-child{ 24 | transform:rotate(45deg) 25 | } 26 | } 27 | } 28 | } 29 | span{ 30 | display: block; 31 | width:100%; 32 | border-bottom: 2px solid #333; 33 | margin-bottom: 5px; 34 | } 35 | } 36 | ul{ 37 | display: flex; 38 | justify-content: flex-end; 39 | position: relative; 40 | 41 | @media only screen and (max-width:480px){ 42 | position: fixed; 43 | right: -100%; 44 | top: 0; 45 | bottom: 0; 46 | z-index:99; 47 | height: 100vh; 48 | width: 100%; 49 | background-color: #fff; 50 | flex-direction: column; 51 | justify-content: center; 52 | align-items: center; 53 | &.open{ 54 | right: 0; 55 | } 56 | } 57 | li{ 58 | margin: 30px; 59 | @media only screen and (max-width:480px){ 60 | margin-bottom: 20px; 61 | } 62 | a{ 63 | text-decoration: none; 64 | color: rgb(110, 110, 110); 65 | font-size: 0.9em; 66 | &:hover{ 67 | color: initial; 68 | } 69 | } 70 | } 71 | 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /server-mock/views/home/docs.ejs: -------------------------------------------------------------------------------- 1 | <%- include("../shared/header.ejs") %> 2 | 3 | 6 | 7 |
8 |
9 |

How to use it

10 |

11 | fakeStoreApi can be used with any type of shopping project that needs products, carts, and users in JSON 12 | format. you can use examples below to check how fakeStoreApi works and feel free to enjoy it in your awesome 13 | projects! 14 |

15 |
16 |
17 | 18 |
19 | 20 | 23 | 24 | 25 |
26 | <%- include("../shared/productDocs.ejs") %> 27 | 28 | <%- include("../shared/cartDocs.ejs") %> 29 | 30 | <%- include("../shared/userDocs.ejs") %> 31 | 32 | <%- include("../shared/authDocs.ejs") %> 33 |
34 | 35 |
36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 55 | 69 | <%- include("../shared/footer.ejs") %> -------------------------------------------------------------------------------- /server-mock/views/shared/header.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Fake Store API 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 36 | 37 | 38 | 39 | 40 | 41 |
42 | 56 |
-------------------------------------------------------------------------------- /server-mock/public/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.11, written by Peter Selinger 2001-2013 9 | 10 | 12 | 32 | 34 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /server-mock/__test__/product.spec.js: -------------------------------------------------------------------------------- 1 | const supertest = require("supertest") 2 | const app = require("../app") 3 | 4 | describe("Testing products API", () => { 5 | it("all product", async () => { 6 | const response = await supertest(app).get("/products") 7 | expect(response.status).toBe(200) 8 | console.log('get', response.body) 9 | expect(response.body).not.toStrictEqual([]) 10 | }) 11 | 12 | it("get a single product", async () => { 13 | const response = await supertest(app).get("/products/1") 14 | expect(response.status).toBe(200) 15 | console.log('get by id', response.body) 16 | expect(response.body).not.toStrictEqual({}) 17 | expect(response.body).toHaveProperty('title') 18 | }) 19 | 20 | 21 | it("get products in a category", async () => { 22 | const response = await supertest(app).get("/products/category/jewelery") 23 | expect(response.status).toBe(200) 24 | console.log('get by category', response.body) 25 | expect(response.body).not.toStrictEqual([]) 26 | }) 27 | 28 | 29 | it("get products in a limit and sort", async () => { 30 | const response = await supertest(app).get("/products?limit=3&sort=desc") 31 | expect(response.status).toBe(200) 32 | console.log('get with querystring', response.body) 33 | expect(response.body).not.toStrictEqual([]) 34 | expect(response.body).toHaveLength(3); 35 | }) 36 | 37 | it("post a product", async () => { 38 | const response = await supertest(app).post('/products').send({ 39 | title: 'test', 40 | price: 13.5, 41 | description: 'test desc', 42 | image: 'test img', 43 | category: 'text cat' 44 | }) 45 | expect(response.status).toBe(200) 46 | console.log('post', response.body) 47 | expect(response.body).toHaveProperty('id') 48 | }) 49 | 50 | it("put a product", async () => { 51 | const response = await supertest(app).put('/products/1').send({ 52 | title: 'test', 53 | price: 13.5, 54 | description: 'test desc', 55 | image: 'test img', 56 | category: 'text cat' 57 | }) 58 | expect(response.status).toBe(200) 59 | console.log('put', response.body) 60 | expect(response.body).toHaveProperty('id') 61 | }) 62 | 63 | 64 | it("patch a product", async () => { 65 | const response = await supertest(app).patch('/products/1').send({ 66 | title: 'test', 67 | price: 13.5, 68 | description: 'test desc', 69 | image: 'test img', 70 | category: 'text cat' 71 | }) 72 | expect(response.status).toBe(200) 73 | console.log('patch', response.body) 74 | expect(response.body).toHaveProperty('id') 75 | }) 76 | 77 | 78 | it('delete a product', async () => { 79 | const response = await supertest(app).put('/products/1') 80 | expect(response.status).toBe(200) 81 | console.log('delete', response.body) 82 | expect(response.body).toHaveProperty('id') 83 | }) 84 | 85 | }) 86 | -------------------------------------------------------------------------------- /server-mock/controller/cart.js: -------------------------------------------------------------------------------- 1 | const Cart = require('../model/cart') 2 | 3 | module.exports.getAllCarts = (req,res) => { 4 | const limit = Number(req.query.limit) || 0 5 | const sort = req.query.sort=="desc"?-1:1 6 | const startDate = req.query.startdate || new Date('1970-1-1') 7 | const endDate = req.query.enddate || new Date() 8 | 9 | console.log(startDate,endDate) 10 | 11 | Cart.find({ 12 | date:{ $gte:new Date(startDate), $lt:new Date(endDate)} 13 | }) 14 | .select('-_id -products._id') 15 | .limit(limit) 16 | .sort({id:sort}) 17 | .then(carts=>{ 18 | res.json(carts) 19 | }) 20 | .catch(err=>console.log(err)) 21 | } 22 | 23 | 24 | module.exports.getCartsbyUserid = (req,res) => { 25 | const userId = req.params.userid 26 | const startDate = req.query.startdate || new Date('1970-1-1') 27 | const endDate = req.query.enddate || new Date() 28 | 29 | console.log(startDate,endDate) 30 | Cart.find({ 31 | userId, 32 | date:{ $gte:new Date(startDate), $lt:new Date(endDate)} 33 | }) 34 | .select('-_id -products._id') 35 | .then(carts=>{ 36 | res.json(carts) 37 | }) 38 | .catch(err=>console.log(err)) 39 | } 40 | 41 | module.exports.getSingleCart = (req,res) => { 42 | const id = req.params.id 43 | Cart.findOne({ 44 | id 45 | }) 46 | .select('-_id -products._id') 47 | .then(cart => res.json(cart)) 48 | .catch(err=> console.log(err)) 49 | } 50 | 51 | module.exports.addCart = (req,res) => { 52 | if (typeof req.body == undefined) { 53 | res.json({ 54 | status: "error", 55 | message: "data is undefined" 56 | }) 57 | } else { 58 | console.log(req.body.date) 59 | let cartCount = 0; 60 | Cart.find().countDocuments(function (err, count) { 61 | cartCount = count 62 | }) 63 | 64 | .then(() => { 65 | const cart = new Cart({ 66 | id: cartCount + 1, 67 | userId: req.body.userId, 68 | date:req.body.date, 69 | products:req.body.products 70 | }) 71 | // cart.save() 72 | // .then(cart => res.json(cart)) 73 | // .catch(err => console.log(err)) 74 | 75 | res.json(cart) 76 | }) 77 | 78 | //res.json({...req.body,id:Cart.find().count()+1}) 79 | } 80 | } 81 | 82 | 83 | module.exports.editCart = (req,res) => { 84 | if (typeof req.body == undefined || req.params.id == null) { 85 | res.json({ 86 | status: "error", 87 | message: "something went wrong! check your sent data" 88 | }) 89 | } else { 90 | res.json({ 91 | id:req.params.id, 92 | userId: req.body.userId, 93 | date:req.body.date, 94 | products:req.body.products 95 | }) 96 | } 97 | } 98 | 99 | module.exports.deleteCart = (req, res) => { 100 | if (req.params.id == null) { 101 | res.json({ 102 | status: "error", 103 | message: "cart id should be provided" 104 | }) 105 | } else { 106 | Cart.findOne({id:req.params.id}) 107 | .select('-_id -products._id') 108 | .then(cart=>{ 109 | res.json(cart) 110 | }) 111 | .catch(err=>console.log(err)) 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /server-mock/controller/product.js: -------------------------------------------------------------------------------- 1 | const Product = require("../model/product"); 2 | 3 | module.exports.getAllProducts = (req, res) => { 4 | const limit = Number(req.query.limit) || 0; 5 | const sort = req.query.sort == "desc" ? -1 : 1; 6 | 7 | Product.find() 8 | .select(["-_id"]) 9 | .limit(limit) 10 | .sort({ id: sort }) 11 | .then((products) => { 12 | res.json(products); 13 | }) 14 | .catch((err) => console.log(err)); 15 | }; 16 | 17 | module.exports.getProduct = (req, res) => { 18 | const id = req.params.id; 19 | 20 | Product.findOne({ 21 | id, 22 | }) 23 | .select(["-_id"]) 24 | .then((product) => { 25 | res.json(product); 26 | }) 27 | .catch((err) => console.log(err)); 28 | }; 29 | 30 | module.exports.getProductCategories = (req, res) => { 31 | Product.distinct("category") 32 | .then((categories) => { 33 | res.json(categories); 34 | }) 35 | .catch((err) => console.log(err)); 36 | }; 37 | 38 | module.exports.getProductsInCategory = (req, res) => { 39 | const category = req.params.category; 40 | const limit = Number(req.query.limit) || 0; 41 | const sort = req.query.sort == "desc" ? -1 : 1; 42 | 43 | Product.find({ 44 | category, 45 | }) 46 | .select(["-_id"]) 47 | .limit(limit) 48 | .sort({ id: sort }) 49 | .then((products) => { 50 | res.json(products); 51 | }) 52 | .catch((err) => console.log(err)); 53 | }; 54 | 55 | module.exports.addProduct = async (req, res) => { 56 | if (typeof req.body == undefined) { 57 | res.json({ 58 | status: "error", 59 | message: "data is undefined", 60 | }); 61 | } else { 62 | const productCount = await Product.find() 63 | .countDocuments(function (err, count) { 64 | return count || 0; 65 | }); 66 | 67 | 68 | console.log(productCount, req.body) 69 | 70 | const product = new Product({ 71 | id: productCount + 1, 72 | title: req.body.title, 73 | price: req.body.price, 74 | description: req.body.description, 75 | image: req.body.image, 76 | category: req.body.category, 77 | rating: req.body.rating, 78 | }); 79 | 80 | product.save() 81 | .then(product => res.json(product)) 82 | .catch(err => console.log(err)) 83 | // res.json(product); 84 | 85 | } 86 | }; 87 | 88 | module.exports.editProduct = (req, res) => { 89 | if (typeof req.body == undefined || req.params.id == null) { 90 | res.json({ 91 | status: "error", 92 | message: "something went wrong! check your sent data", 93 | }); 94 | } else { 95 | res.json({ 96 | id: req.params.id, 97 | title: req.body.title, 98 | price: req.body.price, 99 | description: req.body.description, 100 | image: req.body.image, 101 | category: req.body.category, 102 | }); 103 | } 104 | }; 105 | 106 | module.exports.deleteProduct = (req, res) => { 107 | if (req.params.id == null) { 108 | res.json({ 109 | status: "error", 110 | message: "cart id should be provided", 111 | }); 112 | } else { 113 | Product.findOne({ 114 | id: req.params.id, 115 | }) 116 | .select(["-_id"]) 117 | .then((product) => { 118 | res.json(product); 119 | }) 120 | .catch((err) => console.log(err)); 121 | } 122 | }; 123 | -------------------------------------------------------------------------------- /server-mock/controller/user.js: -------------------------------------------------------------------------------- 1 | const User = require('../model/user') 2 | 3 | module.exports.getAllUser = (req, res) => { 4 | const limit = Number(req.query.limit) || 0 5 | const sort = req.query.sort == "desc" ? -1 : 1 6 | 7 | User.find().select(['-_id']).limit(limit).sort({ 8 | id: sort 9 | }) 10 | .then(users => { 11 | res.json(users) 12 | }) 13 | .catch(err => console.log(err)) 14 | } 15 | 16 | module.exports.getUser = (req, res) => { 17 | const id = req.params.id 18 | 19 | User.findOne({ 20 | id 21 | }).select(['-_id']) 22 | .then(user => { 23 | res.json(user) 24 | }) 25 | .catch(err => console.log(err)) 26 | } 27 | 28 | 29 | 30 | module.exports.addUser = (req, res) => { 31 | if (typeof req.body == undefined) { 32 | res.json({ 33 | status: "error", 34 | message: "data is undefined" 35 | }) 36 | } else { 37 | 38 | let userCount = 0; 39 | User.find().countDocuments(function (err, count) { 40 | userCount = count 41 | }) 42 | .then(() => { 43 | const user = new User({ 44 | id: userCount + 1, 45 | email:req.body.email, 46 | username:req.body.username, 47 | password:req.body.password, 48 | name:{ 49 | firstname:req.body.firstname, 50 | lastname:req.body.lastname 51 | }, 52 | address:{ 53 | city:req.body.address.city, 54 | street:req.body.address.street, 55 | number:req.body.number, 56 | zipcode:req.body.zipcode, 57 | geolocation:{ 58 | lat:req.body.geolocation.lat, 59 | long:req.body.geolocation.long 60 | } 61 | }, 62 | phone:req.body.phone 63 | }) 64 | // user.save() 65 | // .then(user => res.json(user)) 66 | // .catch(err => console.log(err)) 67 | 68 | res.json(user) 69 | }) 70 | 71 | 72 | 73 | 74 | //res.json({id:User.find().count()+1,...req.body}) 75 | } 76 | } 77 | 78 | module.exports.editUser = (req, res) => { 79 | if (typeof req.body == undefined || req.params.id == null) { 80 | res.json({ 81 | status: "error", 82 | message: "something went wrong! check your sent data" 83 | }) 84 | } else { 85 | res.json({ 86 | id: req.params.id, 87 | email:req.body.email, 88 | username:req.body.username, 89 | password:req.body.password, 90 | name:{ 91 | firstname:req.body.firstname, 92 | lastname:req.body.lastname 93 | }, 94 | address:{ 95 | city:req.body.address.city, 96 | street:req.body.address.street, 97 | number:req.body.number, 98 | zipcode:req.body.zipcode, 99 | geolocation:{ 100 | lat:req.body.geolocation.lat, 101 | long:req.body.geolocation.long 102 | } 103 | }, 104 | phone:req.body.phone 105 | }) 106 | } 107 | } 108 | 109 | module.exports.deleteUser = (req, res) => { 110 | if (req.params.id == null) { 111 | res.json({ 112 | status: "error", 113 | message: "cart id should be provided" 114 | }) 115 | } else { 116 | User.findOne({id:req.params.id}) 117 | .select(['-_id']) 118 | .then(user => { 119 | res.json(user) 120 | }) 121 | .catch(err=>console.log(err)) 122 | } 123 | } -------------------------------------------------------------------------------- /server-mock/public/scss/_buttons.scss: -------------------------------------------------------------------------------- 1 | %btn{ 2 | padding: 9px 12px 6px; 3 | border: none; 4 | display: inline-flex; 5 | border-radius: .25rem; 6 | align-items: center; 7 | // box-shadow: 0px 0px 9px 2px rgba(78, 77, 77, 0.2); 8 | img{ 9 | margin-left: 8px; 10 | } 11 | margin-right: 10px; 12 | } 13 | @mixin btn($type,$color:$light) { 14 | @extend %btn; 15 | background-color: $type; 16 | color: $color; 17 | border:1px solid $type; 18 | &:hover, 19 | &:focus, 20 | &:active{ 21 | opacity: 0.8; 22 | } 23 | } 24 | .btn-success{ 25 | @include btn($success); 26 | } 27 | .btn-danger{ 28 | @include btn($danger); 29 | } 30 | .btn-warning{ 31 | @include btn($warning,$dark); 32 | } 33 | .btn-muted{ 34 | @include btn($muted,$dark); 35 | } 36 | .btn-primary{ 37 | @include btn($primary); 38 | } 39 | .btn-secondary{ 40 | @include btn($secondary); 41 | } 42 | .btn-black{ 43 | @include btn($black,$light); 44 | } 45 | .btn-yellow{ 46 | @include btn(var(--yellow),$light); 47 | } 48 | .btn-light{ 49 | @include btn($light,$primary); 50 | } 51 | .btn-rounded{ 52 | border-radius: 20px; 53 | -webkit-border-radius: 20px; 54 | -moz-border-radius: 20px; 55 | -ms-border-radius: 20px; 56 | -o-border-radius: 20px; 57 | } 58 | $colors: ( 59 | ('primary',$primary), 60 | ('secondary',$secondary), 61 | ('danger',$danger), 62 | ('success',$success), 63 | ('warning',$warning), 64 | ('muted',$muted), 65 | ('light',$light), 66 | ('dark',$dark), 67 | ('black',$black) 68 | ); 69 | @mixin setcolor($color) { 70 | color: #{$color}; 71 | } 72 | @each $item in $colors { 73 | .btn-bordered-#{nth($item, 1)}{ 74 | @include setcolor(nth($item, 2)); 75 | background-color: transparent; 76 | @extend %btn; 77 | } 78 | } 79 | 80 | button[disabled]{ 81 | background-color:#ccc; 82 | cursor: not-allowed; 83 | } 84 | .btn-circle{ 85 | width: 50px; 86 | height: 50px; 87 | border-radius: 50%; 88 | padding-top: 5px; 89 | background-color: #fff; 90 | border: none; 91 | // box-shadow: 30px 30px 80px rgba(#3754aa,10%), -30px -30px 80px #ffffff, inset 4px 4px 20px rgba(#ffffff,50%); 92 | } 93 | .btn-icon{ 94 | margin-bottom: -7px; 95 | } 96 | .btn-icon-invert{ 97 | margin-bottom: -7px; 98 | filter: invert(100%); 99 | } 100 | .btn-outline{ 101 | border: 1px solid $primary; 102 | border-radius: .25rem; 103 | padding: 9px 12px 6px; 104 | background-color: transparent; 105 | color: $primary; 106 | .btn-icon{ 107 | position: relative; 108 | left: -5px; 109 | } 110 | &:hover,&:focus,&:active{ 111 | background-color: $primary; 112 | color: #fff; 113 | .btn-icon{ 114 | filter:invert(100%) 115 | } 116 | } 117 | } 118 | 119 | .btn-triangle{ 120 | position: relative; 121 | float: left; 122 | margin-left: 6%; 123 | margin-top: 2%; 124 | } 125 | .btn-triangle::after{ 126 | content: ''; 127 | width: 0; 128 | height: 0; 129 | 130 | border-radius: .25rem; 131 | border-top: 20px solid transparent; 132 | border-bottom: 20px solid transparent; 133 | border-right:20px solid var(--yellow); 134 | 135 | position: absolute; 136 | left: -26px; 137 | top: -3px; 138 | } 139 | .btn-large{ 140 | padding:16px 20px 12px 141 | } -------------------------------------------------------------------------------- /server-mock/views/home/index.ejs: -------------------------------------------------------------------------------- 1 | <%- include ("../shared/header.ejs") %> 2 | 3 | 4 |
5 |
6 |

Fake Store API

7 |

Fake store rest API for your e-commerce or shopping website prototype

8 | 13 |
14 |
15 | 16 |
17 |
18 | 19 | 20 | 21 |
22 |

Get tired of Lorem ipsum data?!

23 |

Didn't you find any free e-commerce API?!

24 |

25 | fakeStoreApi is a free online REST API that you can use whenever you need Pseudo-real data for your e-commerce 26 | or shopping website without running any server-side code. It's awesome for teaching purposes, sample codes, 27 | tests, etc. 28 |

29 |
30 | 31 | 32 | 33 |
34 |

Example Code

35 |
fetch('https://fakestoreapi.com/products/1')
36 |             .then(res=>res.json())
37 |             .then(json=>console.log(json))
38 | 39 |
40 |
41 | 42 | 43 | 44 |
45 |

Resources

46 |

There are 4 main resources need in shopping prototypes

47 | 53 | View Details on Docs 54 |
55 | 56 | 57 | 58 |
59 |

Routes

60 |

All HTTP methods are supported

61 | 73 | View Details on Docs 74 |
75 | 76 | 90 | <%- include ("../shared/footer.ejs") %> -------------------------------------------------------------------------------- /server-mock/public/js/polyfill.min.js: -------------------------------------------------------------------------------- 1 | !function(){"use strict";function o(){var o=window,t=document;if(!("scrollBehavior"in t.documentElement.style&&!0!==o.__forceSmoothScrollPolyfill__)){var l,e=o.HTMLElement||o.Element,r=468,i={scroll:o.scroll||o.scrollTo,scrollBy:o.scrollBy,elementScroll:e.prototype.scroll||n,scrollIntoView:e.prototype.scrollIntoView},s=o.performance&&o.performance.now?o.performance.now.bind(o.performance):Date.now,c=(l=o.navigator.userAgent,new RegExp(["MSIE ","Trident/","Edge/"].join("|")).test(l)?1:0);o.scroll=o.scrollTo=function(){void 0!==arguments[0]&&(!0!==f(arguments[0])?h.call(o,t.body,void 0!==arguments[0].left?~~arguments[0].left:o.scrollX||o.pageXOffset,void 0!==arguments[0].top?~~arguments[0].top:o.scrollY||o.pageYOffset):i.scroll.call(o,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:o.scrollX||o.pageXOffset,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:o.scrollY||o.pageYOffset))},o.scrollBy=function(){void 0!==arguments[0]&&(f(arguments[0])?i.scrollBy.call(o,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:0,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:0):h.call(o,t.body,~~arguments[0].left+(o.scrollX||o.pageXOffset),~~arguments[0].top+(o.scrollY||o.pageYOffset)))},e.prototype.scroll=e.prototype.scrollTo=function(){if(void 0!==arguments[0])if(!0!==f(arguments[0])){var o=arguments[0].left,t=arguments[0].top;h.call(this,this,void 0===o?this.scrollLeft:~~o,void 0===t?this.scrollTop:~~t)}else{if("number"==typeof arguments[0]&&void 0===arguments[1])throw new SyntaxError("Value could not be converted");i.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left:"object"!=typeof arguments[0]?~~arguments[0]:this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top:void 0!==arguments[1]?~~arguments[1]:this.scrollTop)}},e.prototype.scrollBy=function(){void 0!==arguments[0]&&(!0!==f(arguments[0])?this.scroll({left:~~arguments[0].left+this.scrollLeft,top:~~arguments[0].top+this.scrollTop,behavior:arguments[0].behavior}):i.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left+this.scrollLeft:~~arguments[0]+this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top+this.scrollTop:~~arguments[1]+this.scrollTop))},e.prototype.scrollIntoView=function(){if(!0!==f(arguments[0])){var l=function(o){for(;o!==t.body&&!1===(e=p(l=o,"Y")&&a(l,"Y"),r=p(l,"X")&&a(l,"X"),e||r);)o=o.parentNode||o.host;var l,e,r;return o}(this),e=l.getBoundingClientRect(),r=this.getBoundingClientRect();l!==t.body?(h.call(this,l,l.scrollLeft+r.left-e.left,l.scrollTop+r.top-e.top),"fixed"!==o.getComputedStyle(l).position&&o.scrollBy({left:e.left,top:e.top,behavior:"smooth"})):o.scrollBy({left:r.left,top:r.top,behavior:"smooth"})}else i.scrollIntoView.call(this,void 0===arguments[0]||arguments[0])}}function n(o,t){this.scrollLeft=o,this.scrollTop=t}function f(o){if(null===o||"object"!=typeof o||void 0===o.behavior||"auto"===o.behavior||"instant"===o.behavior)return!0;if("object"==typeof o&&"smooth"===o.behavior)return!1;throw new TypeError("behavior member of ScrollOptions "+o.behavior+" is not a valid value for enumeration ScrollBehavior.")}function p(o,t){return"Y"===t?o.clientHeight+c1?1:n,l=.5*(1-Math.cos(Math.PI*c)),e=t.startX+(t.x-t.startX)*l,i=t.startY+(t.y-t.startY)*l,t.method.call(t.scrollable,e,i),e===t.x&&i===t.y||o.requestAnimationFrame(d.bind(o,t))}function h(l,e,r){var c,f,p,a,h=s();l===t.body?(c=o,f=o.scrollX||o.pageXOffset,p=o.scrollY||o.pageYOffset,a=i.scroll):(c=l,f=l.scrollLeft,p=l.scrollTop,a=n),d({scrollable:c,method:a,startTime:h,startX:f,startY:p,x:e,y:r})}}"object"==typeof exports&&"undefined"!=typeof module?module.exports={polyfill:o}:o()}(); -------------------------------------------------------------------------------- /server-mock/__test__/user.spec.js: -------------------------------------------------------------------------------- 1 | const supertest = require('supertest') 2 | const app = require('../app') 3 | 4 | describe('testing user API',()=>{ 5 | it('get all users',async()=>{ 6 | const response = await supertest(app).get('/users') 7 | expect(response.status).toBe(200) 8 | console.log(response.body) 9 | expect(response.body).not.toStrictEqual([]); 10 | }) 11 | 12 | 13 | it('get a single user',async ()=>{ 14 | const response = await supertest(app).get('/users/2') 15 | expect(response.status).toBe(200); 16 | console.log(response.body) 17 | expect(response.body).not.toStrictEqual({}); 18 | expect(response.body.name).toHaveProperty('firstname'); 19 | },30000) 20 | 21 | it("get users in a limit and sort", async () => { 22 | const response = await supertest(app).get("/users?limit=3&sort=desc") 23 | expect(response.status).toBe(200) 24 | console.log('get with querystring', response.body) 25 | expect(response.body).not.toStrictEqual([]) 26 | expect(response.body).toHaveLength(3); 27 | }) 28 | 29 | 30 | it('add a new user',async () => { 31 | const response = await supertest(app).post('/users').send({ 32 | email:'John@gmail.com', 33 | username:'johnd', 34 | password:'m38rmF$', 35 | name:{ 36 | firstname:'John', 37 | lastname:'Doe' 38 | }, 39 | address:{ 40 | city:'kilcoole', 41 | street:'7835 new road', 42 | number:3, 43 | zipcode:'12926-3874', 44 | geolocation:{ 45 | lat:'-37.3159', 46 | long:'81.1496' 47 | } 48 | }, 49 | phone:'1-570-236-7033' 50 | }) 51 | expect(response.status).toBe(200); 52 | console.log(response.body) 53 | expect(response.body).toHaveProperty('id'); 54 | },30000) 55 | 56 | 57 | it('put a user',async () => { 58 | const response = await supertest(app).put('/users/2').send({ 59 | email:'mrk@y.com', 60 | username:'mrk', 61 | password:'1234566', 62 | name:{ 63 | firstname:'mohamamdreze', 64 | lastname:'kei' 65 | }, 66 | avatar:'http://test.com', 67 | address:{ 68 | city:'tehran', 69 | street:'blv', 70 | alley:'aval', 71 | number:3, 72 | geolocation:{ 73 | lat:'123.345354', 74 | long:'54.23424' 75 | } 76 | }, 77 | phone:'+989123456783' 78 | }) 79 | expect(response.status).toBe(200); 80 | console.log(response.body) 81 | expect(response.body).toHaveProperty('id'); 82 | }) 83 | 84 | 85 | it('patch a user',async () => { 86 | const response = await supertest(app).patch('/users/2').send({ 87 | email:'mrk@y.com', 88 | username:'mrk', 89 | password:'1234566', 90 | name:{ 91 | firstname:'mohamamdreze', 92 | lastname:'kei' 93 | }, 94 | avatar:'http://test.com', 95 | address:{ 96 | city:'tehran', 97 | street:'blv', 98 | alley:'aval', 99 | number:3, 100 | geolocation:{ 101 | lat:'123.345354', 102 | long:'54.23424' 103 | } 104 | }, 105 | phone:'+989123456783' 106 | }) 107 | expect(response.status).toBe(200); 108 | console.log(response.body) 109 | expect(response.body).toHaveProperty('id'); 110 | }) 111 | 112 | 113 | it('delete a user',async () => { 114 | const response = await supertest(app).delete('/users/2') 115 | expect(response.status).toBe(200); 116 | console.log(response.body) 117 | expect(response.body).toHaveProperty('id'); 118 | }) 119 | 120 | }) -------------------------------------------------------------------------------- /server-mock/__test__/cart.spec.js: -------------------------------------------------------------------------------- 1 | const supertest = require('supertest') 2 | const app = require('../app') 3 | 4 | describe('testing cart API',()=>{ 5 | it('get all carts',async()=>{ 6 | const response = await supertest(app).get('/carts') 7 | expect(response.status).toBe(200) 8 | console.log(response.body) 9 | expect(response.body).not.toEqual([]); 10 | }) 11 | 12 | 13 | it('get a single cart',async ()=>{ 14 | const response = await supertest(app).get('/carts/2') 15 | expect(response.status).toBe(200); 16 | console.log(response.body) 17 | expect(response.body).not.toEqual({}); 18 | expect(response.body).toHaveProperty('userId'); 19 | expect(response.body).not.toHaveProperty('_Id'); 20 | }) 21 | 22 | it("get carts in a date range and limit and sort", async () => { 23 | const response = await supertest(app).get("/carts?limit=2&sort=desc&startdate=2019-12-10&enddate=2020-10-10") 24 | expect(response.status).toBe(200) 25 | console.log('get with querystring', response.body) 26 | expect(response.body).not.toEqual([]) 27 | }) 28 | 29 | 30 | 31 | 32 | it("get carts in for user in date range", async () => { 33 | const response = await supertest(app).get("/carts/user/1?startdate=2019-12-10&enddate=2020-10-10") 34 | expect(response.status).toBe(200) 35 | console.log('get with date range', response.body) 36 | expect(response.body).not.toEqual([]) 37 | }) 38 | 39 | it("get carts in for user without start date", async () => { 40 | const response = await supertest(app).get("/carts/user/1?enddate=2020-10-10") 41 | expect(response.status).toBe(200) 42 | console.log('get user cart without start date', response.body) 43 | expect(response.body).not.toEqual([]) 44 | }) 45 | 46 | it("get carts in for user without end date", async () => { 47 | const response = await supertest(app).get("/carts/user/1?startdate=2019-12-10") 48 | expect(response.status).toBe(200) 49 | console.log('get user cart without end date', response.body) 50 | expect(response.body).not.toEqual([]) 51 | }) 52 | 53 | it("get carts in for user", async () => { 54 | const response = await supertest(app).get("/carts/user/1") 55 | expect(response.status).toBe(200) 56 | console.log('get with userid', response.body) 57 | expect(response.body).not.toEqual([]) 58 | }) 59 | 60 | 61 | it('add a new cart',async () => { 62 | const response = await supertest(app).post('/carts').send({ 63 | userId:1, 64 | date:new Date('2020-10-10'), 65 | products:[{productId:2,quantity:4},{productId:1,quantity:10},{productId:5,quantity:2}] 66 | }) 67 | expect(response.status).toBe(200); 68 | console.log(response.body) 69 | expect(response.body).toHaveProperty('id'); 70 | }) 71 | 72 | 73 | it('edit a cart',async () => { 74 | const response = await supertest(app).put('/carts/2').send({ 75 | userId:1, 76 | date:new Date('2020-10-10'), 77 | products:[{productId:2,quantity:4},{productId:1,quantity:10},{productId:5,quantity:2}] 78 | }) 79 | expect(response.status).toBe(200); 80 | console.log(response.body) 81 | expect(response.body).toHaveProperty('id'); 82 | }) 83 | 84 | 85 | it('edit a cart',async () => { 86 | const response = await supertest(app).patch('/carts/2').send({ 87 | userId:1, 88 | date:new Date('2020-10-10'), 89 | products:[{productId:2,quantity:4},{productId:1,quantity:10},{productId:5,quantity:2}] 90 | }) 91 | expect(response.status).toBe(200); 92 | console.log(response.body) 93 | expect(response.body).toHaveProperty('id'); 94 | }) 95 | 96 | 97 | it('delete a cart',async () => { 98 | const response = await supertest(app).delete('/carts/2') 99 | expect(response.status).toBe(200); 100 | console.log(response.body) 101 | expect(response.body).toHaveProperty('id'); 102 | }) 103 | 104 | }) -------------------------------------------------------------------------------- /server-mock/public/scss/_custom.scss: -------------------------------------------------------------------------------- 1 | .intro{ 2 | margin-top: 200px; 3 | @media only screen and (max-width:768px){ 4 | margin-top: 50px; 5 | } 6 | h1{ 7 | font-size: 2.5em; 8 | } 9 | p{ 10 | margin-bottom: 20px; 11 | } 12 | div{ 13 | align-items: flex-end; 14 | } 15 | .btns{ 16 | @media only screen and (max-width:992px){ 17 | display: flex; 18 | flex-direction: column; 19 | align-items: flex-start; 20 | } 21 | a{ 22 | margin-bottom: 10px; 23 | width:200px; 24 | justify-content: space-between; 25 | @media only screen and (max-width:480px){ 26 | width: 70%; 27 | justify-content: space-between; 28 | font-size: 0.8em; 29 | img{ 30 | width: 20px; 31 | } 32 | } 33 | } 34 | } 35 | } 36 | section{ 37 | margin-bottom: 100px; 38 | } 39 | .intro-img{ 40 | display: flex; 41 | flex-direction: row; 42 | justify-content: flex-end; 43 | align-items: flex-end; 44 | img{ 45 | @media only screen and (max-width:768px) and (min-width:480px){ 46 | width: 50%; 47 | display: block; 48 | margin: 0 auto; 49 | } 50 | } 51 | 52 | } 53 | .about{ 54 | margin-top: 200px; 55 | @media only screen and (max-width:480px){ 56 | margin-top: 20px; 57 | p{ 58 | text-align: left; 59 | } 60 | 61 | } 62 | h3{ 63 | width: 100%; 64 | font-size: 1.4em; 65 | @media only screen and (max-width:480px){ 66 | font-size: 1.2em; 67 | text-align: left; 68 | } 69 | } 70 | } 71 | footer{ 72 | padding: 20px; 73 | text-align: center; 74 | padding: 50px; 75 | background-color: #f5f5f5; 76 | position: relative; 77 | z-index: 10; 78 | p{ 79 | font-weight: 300; 80 | } 81 | a{ 82 | color: #3a3134; 83 | font-weight: 300; 84 | &.donate{ 85 | color: $primary; 86 | img{ 87 | width: 25px; 88 | margin-bottom: -5px; 89 | } 90 | } 91 | } 92 | } 93 | .heart{ 94 | color: #a71e22; 95 | } 96 | .loading{ 97 | display: block; 98 | margin: 10px auto; 99 | width: 70px; 100 | height: 70px; 101 | border-radius: 50%; 102 | background-color: $primary; 103 | animation: loading 0.8s ease infinite alternate; 104 | } 105 | @keyframes loading{ 106 | to{ 107 | transform: scale(1.2); 108 | } 109 | } 110 | .list{ 111 | width: 100%; 112 | margin-top: 20px; 113 | li{ 114 | width: 50%; 115 | display: flex; 116 | justify-content: space-between; 117 | margin-bottom: 10px; 118 | text-align: left; 119 | @media only screen and (max-width:480px){ 120 | width: 100%; 121 | padding: 10px 0; 122 | } 123 | a{ 124 | font-size: 1.1em; 125 | } 126 | } 127 | } 128 | .heading{ 129 | width: 100%; 130 | color: $primary; 131 | font-size: 1.7em; 132 | svg{ 133 | position: relative; 134 | bottom: -2px; 135 | } 136 | } 137 | 138 | @media only screen and (max-width:768px){ 139 | main{ 140 | padding: 30px; 141 | } 142 | } 143 | 144 | 145 | .logo{ 146 | img{ 147 | width: 50px; 148 | } 149 | position: absolute; 150 | left: 20.5%; 151 | top: 30px; 152 | z-index: 10; 153 | 154 | @media only screen and (max-width:768px){ 155 | position: absolute; 156 | left: 15px; 157 | top: -5px; 158 | padding: 30px; 159 | img{ 160 | width: 35px; 161 | } 162 | } 163 | } 164 | aside{ 165 | position: fixed !important; 166 | left:0; 167 | top: 0; 168 | background-color: #f5f5f5cc; 169 | height: 100vh; 170 | overflow: auto; 171 | ul{ 172 | padding: 40px 30px; 173 | li{ 174 | margin-bottom: 20px; 175 | } 176 | &:last-child{ 177 | padding-bottom: 200px; 178 | } 179 | } 180 | } 181 | #cart{ 182 | margin-top: 100px; 183 | } 184 | .auto-overflow{ 185 | height: 100vh; 186 | overflow: auto; 187 | } -------------------------------------------------------------------------------- /server-mock/public/scss/_general.scss: -------------------------------------------------------------------------------- 1 | .shadow { 2 | box-shadow: 0 10px 30px rgba(50, 50, 93, 0.12), 0 -1px 4px rgba(0, 0, 0, 0.06); 3 | -webkit-box-shadow: 0 10px 30px rgba(50, 50, 93, 0.12), 0 -1px 4px rgba(0, 0, 0, 0.06); 4 | } 5 | 6 | %shadow { 7 | box-shadow: 0 10px 30px rgba(50, 50, 93, 0.12), 0 -1px 4px rgba(0, 0, 0, 0.06); 8 | -webkit-box-shadow: 0 10px 30px rgba(50, 50, 93, 0.12), 0 -1px 4px rgba(0, 0, 0, 0.06); 9 | } 10 | 11 | .center-align { 12 | text-align: center; 13 | } 14 | 15 | .left-align { 16 | text-align: left; 17 | } 18 | 19 | .right-align { 20 | text-align: right; 21 | } 22 | 23 | .justify-align { 24 | text-align: justify; 25 | } 26 | 27 | .block { 28 | display: block; 29 | width: 100%; 30 | } 31 | 32 | .inline-block { 33 | display: inline-block; 34 | } 35 | 36 | .center-block { 37 | display: block; 38 | margin-right: auto; 39 | margin-left: auto; 40 | } 41 | 42 | .margin-auto { 43 | margin: 0 auto; 44 | } 45 | 46 | .box-center { 47 | position: absolute; 48 | left: 50%; 49 | top: 50%; 50 | transform: translate(-50%, -50%); 51 | -webkit-transform: translate(-50%, -50%); 52 | -moz-transform: translate(-50%, -50%); 53 | -ms-transform: translate(-50%, -50%); 54 | -o-transform: translate(-50%, -50%); 55 | } 56 | 57 | .pull-left { 58 | float: left !important; 59 | } 60 | 61 | .pull-right { 62 | float: right !important; 63 | } 64 | 65 | hr { 66 | border: unset; 67 | border-bottom: 1px solid rgba(187, 187, 187, 0.2); 68 | width: 100%; 69 | margin: 30px auto; 70 | } 71 | 72 | .label { 73 | display: inline-block; 74 | background: $light; 75 | padding: 5px 10px; 76 | border-radius: 20px; 77 | -webkit-border-radius: 20px; 78 | -moz-border-radius: 20px; 79 | -ms-border-radius: 20px; 80 | -o-border-radius: 20px; 81 | } 82 | 83 | .label-sm { 84 | font-size: 0.8em; 85 | } 86 | 87 | @mixin margins($orientation, $pixel) { 88 | margin-#{$orientation}: $pixel !important; 89 | } 90 | 91 | .margin-top-xlg { 92 | @include margins(top, 200px); 93 | } 94 | 95 | .margin-top-lg { 96 | @include margins(top, 100px); 97 | } 98 | 99 | .margin-top-md { 100 | @include margins(top, 50px); 101 | } 102 | 103 | .margin-top-sm { 104 | @include margins(top, 30px); 105 | } 106 | 107 | .margin-bottom-lg { 108 | @include margins(bottom, 100px); 109 | } 110 | 111 | .margin-bottom-md { 112 | @include margins(bottom, 50px); 113 | } 114 | 115 | .margin-bottom-sm { 116 | @include margins(bottom, 30px); 117 | } 118 | 119 | .padding-lg { 120 | padding: 100px; 121 | } 122 | 123 | .padding-md { 124 | padding: 20px; 125 | } 126 | 127 | .padding-sm { 128 | padding: 10px; 129 | } 130 | 131 | /*.block{ 132 | display: block; 133 | width: 100%; 134 | }*/ 135 | p { 136 | margin: 10px 0; 137 | } 138 | 139 | main { 140 | min-height: 80vh; 141 | padding-top: 30px; 142 | } 143 | 144 | .hidden { 145 | display: none; 146 | } 147 | 148 | @media #{$tablet} { 149 | .hidden-xs { 150 | display: none; 151 | } 152 | 153 | .visible-xs { 154 | display: block; 155 | } 156 | } 157 | 158 | @media only screen and (min-width:480px) and (max-width:769px) { 159 | .hidden-sm { 160 | display: none; 161 | } 162 | 163 | .visible-sm { 164 | display: block; 165 | } 166 | } 167 | 168 | @media only screen and (min-width:769px) and (max-width:992px) { 169 | .hidden-md { 170 | display: none; 171 | } 172 | 173 | .visible-md { 174 | display: block; 175 | } 176 | } 177 | 178 | @media only screen and (min-width:992px) { 179 | .hidden-lg { 180 | display: none; 181 | } 182 | 183 | .visible-lg { 184 | display: block; 185 | } 186 | } 187 | 188 | .ck-editor__editable_inline { 189 | min-height: 400px; 190 | } 191 | 192 | // a { 193 | // color: #222; 194 | // } 195 | 196 | [alt] { 197 | color: #fff; 198 | } 199 | 200 | .justify-center { 201 | display: flex; 202 | justify-content: center; 203 | } 204 | 205 | .justify-end { 206 | display: flex; 207 | justify-content: flex-end; 208 | } 209 | 210 | .social { 211 | display: flex; 212 | justify-content: center; 213 | } 214 | 215 | .stretched { 216 | align-items: stretch; 217 | } 218 | 219 | 220 | #__next-prerender-indicator { 221 | display: none; 222 | } 223 | 224 | #__next-build-watcher { 225 | display: none; 226 | } 227 | 228 | @media only screen and (max-width:769px) { 229 | .reverse-xs { 230 | flex-direction: column-reverse; 231 | } 232 | 233 | .margin-top-md-mob { 234 | margin-top: 50px !important; 235 | } 236 | 237 | .center-justify-xs { 238 | justify-content: center; 239 | } 240 | } 241 | 242 | .exact-center{ 243 | width: 100%; 244 | height: 100vh; 245 | display: flex; 246 | justify-content: center; 247 | align-items: center; 248 | } 249 | .fixed{ 250 | height:100vh; 251 | overflow:hidden; 252 | } 253 | .body-fix{ 254 | height: 100vh; 255 | overflow: hidden; 256 | } -------------------------------------------------------------------------------- /nextjs-blog/pages/index.js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head' 2 | 3 | export async function getStaticProps({params}) { 4 | // Let's fetch the latest top ranking items in a category 5 | const res = await fetch('http://localhost:6400/products/categories') 6 | const categories = await res.json() 7 | 8 | return { 9 | props: { categories }, 10 | // Next.js will attempt to re-generate the page: 11 | // - When a request comes in 12 | // - At most once every 10 seconds 13 | revalidate: 10, // In seconds 14 | }; 15 | } 16 | 17 | export default function Home(props) { 18 | const categories = props.categories; 19 | let i = 0; 20 | return ( 21 |
22 | 23 | Create Next App 24 | 25 | 26 | 27 |
28 |

29 | Welcome to Next.js! 30 |

31 | 32 |

33 | Our best category pages: 34 |

35 | 36 |
37 | {categories.map(category => { 38 | return ( 39 |

{category}

40 |
) 41 | })} 42 |
43 |
44 | 45 | 55 | 56 | 186 | 187 | 201 |
202 | ) 203 | } 204 | -------------------------------------------------------------------------------- /nextjs-blog/pages/best/[category].js: -------------------------------------------------------------------------------- 1 | import Head from 'next/head'; 2 | import { useRouter } from 'next/router'; 3 | import { NextSeo } from 'next-seo'; 4 | 5 | export async function getStaticPaths() { 6 | 7 | // We need to fetch all of the categories from our DB 8 | const res = await fetch('http://localhost:6400/products/categories') 9 | const categories = await res.json() 10 | 11 | // We need to adhere to the Next.js getStaticPaths structure 12 | // https://nextjs.org/docs/basic-features/data-fetching/get-static-paths 13 | let paths = categories.map((x)=>{return{'params': {'category': x}}}) 14 | 15 | // For blocking see: https://nextjs.org/docs/api-reference/data-fetching/get-static-paths#fallback-blocking 16 | return { 17 | paths, 18 | fallback: 'blocking' 19 | }; 20 | } 21 | 22 | export async function getStaticProps({params}) { 23 | 24 | // Let's fetch the latest top ranking items in a category from our DB 25 | const res = await fetch(`http://localhost:6400/products/category/${params.category}`) 26 | const products = await res.json() 27 | 28 | // Let's pick the 5 best ranked ones 29 | const topProducts = products.sort((a,b) => b.rating - a.rating).slice(0, 5); 30 | 31 | // Every time we statically generate this page we will have the time-stamped. 32 | const stats = new Date().toISOString() 33 | 34 | return { 35 | props: { stats: stats, topProducts }, 36 | // Next.js will attempt to re-generate the page: 37 | // - When a request comes in 38 | // - At most once every 10 seconds 39 | revalidate: 10, // In seconds 40 | }; 41 | } 42 | 43 | export default function Best(props) { 44 | const router = useRouter() 45 | const { category } = router.query 46 | const stats = props.stats; 47 | const products = props.topProducts; 48 | let i = 0; 49 | 50 | return ( 51 |
52 | 53 | 10 Best {category} Products 54 | 55 | 56 | 57 | 61 | 62 |
63 |

64 | 10 Best {category} Products 65 |

66 | 67 |

68 | These are our best products for the {category},
Updated at: {stats} 69 |

70 | 71 | 80 |
81 | 82 | 92 | 93 | 223 | 224 | 238 |
239 | ) 240 | } 241 | -------------------------------------------------------------------------------- /server-mock/views/shared/cartDocs.ejs: -------------------------------------------------------------------------------- 1 |

2 | 4 | 5 | 6 | 7 | 8 | Cart

9 |

Get all carts

10 |
fetch('https://fakestoreapi.com/carts')
 11 |             .then(res=>res.json())
 12 |             .then(json=>console.log(json))
13 | 14 |

 15 |             //output
 16 |             [
 17 |                 {
 18 |                     id:1,
 19 |                     userId:1,
 20 |                     date:2020-10-10,
 21 |                     products:[{productId:2,quantity:4},{productId:1,quantity:10},{productId:5,quantity:2}]
 22 |                 },
 23 |                 /*...*/
 24 |                 {
 25 |                     id:20,
 26 |                     userId:10,
 27 |                     date:2019-10-10,
 28 |                     products:[{productId:1,quantity:5},{productId:5,quantity:1}]
 29 |                 }
 30 |             ]
 31 |         
32 | 33 | 34 |

Get a single cart

35 |
fetch('https://fakestoreapi.com/carts/5')
 36 |             .then(res=>res.json())
 37 |             .then(json=>console.log(json))
38 | 39 |

 40 |             //output
 41 |             {
 42 |                 id:5,
 43 |                 userId:1,
 44 |                 date:...,
 45 |                 products:[...]
 46 |             }
 47 |         
48 | 49 | 50 | 51 |

Limit results

52 |
fetch('https://fakestoreapi.com/carts?limit=5')
 53 |             .then(res=>res.json())
 54 |             .then(json=>console.log(json))
55 | 56 |

 57 |             //output
 58 |         [
 59 |             {
 60 |                 id:1,
 61 |                 userId:1,
 62 |                 date:...,
 63 |                 products:[...]
 64 |             },
 65 |             /*...*/
 66 |             {
 67 |                 id:5,
 68 |                 userId:1,
 69 |                 date:...,
 70 |                 products:[...]
 71 |             }
 72 |         ]
 73 |         
74 | 75 | 76 | 77 |

Sort results

78 |
fetch('https://fakestoreapi.com/carts?sort=desc')
 79 |             .then(res=>res.json())
 80 |             .then(json=>console.log(json))
81 |

82 | 83 | 86 | 87 | 88 | The default value is in ascending mode, you can use it with 'desc' or 'asc' as you want. 89 |

90 | 91 |

 92 |             //output
 93 |         [
 94 |             {
 95 |                 id:20,
 96 |                 userId:1,
 97 |                 date:...,
 98 |                 products:[...]
 99 |             },
100 |             /*...*/
101 |             {
102 |                 id:1,
103 |                 userId:1,
104 |                 date:...,
105 |                 products:[...]
106 |             }
107 |         ]
108 |         
109 | 110 | 111 | 112 | 113 |

Get carts in a date range

114 |
fetch('https://fakestoreapi.com/carts/startdate=2019-12-10&enddate=2020-10-10')
115 |             .then(res=>res.json())
116 |             .then(json=>console.log(json))
117 |

118 | 119 | 122 | 123 | 124 | If you don't add any start date it will fetch from the beginning of time and if you don't add any end date it 125 | will fetch until now. 126 | You can also use limit(Number) and sort(asc|desc) as a query string to get your ideal results 127 |

128 | 129 |

130 |             //output
131 |     [
132 |         {
133 |             id:1,
134 |             userId:1,
135 |             date:2019-12-10,
136 |             products:[...]
137 |         },
138 |         /*...*/
139 |         {
140 |             id:4,
141 |             userId:1,
142 |             date:2020-10-10,
143 |             products:[...]
144 |         }
145 |     ]
146 |         
147 | 148 | 149 | 150 | 151 | 152 | 153 |

Get user carts

154 |
fetch('https://fakestoreapi.com/carts/user/2')
155 |             .then(res=>res.json())
156 |             .then(json=>console.log(json))
157 |

158 | 159 | 162 | 163 | 164 | You can also use date range as query string to get your ideal results 165 |

166 | 167 |

168 |             //output
169 |             [
170 |             {
171 |                 id:5,
172 |                 userId:2,
173 |                 date:2019-10-03,
174 |                 products:[...]
175 |             },
176 |             /*...*/
177 |             {
178 |                 id:6,
179 |                 userId:2,
180 |                 date:2020-10-10,
181 |                 products:[...]
182 |             }
183 |         ]
184 |         
185 | 186 | 187 | 188 | 189 |

Add a new product

190 |
fetch('https://fakestoreapi.com/carts',{
191 |             method:"POST",
192 |             body:JSON.stringify(
193 |                 {
194 |                     userId:5,
195 |                     date:2020-02-03,
196 |                     products:[{productId:5,quantity:1},{productId:1,quantity:5}]
197 |                 }
198 |             )
199 |         })
200 |             .then(res=>res.json())
201 |             .then(json=>console.log(json))
202 |

203 | 204 | 207 | 208 | 209 | If you send an object like the code above, it will return you an object with a new id. 210 | remember that nothing in real will insert into the database. so if you want to access the new id you will get a 404 211 | error. 212 |

213 | 214 |

215 |             //output
216 |             {
217 |                 id:21
218 |                 userId:5,
219 |                 date:2020-02-03,
220 |                 products:[{productId:5,quantity:1},{productId:1,quantity:5}]
221 |             }
222 |         
223 | 224 | 225 | 226 |

Update a product

227 |
fetch('https://fakestoreapi.com/carts/7',{
228 |             method:"PUT",
229 |             body:JSON.stringify(
230 |                 {
231 |                     userId:3,
232 |                     date:2019-12-10,
233 |                     products:[{productId:1,quantity:3}]
234 |                 }
235 |             )
236 |         })
237 |             .then(res=>res.json())
238 |             .then(json=>console.log(json))
239 |
fetch('https://fakestoreapi.com/carts/7',{
240 |                 method:"PATCH",
241 |                 body:JSON.stringify(
242 |                     {
243 |                         userId:3,
244 |                         date:2019-12-10,
245 |                         products:[{productId:1,quantity:3}]
246 |                     }
247 |                 )
248 |             })
249 |                 .then(res=>res.json())
250 |                 .then(json=>console.log(json))
251 |

252 | 253 | 256 | 257 | 258 | It will return you an object with sent id. 259 | remember that nothing in real will update in the database. 260 |

261 | 262 |

263 |             //output
264 |             {
265 |                 id:7,
266 |                 userId:3,
267 |                 date:2019-12-10,
268 |                 products:[{productId:1,quantity:3}]
269 |             }
270 |         
271 | 272 | 273 | 274 |

Delete a cart

275 |
fetch('https://fakestoreapi.com/carts/6',{
276 |             method:"DELETE"
277 |         })
278 |             .then(res=>res.json())
279 |             .then(json=>console.log(json))
280 |

281 | 282 | 285 | 286 | 287 | The cart will not be deleted on the database. but if you sent data successfully it will return you the fake 288 | deleted cart. 289 |

290 | 291 |

292 |             //output
293 |             {
294 |                 id:6,
295 |                 userId:...,
296 |                 date:...,
297 |                 products:[...]
298 |             }
299 |         
-------------------------------------------------------------------------------- /server-mock/views/shared/productDocs.ejs: -------------------------------------------------------------------------------- 1 |

2 | 5 | 7 | 8 | 9 | 10 | 11 | Products

12 |

Get all products

13 |
fetch('https://fakestoreapi.com/products')
 14 |             .then(res=>res.json())
 15 |             .then(json=>console.log(json))
16 | 17 |

 18 |             //output
 19 |             [
 20 |                 {
 21 |                     id:1,
 22 |                     title:'...',
 23 |                     price:'...',
 24 |                     category:'...',
 25 |                     description:'...',
 26 |                     image:'...'
 27 |                 },
 28 |                 /*...*/
 29 |                 {
 30 |                     id:30,
 31 |                     title:'...',
 32 |                     price:'...',
 33 |                     category:'...',
 34 |                     description:'...',
 35 |                     image:'...'
 36 |                 }
 37 |             ]
 38 |         
39 | 40 | 41 |

Get a single product

42 |
fetch('https://fakestoreapi.com/products/1')
 43 |             .then(res=>res.json())
 44 |             .then(json=>console.log(json))
45 | 46 |

 47 |             //output
 48 |             {
 49 |                 id:1,
 50 |                 title:'...',
 51 |                 price:'...',
 52 |                 category:'...',
 53 |                 description:'...',
 54 |                 image:'...'
 55 |             }
 56 |         
57 | 58 | 59 | 60 |

Limit results

61 |
fetch('https://fakestoreapi.com/products?limit=5')
 62 |             .then(res=>res.json())
 63 |             .then(json=>console.log(json))
64 | 65 |

 66 |             //output
 67 |         [
 68 |             {
 69 |                 id:1,
 70 |                 title:'...',
 71 |                 price:'...',
 72 |                 category:'...',
 73 |                 description:'...',
 74 |                 image:'...'
 75 |             }
 76 |             /*...*/
 77 |             {
 78 |                 id:5,
 79 |                 title:'...',
 80 |                 price:'...',
 81 |                 category:'...',
 82 |                 description:'...',
 83 |                 image:'...'
 84 |             }
 85 |         ]
 86 |         
87 | 88 | 89 | 90 |

Sort results

91 |
fetch('https://fakestoreapi.com/products?sort=desc')
 92 |             .then(res=>res.json())
 93 |             .then(json=>console.log(json))
94 |

95 | 96 | 99 | 100 | 101 | Default value is in ascending mode, you can use with 'desc' or 'asc' as you want. 102 |

103 | 104 |

105 |             //output
106 |         [
107 |             {
108 |                 id:30,
109 |                 title:'...',
110 |                 price:'...',
111 |                 category:'...',
112 |                 description:'...',
113 |                 image:'...'
114 |             }
115 |             /*...*/
116 |             {
117 |                 id:1,
118 |                 title:'...',
119 |                 price:'...',
120 |                 category:'...',
121 |                 description:'...',
122 |                 image:'...'
123 |             }
124 |         ]
125 |         
126 | 127 | 128 | 129 |

Get all categories

130 |
fetch('https://fakestoreapi.com/products/categories')
131 |             .then(res=>res.json())
132 |             .then(json=>console.log(json))
133 | 134 |

135 |             //output
136 |             [
137 |             "electronics",
138 |             "jewelery",
139 |             "men's clothing",
140 |             "women's clothing"
141 |             ]
142 |         
143 | 144 | 145 | 146 |

Get products in a specific category

147 |
fetch('https://fakestoreapi.com/products/category/jewelery')
148 |             .then(res=>res.json())
149 |             .then(json=>console.log(json))
150 |

151 | 152 | 155 | 156 | 157 | You can also use limit(Number) and sort(asc|desc) as a query string to get your ideal results 158 |

159 | 160 |

161 |             //output
162 |         [
163 |             {
164 |                 id:5,
165 |                 title:'...',
166 |                 price:'...',
167 |                 category:'jewelery',
168 |                 description:'...',
169 |                 image:'...'
170 |             }
171 |             /*...*/
172 |             {
173 |                 id:8,
174 |                 title:'...',
175 |                 price:'...',
176 |                 category:'jewelery',
177 |                 description:'...',
178 |                 image:'...'
179 |             }
180 |         ]
181 |         
182 | 183 | 184 | 185 |

Add new product

186 |
fetch('https://fakestoreapi.com/products',{
187 |             method:"POST",
188 |             body:JSON.stringify(
189 |                 {
190 |                     title: 'test product',
191 |                     price: 13.5,
192 |                     description: 'lorem ipsum set',
193 |                     image: 'https://i.pravatar.cc',
194 |                     category: 'electronic'
195 |                 }
196 |             )
197 |         })
198 |             .then(res=>res.json())
199 |             .then(json=>console.log(json))
200 |

201 | 202 | 205 | 206 | 207 | 208 | If you send an object like the code above, it will return you an object with a new id. remember that nothing 209 | in real will insert into the database. so if you want to access the new id you will get a 404 error. 210 |

211 | 212 |

213 |             //output
214 |             {
215 |                 id:31,
216 |                 title:'...',
217 |                 price:'...',
218 |                 category:'...',
219 |                 description:'...',
220 |                 image:'...'
221 |             }
222 |         
223 | 224 | 225 | 226 |

Update a product

227 |
fetch('https://fakestoreapi.com/products/7',{
228 |             method:"PUT",
229 |             body:JSON.stringify(
230 |                 {
231 |                     title: 'test product',
232 |                     price: 13.5,
233 |                     description: 'lorem ipsum set',
234 |                     image: 'https://i.pravatar.cc',
235 |                     category: 'electronic'
236 |                 }
237 |             )
238 |         })
239 |             .then(res=>res.json())
240 |             .then(json=>console.log(json))
241 |
fetch('https://fakestoreapi.com/products/7',{
242 |                 method:"PATCH",
243 |                 body:JSON.stringify(
244 |                     {
245 |                         title: 'test product',
246 |                         price: 13.5,
247 |                         description: 'lorem ipsum set',
248 |                         image: 'https://i.pravatar.cc',
249 |                         category: 'electronic'
250 |                     }
251 |                 )
252 |             })
253 |                 .then(res=>res.json())
254 |                 .then(json=>console.log(json))
255 |

256 | 257 | 260 | 261 | 262 | It will return you an object with sent id. 263 | remember that nothing in real will update in the database. 264 |

265 | 266 |

267 |             //output
268 |             {
269 |                 id:7,
270 |                 title:'new title',
271 |                 price:'new price',
272 |                 category:'new category',
273 |                 description:'new description',
274 |                 image:'new image url'
275 |             }
276 |         
277 | 278 | 279 | 280 |

Delete a product

281 |
fetch('https://fakestoreapi.com/products/6',{
282 |             method:"DELETE"
283 |         })
284 |             .then(res=>res.json())
285 |             .then(json=>console.log(json))
286 |

287 | 288 | 291 | 292 | 293 | The product will not be deleted on the database. but if you sent data successfully it will return you 294 | the fake deleted product. 295 |

296 | 297 |

298 |             //output
299 |             {
300 |                 id:6,
301 |                 title:'...',
302 |                 price:'...',
303 |                 category:'...',
304 |                 description:'...',
305 |                 image:'...'
306 |             }
307 |         
308 | -------------------------------------------------------------------------------- /server-mock/views/shared/userDocs.ejs: -------------------------------------------------------------------------------- 1 |

2 | 5 | 6 | 7 | 8 | Users

9 |

Get all users

10 |
fetch('https://fakestoreapi.com/users')
 11 |             .then(res=>res.json())
 12 |             .then(json=>console.log(json))
13 | 14 |

 15 |             //output
 16 |     [
 17 |         {
 18 |             id:1,
 19 |             email:'John@gmail.com',
 20 |             username:'johnd',
 21 |             password:'m38rmF$',
 22 |             name:{
 23 |                 firstname:'John',
 24 |                 lastname:'Doe'
 25 |             },
 26 |             address:{
 27 |                 city:'kilcoole',
 28 |                 street:'7835 new road',
 29 |                 number:3,
 30 |                 zipcode:'12926-3874',
 31 |                 geolocation:{
 32 |                     lat:'-37.3159',
 33 |                     long:'81.1496'
 34 |                 }
 35 |             },
 36 |             phone:'1-570-236-7033'
 37 |         },
 38 |         /*...*/
 39 |         {
 40 |             id:20,
 41 |             email:'...',
 42 |             username:'...',
 43 |             password:'...',
 44 |             name:{
 45 |                 firstname:'...',
 46 |                 lastname:'...'
 47 |             },
 48 |             address:{
 49 |                 city:'...',
 50 |                 street:'...',
 51 |                 number:...,
 52 |                 zipcode:'...',
 53 |                 geolocation:{
 54 |                     lat:'...',
 55 |                     long:'...'
 56 |                 }
 57 |             },
 58 |             phone:'...'
 59 |         }
 60 |     ]
 61 |         
62 | 63 | 64 |

Get a single user

65 |
fetch('https://fakestoreapi.com/users/1')
 66 |             .then(res=>res.json())
 67 |             .then(json=>console.log(json))
68 | 69 |

 70 |             //output
 71 |             {
 72 |                 id:1,
 73 |                 email:'John@gmail.com',
 74 |                 username:'johnd',
 75 |                 password:'m38rmF$',
 76 |                 name:{
 77 |                     firstname:'John',
 78 |                     lastname:'Doe'
 79 |                 },
 80 |                 address:{
 81 |                     city:'kilcoole',
 82 |                     street:'7835 new road',
 83 |                     number:3,
 84 |                     zipcode:'12926-3874',
 85 |                     geolocation:{
 86 |                         lat:'-37.3159',
 87 |                         long:'81.1496'
 88 |                     }
 89 |                 },
 90 |                 phone:'1-570-236-7033'
 91 |             }
 92 |         
93 | 94 | 95 | 96 |

Limit results

97 |
fetch('https://fakestoreapi.com/users?limit=5')
 98 |             .then(res=>res.json())
 99 |             .then(json=>console.log(json))
100 | 101 |

102 |             //output
103 |             [
104 |             {
105 |                 id:1,
106 |                 email:'John@gmail.com',
107 |                 username:'johnd',
108 |                 password:'m38rmF$',
109 |                 name:{
110 |                     firstname:'John',
111 |                     lastname:'Doe'
112 |                 },
113 |                 address:{
114 |                     city:'kilcoole',
115 |                     street:'7835 new road',
116 |                     number:3,
117 |                     zipcode:'12926-3874',
118 |                     geolocation:{
119 |                         lat:'-37.3159',
120 |                         long:'81.1496'
121 |                     }
122 |                 },
123 |                 phone:'1-570-236-7033'
124 |             },
125 |             /*...*/
126 |             {
127 |                 id:5,
128 |                 email:'...',
129 |                 username:'...',
130 |                 password:'...',
131 |                 name:{
132 |                     firstname:'...',
133 |                     lastname:'...'
134 |                 },
135 |                 address:{
136 |                     city:'...',
137 |                     street:'...',
138 |                     number:...,
139 |                     zipcode:'...',
140 |                     geolocation:{
141 |                         lat:'...',
142 |                         long:'...'
143 |                     }
144 |                 },
145 |                 phone:'...'
146 |             }
147 |         ]
148 |         
149 | 150 | 151 | 152 |

Sort results

153 |
fetch('https://fakestoreapi.com/users?sort=desc')
154 |             .then(res=>res.json())
155 |             .then(json=>console.log(json))
156 |

157 | 158 | 161 | 162 | 163 | The default value is in ascending mode, you can use it with 'desc' or 'asc' as you want. 164 |

165 | 166 |

167 |             //output
168 |         [
169 |             {
170 |                 id:20,
171 |                 email:'...',
172 |                 username:'...',
173 |                 password:'...',
174 |                 name:{
175 |                     firstname:'...',
176 |                     lastname:'...'
177 |                 },
178 |                 address:{
179 |                     city:'...',
180 |                     street:'...',
181 |                     number:...,
182 |                     zipcode:'...',
183 |                     geolocation:{
184 |                         lat:'...',
185 |                         long:'...'
186 |                     }
187 |                 },
188 |                 phone:'...'
189 |             },
190 |             /*...*/
191 |             {
192 |                 id:1,
193 |                 email:'...',
194 |                 username:'...',
195 |                 password:'...',
196 |                 name:{
197 |                     firstname:'...',
198 |                     lastname:'...'
199 |                 },
200 |                 address:{
201 |                     city:'...',
202 |                     street:'...',
203 |                     number:...,
204 |                     zipcode:'...',
205 |                     geolocation:{
206 |                         lat:'...',
207 |                         long:'...'
208 |                     }
209 |                 },
210 |                 phone:'...'
211 |             }
212 |         ]
213 |         
214 | 215 | 216 | 217 | 218 |

Add a new user

219 |
fetch('https://fakestoreapi.com/users',{
220 |             method:"POST",
221 |             body:JSON.stringify(
222 |                 {
223 |                     email:'John@gmail.com',
224 |                     username:'johnd',
225 |                     password:'m38rmF$',
226 |                     name:{
227 |                         firstname:'John',
228 |                         lastname:'Doe'
229 |                     },
230 |                     address:{
231 |                         city:'kilcoole',
232 |                         street:'7835 new road',
233 |                         number:3,
234 |                         zipcode:'12926-3874',
235 |                         geolocation:{
236 |                             lat:'-37.3159',
237 |                             long:'81.1496'
238 |                         }
239 |                     },
240 |                     phone:'1-570-236-7033'
241 |                 }
242 |             )
243 |         })
244 |             .then(res=>res.json())
245 |             .then(json=>console.log(json))
246 |

247 | 248 | 251 | 252 | 253 | If you send an object like the code above, it will return you an object with a new id. 254 | remember that nothing in real will insert into the database. so if you want to access the new id you will 255 | get a 404 error. 256 |

257 | 258 |

259 |             //output
260 |             {
261 |                 id:21,
262 |                 email:'John@gmail.com',
263 |                 username:'johnd',
264 |                 password:'m38rmF$',
265 |                 name:{
266 |                     firstname:'John',
267 |                     lastname:'Doe'
268 |                 },
269 |                 address:{
270 |                     city:'kilcoole',
271 |                     street:'7835 new road',
272 |                     number:3,
273 |                     zipcode:'12926-3874',
274 |                     geolocation:{
275 |                         lat:'-37.3159',
276 |                         long:'81.1496'
277 |                     }
278 |                 },
279 |                 phone:'1-570-236-7033'
280 |             }
281 |         
282 | 283 | 284 | 285 |

Update a users

286 |
fetch('https://fakestoreapi.com/users/7',{
287 |             method:"PUT",
288 |             body:JSON.stringify(
289 |                 {
290 |                 email:'John@gmail.com',
291 |                 username:'johnd',
292 |                 password:'m38rmF$',
293 |                 name:{
294 |                     firstname:'John',
295 |                     lastname:'Doe'
296 |                 },
297 |                 address:{
298 |                     city:'kilcoole',
299 |                     street:'7835 new road',
300 |                     number:3,
301 |                     zipcode:'12926-3874',
302 |                     geolocation:{
303 |                         lat:'-37.3159',
304 |                         long:'81.1496'
305 |                     }
306 |                 },
307 |                 phone:'1-570-236-7033'
308 |                 }
309 |             )
310 |         })
311 |             .then(res=>res.json())
312 |             .then(json=>console.log(json))
313 |
fetch('https://fakestoreapi.com/users/7',{
314 |                 method:"PATCH",
315 |                 body:JSON.stringify(
316 |                     {
317 |                         email:'John@gmail.com',
318 |                         username:'johnd',
319 |                         password:'m38rmF$',
320 |                         name:{
321 |                             firstname:'John',
322 |                             lastname:'Doe'
323 |                         },
324 |                         address:{
325 |                             city:'kilcoole',
326 |                             street:'7835 new road',
327 |                             number:3,
328 |                             zipcode:'12926-3874',
329 |                             geolocation:{
330 |                                 lat:'-37.3159',
331 |                                 long:'81.1496'
332 |                             }
333 |                         },
334 |                         phone:'1-570-236-7033'
335 |                     }
336 |                 )
337 |             })
338 |                 .then(res=>res.json())
339 |                 .then(json=>console.log(json))
340 |

341 | 342 | 345 | 346 | 347 | It will return you an object with sent id. remember that nothing in real will update in the database. 348 |

349 | 350 |

351 |             //output
352 |             {
353 |                 id:7,
354 |                 email:'John@gmail.com',
355 |                 username:'johnd',
356 |                 password:'m38rmF$',
357 |                 name:{
358 |                     firstname:'John',
359 |                     lastname:'Doe'
360 |                 },
361 |                 address:{
362 |                     city:'kilcoole',
363 |                     street:'7835 new road',
364 |                     number:3,
365 |                     zipcode:'12926-3874',
366 |                     geolocation:{
367 |                         lat:'-37.3159',
368 |                         long:'81.1496'
369 |                     }
370 |                 },
371 |                 phone:'1-570-236-7033'
372 |             }
373 |         
374 | 375 | 376 | 377 |

Delete a user

378 |
fetch('https://fakestoreapi.com/users/6',{
379 |             method:"DELETE"
380 |         })
381 |             .then(res=>res.json())
382 |             .then(json=>console.log(json))
383 |

384 | 385 | 388 | 389 | 390 | The user will not be deleted on the database. but if you sent data successfully it will return you 391 | the fake deleted user. 392 |

393 | 394 |

395 |             //output
396 |             {
397 |                 id:6,
398 |                 email:'John@gmail.com',
399 |                 username:'johnd',
400 |                 password:'m38rmF$',
401 |                 name:{
402 |                     firstname:'John',
403 |                     lastname:'Doe'
404 |                 },
405 |                 address:{
406 |                     city:'kilcoole',
407 |                     street:'7835 new road',
408 |                     number:3,
409 |                     zipcode:'12926-3874',
410 |                     geolocation:{
411 |                         lat:'-37.3159',
412 |                         long:'81.1496'
413 |                     }
414 |                 },
415 |                 phone:'1-570-236-7033'
416 |             }
417 |         
-------------------------------------------------------------------------------- /server-mock/public/dist/master.min.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:'dana VF';src:url("../fonts/dana2webGX.woff") format("woff-variations"),url("../fonts/dana2webGX.woff") format("woff");font-display:fallback}@font-face{font-family:dana;src:url("../fonts/dana-regular.woff") format("woff")}@font-face{font-family:dana;src:url("../fonts/dana-bold.woff") format("woff");font-weight:700}body{font-size:16px}*{font-family:dana}@supports (font-variation-settings: normal){*{font-family:'dana VF';font-variation-settings:"FANU" 0}}h1,h2,h3{letter-spacing:-1px}h1{font-variation-settings:"wght" 600}h2{font-variation-settings:"wght" 500}h3{font-variation-settings:"wght" 400}h4,h5,h6{line-height:2;margin:15px 0;font-variation-settings:"wght" 300}p{line-height:1.5;font-size:1.1em;font-variation-settings:"wght" 200}a{color:#09f}h1,h2,h3,h4,h5,h6,p,label{color:#3a3134}:root{--green:#66c3d0;--blue:#008dd2;--shadow:0 0 20px 10px rgba(134, 134, 134, 0.05)}*{margin:0;padding:0;outline:none;transition:all 0.5s ease}*,*::before,*::after{box-sizing:border-box}html{-webkit-tap-highlight-color:transparent;scroll-behavior:smooth}body,html{width:100% !important;overflow-x:hidden !important;top:0 !important}body{background-color:#fffdfd;position:absolute !important}*:active,*:focus{outline:none}::selection{color:#f5f5f5;background-color:#797979}::-moz-selection{color:#f5f5f5;background-color:#797979}a:hover,a:active,a:focus,a{text-decoration:none}h1,h2,h3,h4,h5,h6{color:var(--dark-green)}ul li{list-style:none}img{max-width:100%}@media only screen and (min-width: 768px){.reset-padding{padding:0 !important}.reset-margin{margin:0 !important}.reset-margin-top{margin-top:0 !important}.reset-margin-right{margin-right:0 !important}.reset-margin-left{margin-left:0 !important}.reset-margin-bottom{margin-bottom:0 !important}.reset-padding-top{padding-top:0 !important}.reset-padding-right{padding-right:0 !important}.reset-padding-left{padding-left:0 !important}.reset-padding-bottom{padding-bottom:0 !important}}.container{width:60%;margin-right:auto;margin-left:auto}@media only screen and (max-width: 769px){.container{width:100%}}.container-fluid{width:100%;margin-right:auto;margin-left:auto}.row{width:100%;display:flex;flex-wrap:wrap;justify-content:space-between}[class^="col"]{flex-grow:1;max-width:100%;padding:15px;min-height:1px;position:relative}.col{flex-basis:0}@media only screen and (max-width: 769px){.col{flex-basis:100%}}.col-1{-ms-flex-preferred-size:8.33333%;max-width:8.33333%;flex-basis:8.33333%}.col-2{-ms-flex-preferred-size:16.66667%;max-width:16.66667%;flex-basis:16.66667%}.col-3{-ms-flex-preferred-size:25%;max-width:25%;flex-basis:25%}.col-4{-ms-flex-preferred-size:33.33333%;max-width:33.33333%;flex-basis:33.33333%}.col-5{-ms-flex-preferred-size:41.66667%;max-width:41.66667%;flex-basis:41.66667%}.col-6{-ms-flex-preferred-size:50%;max-width:50%;flex-basis:50%}.col-7{-ms-flex-preferred-size:58.33333%;max-width:58.33333%;flex-basis:58.33333%}.col-8{-ms-flex-preferred-size:66.66667%;max-width:66.66667%;flex-basis:66.66667%}.col-9{-ms-flex-preferred-size:75%;max-width:75%;flex-basis:75%}.col-10{-ms-flex-preferred-size:83.33333%;max-width:83.33333%;flex-basis:83.33333%}.col-11{-ms-flex-preferred-size:91.66667%;max-width:91.66667%;flex-basis:91.66667%}.col-12{-ms-flex-preferred-size:100%;max-width:100%;flex-basis:100%}@media only screen and (max-width: 480px){.col-xs-1{-ms-flex-preferred-size:8.33333%;max-width:8.33333%;flex-basis:8.33333%}.col-xs-2{-ms-flex-preferred-size:16.66667%;max-width:16.66667%;flex-basis:16.66667%}.col-xs-3{-ms-flex-preferred-size:25%;max-width:25%;flex-basis:25%}.col-xs-4{-ms-flex-preferred-size:33.33333%;max-width:33.33333%;flex-basis:33.33333%}.col-xs-5{-ms-flex-preferred-size:41.66667%;max-width:41.66667%;flex-basis:41.66667%}.col-xs-6{-ms-flex-preferred-size:50%;max-width:50%;flex-basis:50%}.col-xs-7{-ms-flex-preferred-size:58.33333%;max-width:58.33333%;flex-basis:58.33333%}.col-xs-8{-ms-flex-preferred-size:66.66667%;max-width:66.66667%;flex-basis:66.66667%}.col-xs-9{-ms-flex-preferred-size:75%;max-width:75%;flex-basis:75%}.col-xs-10{-ms-flex-preferred-size:83.33333%;max-width:83.33333%;flex-basis:83.33333%}.col-xs-11{-ms-flex-preferred-size:91.66667%;max-width:91.66667%;flex-basis:91.66667%}.col-xs-12{-ms-flex-preferred-size:100%;max-width:100%;flex-basis:100%}}@media only screen and (max-width: 769px){.col-sm-1{-ms-flex-preferred-size:8.33333%;max-width:8.33333%;flex-basis:8.33333%}.col-sm-2{-ms-flex-preferred-size:16.66667%;max-width:16.66667%;flex-basis:16.66667%}.col-sm-3{-ms-flex-preferred-size:25%;max-width:25%;flex-basis:25%}.col-sm-4{-ms-flex-preferred-size:33.33333%;max-width:33.33333%;flex-basis:33.33333%}.col-sm-5{-ms-flex-preferred-size:41.66667%;max-width:41.66667%;flex-basis:41.66667%}.col-sm-6{-ms-flex-preferred-size:50%;max-width:50%;flex-basis:50%}.col-sm-7{-ms-flex-preferred-size:58.33333%;max-width:58.33333%;flex-basis:58.33333%}.col-sm-8{-ms-flex-preferred-size:66.66667%;max-width:66.66667%;flex-basis:66.66667%}.col-sm-9{-ms-flex-preferred-size:75%;max-width:75%;flex-basis:75%}.col-sm-10{-ms-flex-preferred-size:83.33333%;max-width:83.33333%;flex-basis:83.33333%}.col-sm-11{-ms-flex-preferred-size:91.66667%;max-width:91.66667%;flex-basis:91.66667%}.col-sm-12{-ms-flex-preferred-size:100%;max-width:100%;flex-basis:100%}}@media only screen and (min-width: 769px){.col-md-1{-ms-flex-preferred-size:8.33333%;max-width:8.33333%;flex-basis:8.33333%}.col-md-2{-ms-flex-preferred-size:16.66667%;max-width:16.66667%;flex-basis:16.66667%}.col-md-3{-ms-flex-preferred-size:25%;max-width:25%;flex-basis:25%}.col-md-4{-ms-flex-preferred-size:33.33333%;max-width:33.33333%;flex-basis:33.33333%}.col-md-5{-ms-flex-preferred-size:41.66667%;max-width:41.66667%;flex-basis:41.66667%}.col-md-6{-ms-flex-preferred-size:50%;max-width:50%;flex-basis:50%}.col-md-7{-ms-flex-preferred-size:58.33333%;max-width:58.33333%;flex-basis:58.33333%}.col-md-8{-ms-flex-preferred-size:66.66667%;max-width:66.66667%;flex-basis:66.66667%}.col-md-9{-ms-flex-preferred-size:75%;max-width:75%;flex-basis:75%}.col-md-10{-ms-flex-preferred-size:83.33333%;max-width:83.33333%;flex-basis:83.33333%}.col-md-11{-ms-flex-preferred-size:91.66667%;max-width:91.66667%;flex-basis:91.66667%}.col-md-12{-ms-flex-preferred-size:100%;max-width:100%;flex-basis:100%}}@media only screen and (min-width: 992px){.col-lg-1{-ms-flex-preferred-size:8.33333%;max-width:8.33333%;flex-basis:8.33333%}.col-lg-2{-ms-flex-preferred-size:16.66667%;max-width:16.66667%;flex-basis:16.66667%}.col-lg-3{-ms-flex-preferred-size:25%;max-width:25%;flex-basis:25%}.col-lg-4{-ms-flex-preferred-size:33.33333%;max-width:33.33333%;flex-basis:33.33333%}.col-lg-5{-ms-flex-preferred-size:41.66667%;max-width:41.66667%;flex-basis:41.66667%}.col-lg-6{-ms-flex-preferred-size:50%;max-width:50%;flex-basis:50%}.col-lg-7{-ms-flex-preferred-size:58.33333%;max-width:58.33333%;flex-basis:58.33333%}.col-lg-8{-ms-flex-preferred-size:66.66667%;max-width:66.66667%;flex-basis:66.66667%}.col-lg-9{-ms-flex-preferred-size:75%;max-width:75%;flex-basis:75%}.col-lg-10{-ms-flex-preferred-size:83.33333%;max-width:83.33333%;flex-basis:83.33333%}.col-lg-11{-ms-flex-preferred-size:91.66667%;max-width:91.66667%;flex-basis:91.66667%}.col-lg-12{-ms-flex-preferred-size:100%;max-width:100%;flex-basis:100%}}.wrap{flex-wrap:wrap}.flex-end{justify-content:flex-end}.flex-start{justify-content:flex-start}.btn-success,.btn-danger,.btn-warning,.btn-muted,.btn-primary,.btn-secondary,.btn-black,.btn-yellow,.btn-light,.btn-bordered-primary,.btn-bordered-secondary,.btn-bordered-danger,.btn-bordered-success,.btn-bordered-warning,.btn-bordered-muted,.btn-bordered-light,.btn-bordered-dark,.btn-bordered-black{padding:9px 12px 6px;border:none;display:inline-flex;border-radius:.25rem;align-items:center;margin-right:10px}.btn-success img,.btn-danger img,.btn-warning img,.btn-muted img,.btn-primary img,.btn-secondary img,.btn-black img,.btn-yellow img,.btn-light img,.btn-bordered-primary img,.btn-bordered-secondary img,.btn-bordered-danger img,.btn-bordered-success img,.btn-bordered-warning img,.btn-bordered-muted img,.btn-bordered-light img,.btn-bordered-dark img,.btn-bordered-black img{margin-left:8px}.btn-success{background-color:#00e988;color:#f5f5f5;border:1px solid #00e988}.btn-success:hover,.btn-success:focus,.btn-success:active{opacity:0.8}.btn-danger{background-color:#a71e22;color:#f5f5f5;border:1px solid #a71e22}.btn-danger:hover,.btn-danger:focus,.btn-danger:active{opacity:0.8}.btn-warning{background-color:#ffd30d;color:#797979;border:1px solid #ffd30d}.btn-warning:hover,.btn-warning:focus,.btn-warning:active{opacity:0.8}.btn-muted{background-color:#a2a2a2;color:#797979;border:1px solid #a2a2a2}.btn-muted:hover,.btn-muted:focus,.btn-muted:active{opacity:0.8}.btn-primary{background-color:#802c6e;color:#f5f5f5;border:1px solid #802c6e}.btn-primary:hover,.btn-primary:focus,.btn-primary:active{opacity:0.8}.btn-secondary{background-color:#f7aa35;color:#f5f5f5;border:1px solid #f7aa35}.btn-secondary:hover,.btn-secondary:focus,.btn-secondary:active{opacity:0.8}.btn-black{background-color:#1b1b1b;color:#f5f5f5;border:1px solid #1b1b1b}.btn-black:hover,.btn-black:focus,.btn-black:active{opacity:0.8}.btn-yellow{background-color:var(--yellow);color:#f5f5f5;border:1px solid var(--yellow)}.btn-yellow:hover,.btn-yellow:focus,.btn-yellow:active{opacity:0.8}.btn-light{background-color:#f5f5f5;color:#802c6e;border:1px solid #f5f5f5}.btn-light:hover,.btn-light:focus,.btn-light:active{opacity:0.8}.btn-rounded{border-radius:20px;-webkit-border-radius:20px;-moz-border-radius:20px;-ms-border-radius:20px;-o-border-radius:20px}.btn-bordered-primary{color:#802c6e;background-color:transparent}.btn-bordered-secondary{color:#f7aa35;background-color:transparent}.btn-bordered-danger{color:#a71e22;background-color:transparent}.btn-bordered-success{color:#00e988;background-color:transparent}.btn-bordered-warning{color:#ffd30d;background-color:transparent}.btn-bordered-muted{color:#a2a2a2;background-color:transparent}.btn-bordered-light{color:#f5f5f5;background-color:transparent}.btn-bordered-dark{color:#797979;background-color:transparent}.btn-bordered-black{color:#1b1b1b;background-color:transparent}button[disabled]{background-color:#ccc;cursor:not-allowed}.btn-circle{width:50px;height:50px;border-radius:50%;padding-top:5px;background-color:#fff;border:none}.btn-icon{margin-bottom:-7px}.btn-icon-invert{margin-bottom:-7px;filter:invert(100%)}.btn-outline{border:1px solid #802c6e;border-radius:.25rem;padding:9px 12px 6px;background-color:transparent;color:#802c6e}.btn-outline .btn-icon{position:relative;left:-5px}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{background-color:#802c6e;color:#fff}.btn-outline:hover .btn-icon,.btn-outline:focus .btn-icon,.btn-outline:active .btn-icon{filter:invert(100%)}.btn-triangle{position:relative;float:left;margin-left:6%;margin-top:2%}.btn-triangle::after{content:'';width:0;height:0;border-radius:.25rem;border-top:20px solid transparent;border-bottom:20px solid transparent;border-right:20px solid var(--yellow);position:absolute;left:-26px;top:-3px}.btn-large{padding:16px 20px 12px}.shadow{box-shadow:0 10px 30px rgba(50,50,93,0.12),0 -1px 4px rgba(0,0,0,0.06);-webkit-box-shadow:0 10px 30px rgba(50,50,93,0.12),0 -1px 4px rgba(0,0,0,0.06)}.center-align{text-align:center}.left-align{text-align:left}.right-align{text-align:right}.justify-align{text-align:justify}.block{display:block;width:100%}.inline-block{display:inline-block}.center-block{display:block;margin-right:auto;margin-left:auto}.margin-auto{margin:0 auto}.box-center{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);-webkit-transform:translate(-50%, -50%);-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-o-transform:translate(-50%, -50%)}.pull-left{float:left !important}.pull-right{float:right !important}hr{border:unset;border-bottom:1px solid rgba(187,187,187,0.2);width:100%;margin:30px auto}.label{display:inline-block;background:#f5f5f5;padding:5px 10px;border-radius:20px;-webkit-border-radius:20px;-moz-border-radius:20px;-ms-border-radius:20px;-o-border-radius:20px}.label-sm{font-size:0.8em}.margin-top-xlg{margin-top:200px !important}.margin-top-lg{margin-top:100px !important}.margin-top-md{margin-top:50px !important}.margin-top-sm{margin-top:30px !important}.margin-bottom-lg{margin-bottom:100px !important}.margin-bottom-md{margin-bottom:50px !important}.margin-bottom-sm{margin-bottom:30px !important}.padding-lg{padding:100px}.padding-md{padding:20px}.padding-sm{padding:10px}p{margin:10px 0}main{min-height:80vh;padding-top:30px}.hidden{display:none}@media only screen and (max-width: 769px){.hidden-xs{display:none}.visible-xs{display:block}}@media only screen and (min-width: 480px) and (max-width: 769px){.hidden-sm{display:none}.visible-sm{display:block}}@media only screen and (min-width: 769px) and (max-width: 992px){.hidden-md{display:none}.visible-md{display:block}}@media only screen and (min-width: 992px){.hidden-lg{display:none}.visible-lg{display:block}}.ck-editor__editable_inline{min-height:400px}[alt]{color:#fff}.justify-center{display:flex;justify-content:center}.justify-end{display:flex;justify-content:flex-end}.social{display:flex;justify-content:center}.stretched{align-items:stretch}#__next-prerender-indicator{display:none}#__next-build-watcher{display:none}@media only screen and (max-width: 769px){.reverse-xs{flex-direction:column-reverse}.margin-top-md-mob{margin-top:50px !important}.center-justify-xs{justify-content:center}}.exact-center{width:100%;height:100vh;display:flex;justify-content:center;align-items:center}.fixed{height:100vh;overflow:hidden}.body-fix{height:100vh;overflow:hidden}input,select,textarea,input[type="button"],input[type="submit"],button{border:none;margin-bottom:20px;padding:0 10px;font-size:1em}input:focus,select:focus,textarea:focus,button:focus{border-color:#1b1b1b}input{height:40px;width:30%}select{height:40px}textarea{width:97%}textarea::-moz-placeholder{line-height:6}textarea::-webkit-input-placeholder{line-height:6}textarea:-ms-input-placeholder{line-height:6}input[type="button"]{cursor:pointer}input[type="submit"]{cursor:pointer}button{display:inline-block;width:auto;cursor:pointer}::placeholder{color:#b8b7b7}input,button,textarea{appearance:none;-webkit-appearance:none;-moz-appearance:none}.form-element{position:relative;margin:30px auto}.flt-label{color:rgba(123,123,123,0.7);position:absolute;top:5px;right:12px;font-size:0.9em;cursor:text}.flt-label-focus{top:-15px;padding:2px;background-color:#fff;color:rgba(123,123,123,0.5)}.no-block{width:unset}.red{color:red}input[readonly]{background-color:#ccc}.primary{background-color:#802c6e}.secondary{background-color:#f7aa35}.danger{background-color:#a71e22}.success{background-color:#00e988}.warning{background-color:#ffd30d}.muted{background-color:#a2a2a2}.light{background-color:#f5f5f5}.dark{background-color:#797979}.black{background-color:#1b1b1b}.white{background-color:#fff}.text-primary{color:#802c6e}.text-secondary{color:#f7aa35}.text-danger{color:#a71e22}.text-success{color:#00e988}.text-warning{color:#ffd30d}.text-muted{color:#a2a2a2}.text-light{color:#f5f5f5}.text-dark{color:#797979}.text-black{color:#1b1b1b}.text-white{color:#fff}.grayscale-max{filter:grayscale(100);-webkit-filter:grayscale(100)}.grayscale-semi-max{filter:grayscale(80);-webkit-filter:grayscale(80)}.grayscale-mid{filter:grayscale(50);-webkit-filter:grayscale(50)}.grayscale-min{filter:grayscale(30);-webkit-filter:grayscale(30)}.modalwrapper{width:100%;height:100vh;position:fixed;top:0;right:0;left:0;bottom:0;z-index:100;background-color:rgba(0,0,0,0.7);display:none}.modal{width:80%;height:80vh;overflow:auto;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);border-radius:3px;z-index:99;background-color:#fff;padding:30px}.close{background-color:unset;border:unset;box-shadow:none;outline:none;float:right;font-size:2.2em;cursor:pointer}.hide{display:none}.block{display:block}table{width:100%;border-collapse:collapse}table tr td{border:1px solid rgba(123,123,123,0.2);padding:10px}table a{margin:10px}table thead td{font-weight:500;background-color:#f5f5f5}nav{background-color:transparent;padding:10px}nav #menu-icon{display:none}@media only screen and (max-width: 768px){nav #menu-icon{position:absolute;right:20px;top:20px;background:transparent;border:none;outline:none;display:block;width:40px;height:40px;padding:10px;z-index:100}nav #menu-icon.open span:first-child{transform:rotate(-45deg) translate(-5px, 5px)}nav #menu-icon.open span:last-child{transform:rotate(45deg)}}nav #menu-icon span{display:block;width:100%;border-bottom:2px solid #333;margin-bottom:5px}nav ul{display:flex;justify-content:flex-end;position:relative}@media only screen and (max-width: 480px){nav ul{position:fixed;right:-100%;top:0;bottom:0;z-index:99;height:100vh;width:100%;background-color:#fff;flex-direction:column;justify-content:center;align-items:center}nav ul.open{right:0}}nav ul li{margin:30px}@media only screen and (max-width: 480px){nav ul li{margin-bottom:20px}}nav ul li a{text-decoration:none;color:#6e6e6e;font-size:0.9em}nav ul li a:hover{color:initial}pre{width:100%;border-radius:7px;margin-bottom:20px}code{width:100%;background-color:#f5f5f5;padding:20px;display:block;line-height:1.5;font-size:1.1em;font-weight:300;letter-spacing:2px}code:empty{padding:0}#try{margin-top:100px}#try code{overflow-x:auto}.c-comment{color:#bdbdbd}.c-api{color:#802c6e}.code-area h2{font-size:1.7em}.code-area h3{margin-top:50px;font-size:1.4em}@media screen and (max-width: 480px){.code-area h3{margin-top:30px}}pre code{overflow-x:auto}.tips{color:#f7aa35}.output-result{display:none}.block{display:block}.intro{margin-top:200px}@media only screen and (max-width: 768px){.intro{margin-top:50px}}.intro h1{font-size:2.5em}.intro p{margin-bottom:20px}.intro div{align-items:flex-end}@media only screen and (max-width: 992px){.intro .btns{display:flex;flex-direction:column;align-items:flex-start}}.intro .btns a{margin-bottom:10px;width:200px;justify-content:space-between}@media only screen and (max-width: 480px){.intro .btns a{width:70%;justify-content:space-between;font-size:0.8em}.intro .btns a img{width:20px}}section{margin-bottom:100px}.intro-img{display:flex;flex-direction:row;justify-content:flex-end;align-items:flex-end}@media only screen and (max-width: 768px) and (min-width: 480px){.intro-img img{width:50%;display:block;margin:0 auto}}.about{margin-top:200px}@media only screen and (max-width: 480px){.about{margin-top:20px}.about p{text-align:left}}.about h3{width:100%;font-size:1.4em}@media only screen and (max-width: 480px){.about h3{font-size:1.2em;text-align:left}}footer{padding:20px;text-align:center;padding:50px;background-color:#f5f5f5;position:relative;z-index:10}footer p{font-weight:300}footer a{color:#3a3134;font-weight:300}footer a.donate{color:#802c6e}footer a.donate img{width:25px;margin-bottom:-5px}.heart{color:#a71e22}.loading{display:block;margin:10px auto;width:70px;height:70px;border-radius:50%;background-color:#802c6e;animation:loading 0.8s ease infinite alternate}@keyframes loading{to{transform:scale(1.2)}}.list{width:100%;margin-top:20px}.list li{width:50%;display:flex;justify-content:space-between;margin-bottom:10px;text-align:left}@media only screen and (max-width: 480px){.list li{width:100%;padding:10px 0}}.list li a{font-size:1.1em}.heading{width:100%;color:#802c6e;font-size:1.7em}.heading svg{position:relative;bottom:-2px}@media only screen and (max-width: 768px){main{padding:30px}}.logo{position:absolute;left:20.5%;top:30px;z-index:10}.logo img{width:50px}@media only screen and (max-width: 768px){.logo{position:absolute;left:15px;top:-5px;padding:30px}.logo img{width:35px}}aside{position:fixed !important;left:0;top:0;background-color:#f5f5f5cc;height:100vh;overflow:auto}aside ul{padding:40px 30px}aside ul li{margin-bottom:20px}aside ul:last-child{padding-bottom:200px}#cart{margin-top:100px}.auto-overflow{height:100vh;overflow:auto}.badge{padding:3px;border-radius:2px;background-color:#812c6f;color:#fff} 2 | /*# sourceMappingURL=master.min.css.map */ -------------------------------------------------------------------------------- /server-mock/public/dist/master.min.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "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", 4 | "sources": [ 5 | "../scss/master.scss", 6 | "../scss/_fonts.scss", 7 | "../scss/_typo.scss", 8 | "../scss/_variables.scss", 9 | "../scss/_reset.scss", 10 | "../scss/_grids.scss", 11 | "../scss/_buttons.scss", 12 | "../scss/_general.scss", 13 | "../scss/_form.scss", 14 | "../scss/_colors.scss", 15 | "../scss/_filters.scss", 16 | "../scss/_modal.scss", 17 | "../scss/_table.scss", 18 | "../scss/_nav.scss", 19 | "../scss/_code.scss", 20 | "../scss/_custom.scss", 21 | "../scss/_badge.scss" 22 | ], 23 | "names": [], 24 | "file": "master.min.css" 25 | } --------------------------------------------------------------------------------