From 5bfa5ee3d87f81ae57ccaf533891248a69938d65 Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Tue, 2 Nov 2021 19:26:16 -0700 Subject: [PATCH 01/11] Server is up and running" --- api/server.js | 2 ++ index.js | 7 +++++++ package-lock.json | 1 - 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/api/server.js b/api/server.js index badc3026a..e9958a3b1 100644 --- a/api/server.js +++ b/api/server.js @@ -2,6 +2,8 @@ const express = require('express'); const server = express(); +server.use(express.json()) + // remember express by default cannot parse JSON in request bodies // global middlewares and the user's router need to be connected here diff --git a/index.js b/index.js index 602039f1b..9b8fb3898 100644 --- a/index.js +++ b/index.js @@ -1 +1,8 @@ // require your server and launch it +const server = require('./api/server') + +const port = 8000 + +server.listen(port, () => { + console.log(`Server running on http://localhost:${port}`); +}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 88b87652e..e58254bf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,6 @@ "requires": true, "packages": { "": { - "name": "node-api3-project", "version": "1.0.0", "dependencies": { "express": "^4.17.1", From 7b8b8d96093f451cf79d3021fdc1755a613828ab Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Tue, 2 Nov 2021 20:44:12 -0700 Subject: [PATCH 02/11] Not able to get users --- api/middleware/middleware.js | 36 +++++++++- api/server.js | 14 +++- api/users/users-router.js | 16 ++++- index.js | 5 +- package-lock.json | 129 +++++++++++++++++++++++++++++++++++ package.json | 3 + 6 files changed, 197 insertions(+), 6 deletions(-) diff --git a/api/middleware/middleware.js b/api/middleware/middleware.js index 0cceb716a..5d34d4ac4 100644 --- a/api/middleware/middleware.js +++ b/api/middleware/middleware.js @@ -1,17 +1,51 @@ +const User = require('../users/users-model') + function logger(req, res, next) { // DO YOUR MAGIC + console.log(req.method) + console.log(req.url); + console.log(new Date); + next() } -function validateUserId(req, res, next) { +async function validateUserId(req, res, next) { // DO YOUR MAGIC + try { + const { id } = req.params + const user = await User.getById(id) + if(!user){ + res.status(404).json(`no user with ${id}`) + } else { + req.user = user + next() + } + } catch (error) { + res.status(500).json({ message: error.message}) + } } function validateUser(req, res, next) { // DO YOUR MAGIC + if(!req.body.name){ + res.status(400).json("Name required") + } else { + next() + } } function validatePost(req, res, next) { // DO YOUR MAGIC + if(!req.body.text){ + res.status(400).json("Text is required") + } else { + next() + } } // do not forget to expose these functions to other modules +module.exports = { + logger, + validateUserId, + validateUser, + validatePost +} \ No newline at end of file diff --git a/api/server.js b/api/server.js index e9958a3b1..285fa2876 100644 --- a/api/server.js +++ b/api/server.js @@ -1,10 +1,20 @@ const express = require('express'); +const morgan = require('morgan') +const helmet = require('helmet') +const userRouter = require('./users/users-router.js'); +const { logger } = require('./middleware/middleware.js'); const server = express(); -server.use(express.json()) - // remember express by default cannot parse JSON in request bodies +server.use(express.json()); + + +server.use(helmet()) +server.use(morgan('dev')); +server.use(express.json()); +server.use(logger) +server.use('/api/users', logger, userRouter) // global middlewares and the user's router need to be connected here diff --git a/api/users/users-router.js b/api/users/users-router.js index 9d8a0e278..d497d8be0 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -1,5 +1,7 @@ const express = require('express'); - +const User = require('../users/users-model') +const Posts = require('../posts/posts-model') +const { validateUserId, validateUser, validatePost } = require('../middleware/middleware') // You will need `users-model.js` and `posts-model.js` both // The middleware functions also need to be required @@ -7,6 +9,17 @@ const router = express.Router(); router.get('/', (req, res) => { // RETURN AN ARRAY WITH ALL THE USERS + User.get() + .then(users => { + res.status(200).json(users) + console.log('users', users); + }) + .catch(error => { + console.log(error); + res.status(500).json({ + message: 'There was an error retrieving the users' + }) + }) }); router.get('/:id', (req, res) => { @@ -42,3 +55,4 @@ router.post('/:id/posts', (req, res) => { }); // do not forget to export the router +module.exports = router \ No newline at end of file diff --git a/index.js b/index.js index 9b8fb3898..5abd1940a 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,9 @@ // require your server and launch it const server = require('./api/server') - +const express = require('express') +require('colors') const port = 8000 server.listen(port, () => { - console.log(`Server running on http://localhost:${port}`); + console.log(`Server running on http://localhost:${port}`.cyan); }) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e58254bf9..5ede9277f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,8 +7,11 @@ "": { "version": "1.0.0", "dependencies": { + "colors": "^1.4.0", "express": "^4.17.1", + "helmet": "^4.6.0", "knex": "^0.95.11", + "morgan": "^1.10.0", "sqlite3": "^5.0.2" }, "devDependencies": { @@ -1551,6 +1554,17 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -1999,6 +2013,14 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3388,6 +3410,14 @@ "node": ">=8" } }, + "node_modules/helmet": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-4.6.0.tgz", + "integrity": "sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -4947,6 +4977,42 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5363,6 +5429,14 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8452,6 +8526,14 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -8804,6 +8886,11 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -9882,6 +9969,11 @@ "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, + "helmet": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-4.6.0.tgz", + "integrity": "sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg==" + }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -11084,6 +11176,38 @@ "minimist": "^1.2.5" } }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -11404,6 +11528,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", diff --git a/package.json b/package.json index 19860c4af..2b3608481 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,11 @@ "url": "git+https://github.com/LambdaSchool/node-api3-project.git" }, "dependencies": { + "colors": "^1.4.0", "express": "^4.17.1", + "helmet": "^4.6.0", "knex": "^0.95.11", + "morgan": "^1.10.0", "sqlite3": "^5.0.2" }, "devDependencies": { From 75c7767ad76898c99799994895fd07c4f6ab6e2c Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Mon, 22 Nov 2021 20:11:53 -0800 Subject: [PATCH 03/11] starting over. index, server and first middleware completed --- api/middleware/middleware.js | 40 ++++++++++++------------------------ api/server.js | 11 ++-------- api/users/users-router.js | 21 +++++-------------- index.js | 2 +- 4 files changed, 21 insertions(+), 53 deletions(-) diff --git a/api/middleware/middleware.js b/api/middleware/middleware.js index 5d34d4ac4..762260db7 100644 --- a/api/middleware/middleware.js +++ b/api/middleware/middleware.js @@ -2,44 +2,30 @@ const User = require('../users/users-model') function logger(req, res, next) { // DO YOUR MAGIC - console.log(req.method) - console.log(req.url); - console.log(new Date); - next() + const timeStamp = new Date().toLocaleString() + const method = req.method + const url = req.originalUrl + // console.log('logger middleware'); + console.log(`[${timeStamp}] ${method} to ${url}`); + next() } -async function validateUserId(req, res, next) { +function validateUserId(req, res, next) { // DO YOUR MAGIC - try { - const { id } = req.params - const user = await User.getById(id) - if(!user){ - res.status(404).json(`no user with ${id}`) - } else { - req.user = user - next() - } - } catch (error) { - res.status(500).json({ message: error.message}) - } + console.log('validateUserId middleware'); + next() } function validateUser(req, res, next) { // DO YOUR MAGIC - if(!req.body.name){ - res.status(400).json("Name required") - } else { - next() - } + console.log('validateUser middleware'); + next() } function validatePost(req, res, next) { // DO YOUR MAGIC - if(!req.body.text){ - res.status(400).json("Text is required") - } else { - next() - } + console.log('validatePosts middleware'); + next() } // do not forget to expose these functions to other modules diff --git a/api/server.js b/api/server.js index 285fa2876..91b45f433 100644 --- a/api/server.js +++ b/api/server.js @@ -1,20 +1,13 @@ const express = require('express'); -const morgan = require('morgan') -const helmet = require('helmet') -const userRouter = require('./users/users-router.js'); -const { logger } = require('./middleware/middleware.js'); +// const userRouter = require('./users/users-router.js'); +const { logger } = require('./middleware/middleware'); const server = express(); // remember express by default cannot parse JSON in request bodies server.use(express.json()); - -server.use(helmet()) -server.use(morgan('dev')); -server.use(express.json()); server.use(logger) -server.use('/api/users', logger, userRouter) // global middlewares and the user's router need to be connected here diff --git a/api/users/users-router.js b/api/users/users-router.js index d497d8be0..13f9a4e64 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -1,25 +1,14 @@ -const express = require('express'); -const User = require('../users/users-model') -const Posts = require('../posts/posts-model') -const { validateUserId, validateUser, validatePost } = require('../middleware/middleware') +// const express = require('express'); +// const User = require('../users/users-model') +// const Posts = require('../posts/posts-model') +// const { validateUserId, validateUser, validatePost } = require('../middleware/middleware') // You will need `users-model.js` and `posts-model.js` both // The middleware functions also need to be required -const router = express.Router(); +// const router = express.Router(); router.get('/', (req, res) => { // RETURN AN ARRAY WITH ALL THE USERS - User.get() - .then(users => { - res.status(200).json(users) - console.log('users', users); - }) - .catch(error => { - console.log(error); - res.status(500).json({ - message: 'There was an error retrieving the users' - }) - }) }); router.get('/:id', (req, res) => { diff --git a/index.js b/index.js index 5abd1940a..676efe399 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,7 @@ // require your server and launch it const server = require('./api/server') -const express = require('express') require('colors') + const port = 8000 server.listen(port, () => { From 6ce836f038019277aa8d379c0bd1cb723fa0fa9d Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Wed, 24 Nov 2021 12:27:14 -0800 Subject: [PATCH 04/11] validateUserId completed --- api/middleware/middleware.js | 19 +++++++++++++++++-- api/server.js | 4 ++-- api/users/users-router.js | 22 ++++++++++++++-------- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/api/middleware/middleware.js b/api/middleware/middleware.js index 762260db7..6b2643711 100644 --- a/api/middleware/middleware.js +++ b/api/middleware/middleware.js @@ -10,9 +10,24 @@ function logger(req, res, next) { next() } -function validateUserId(req, res, next) { +async function validateUserId(req, res, next) { // DO YOUR MAGIC - console.log('validateUserId middleware'); + // console.log('validateUserId middleware'); + try { + const user = await User.getById(req.params.id) + if(!user){ + res.status(404).json({ + message: 'No such user' + }) + }else { + req.user = user + next() + } + } catch (err) { + res.status(500).json({ + message: 'Problem finding user' + }) + } next() } diff --git a/api/server.js b/api/server.js index 91b45f433..9bc6fdbeb 100644 --- a/api/server.js +++ b/api/server.js @@ -1,12 +1,12 @@ const express = require('express'); -// const userRouter = require('./users/users-router.js'); +const userRouter = require('./users/users-router.js'); const { logger } = require('./middleware/middleware'); const server = express(); // remember express by default cannot parse JSON in request bodies server.use(express.json()); - +server.use('/api/users', userRouter) server.use(logger) // global middlewares and the user's router need to be connected here diff --git a/api/users/users-router.js b/api/users/users-router.js index 13f9a4e64..a0a561ce3 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -1,46 +1,52 @@ -// const express = require('express'); +const express = require('express'); // const User = require('../users/users-model') // const Posts = require('../posts/posts-model') -// const { validateUserId, validateUser, validatePost } = require('../middleware/middleware') +const { validateUserId, validateUser, validatePost } = require('../middleware/middleware') // You will need `users-model.js` and `posts-model.js` both // The middleware functions also need to be required -// const router = express.Router(); +const router = express.Router(); router.get('/', (req, res) => { // RETURN AN ARRAY WITH ALL THE USERS }); -router.get('/:id', (req, res) => { +router.get('/:id', validateUserId, (req, res) => { // RETURN THE USER OBJECT // this needs a middleware to verify user id + console.log(req.user); }); router.post('/', (req, res) => { // RETURN THE NEWLY CREATED USER OBJECT // this needs a middleware to check that the request body is valid + console.log(req.user); }); -router.put('/:id', (req, res) => { +router.put('/:id', validateUserId, (req, res) => { // RETURN THE FRESHLY UPDATED USER OBJECT // this needs a middleware to verify user id // and another middleware to check that the request body is valid + console.log(req.user); }); -router.delete('/:id', (req, res) => { +router.delete('/:id', validateUserId, (req, res) => { // RETURN THE FRESHLY DELETED USER OBJECT // this needs a middleware to verify user id + console.log(req.user); }); -router.get('/:id/posts', (req, res) => { +router.get('/:id/posts', validateUserId, (req, res) => { // RETURN THE ARRAY OF USER POSTS // this needs a middleware to verify user id + console.log(req.user); }); -router.post('/:id/posts', (req, res) => { +router.post('/:id/posts', validateUserId, (req, res) => { // RETURN THE NEWLY CREATED USER POST // this needs a middleware to verify user id // and another middleware to check that the request body is valid + console.log(req.user); }); // do not forget to export the router From 6638285b0165db18c0b6f5d9ce03b1cab7bf47a2 Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Wed, 24 Nov 2021 12:38:47 -0800 Subject: [PATCH 05/11] validateUser complete --- api/middleware/middleware.js | 16 ++++++++++++---- api/users/users-router.js | 6 ++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/api/middleware/middleware.js b/api/middleware/middleware.js index 6b2643711..cc4d9660d 100644 --- a/api/middleware/middleware.js +++ b/api/middleware/middleware.js @@ -17,7 +17,7 @@ async function validateUserId(req, res, next) { const user = await User.getById(req.params.id) if(!user){ res.status(404).json({ - message: 'No such user' + message: 'user not found' }) }else { req.user = user @@ -28,13 +28,21 @@ async function validateUserId(req, res, next) { message: 'Problem finding user' }) } - next() } function validateUser(req, res, next) { // DO YOUR MAGIC - console.log('validateUser middleware'); - next() + // console.log('validateUser middleware'); + const { name } = req.body + if(!name || !name.trim()) { + res.status(400).json({ + message: 'missing required name field' + }) + }else { + req.name = name.trim() + next() + } + } function validatePost(req, res, next) { diff --git a/api/users/users-router.js b/api/users/users-router.js index a0a561ce3..b39c9999a 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -17,17 +17,19 @@ router.get('/:id', validateUserId, (req, res) => { console.log(req.user); }); -router.post('/', (req, res) => { +router.post('/', validateUser, (req, res) => { // RETURN THE NEWLY CREATED USER OBJECT // this needs a middleware to check that the request body is valid console.log(req.user); + console.log(req.name); }); -router.put('/:id', validateUserId, (req, res) => { +router.put('/:id', validateUserId, validateUser, (req, res) => { // RETURN THE FRESHLY UPDATED USER OBJECT // this needs a middleware to verify user id // and another middleware to check that the request body is valid console.log(req.user); + console.log(req.name); }); router.delete('/:id', validateUserId, (req, res) => { From 1eb9cedcfa346afdbd2ddd33510ea768230b7663 Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Wed, 24 Nov 2021 12:44:54 -0800 Subject: [PATCH 06/11] validatePost complete --- api/middleware/middleware.js | 12 ++++++++++-- api/users/users-router.js | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/api/middleware/middleware.js b/api/middleware/middleware.js index cc4d9660d..03e58f1f6 100644 --- a/api/middleware/middleware.js +++ b/api/middleware/middleware.js @@ -47,8 +47,16 @@ function validateUser(req, res, next) { function validatePost(req, res, next) { // DO YOUR MAGIC - console.log('validatePosts middleware'); - next() + // console.log('validatePosts middleware'); + const { text } = req.body + if(!text || !text.trim()) { + res.status(400).json({ + message: 'missing required text field' + }) + }else { + req.name = text.trim() + next() + } } // do not forget to expose these functions to other modules diff --git a/api/users/users-router.js b/api/users/users-router.js index b39c9999a..3f4fa0e4d 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -44,11 +44,12 @@ router.get('/:id/posts', validateUserId, (req, res) => { console.log(req.user); }); -router.post('/:id/posts', validateUserId, (req, res) => { +router.post('/:id/posts', validateUserId, validatePost, (req, res) => { // RETURN THE NEWLY CREATED USER POST // this needs a middleware to verify user id // and another middleware to check that the request body is valid console.log(req.user); + console.log(req.text); }); // do not forget to export the router From dc167c8d22b99bb40d0651bf280d820166896e7f Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Wed, 24 Nov 2021 12:53:08 -0800 Subject: [PATCH 07/11] getting array with all users --- api/users/users-router.js | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/api/users/users-router.js b/api/users/users-router.js index 3f4fa0e4d..74f4f36ce 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -1,14 +1,20 @@ const express = require('express'); -// const User = require('../users/users-model') -// const Posts = require('../posts/posts-model') +const User = require('../users/users-model') +const Posts = require('../posts/posts-model') + const { validateUserId, validateUser, validatePost } = require('../middleware/middleware') // You will need `users-model.js` and `posts-model.js` both // The middleware functions also need to be required const router = express.Router(); -router.get('/', (req, res) => { +router.get('/', (req, res, next) => { // RETURN AN ARRAY WITH ALL THE USERS + User.get() + .then(users => { + res.json(users) + }) + .catch(next) }); router.get('/:id', validateUserId, (req, res) => { @@ -52,5 +58,13 @@ router.post('/:id/posts', validateUserId, validatePost, (req, res) => { console.log(req.text); }); +router.use((err, req, res, next) => { + res.status(err.status || 500).json({ + customMessage: 'Error inside posts router', + message: err.message, + stack: err.stack + }) +}) + // do not forget to export the router module.exports = router \ No newline at end of file From 77e4f7b53f0d9af8cb8c800fc4e1a5303037a66d Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Wed, 24 Nov 2021 13:12:50 -0800 Subject: [PATCH 08/11] post a new user --- api/users/users-router.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/api/users/users-router.js b/api/users/users-router.js index 74f4f36ce..b7f1a376a 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -20,12 +20,18 @@ router.get('/', (req, res, next) => { router.get('/:id', validateUserId, (req, res) => { // RETURN THE USER OBJECT // this needs a middleware to verify user id + res.json(req.user) console.log(req.user); }); -router.post('/', validateUser, (req, res) => { +router.post('/', validateUser, (req, res, next) => { // RETURN THE NEWLY CREATED USER OBJECT // this needs a middleware to check that the request body is valid + User.insert({ name: req.name }) + .then(newUser => { + res.status(201).json(newUser) + }) + .catch(next) console.log(req.user); console.log(req.name); }); From eac1d777225b9cf470e2e288b0b7602487552b80 Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Wed, 24 Nov 2021 13:28:17 -0800 Subject: [PATCH 09/11] update existing user --- api/users/users-router.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/api/users/users-router.js b/api/users/users-router.js index b7f1a376a..2697afc27 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -36,10 +36,18 @@ router.post('/', validateUser, (req, res, next) => { console.log(req.name); }); -router.put('/:id', validateUserId, validateUser, (req, res) => { +router.put('/:id', validateUserId, validateUser, (req, res, next) => { // RETURN THE FRESHLY UPDATED USER OBJECT // this needs a middleware to verify user id // and another middleware to check that the request body is valid + User.update(req.params.id, { name: req.name }) + .then(() => { + return User.getById(req.params.id) + }) + .then(user => { + res.json(user) + }) + .catch(next) console.log(req.user); console.log(req.name); }); From e7bf528e40917d9ed9996952b2e16640845d0c5a Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Wed, 24 Nov 2021 14:04:24 -0800 Subject: [PATCH 10/11] getting specific user posts --- api/users/users-router.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/api/users/users-router.js b/api/users/users-router.js index 2697afc27..4bf2e6445 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -52,15 +52,27 @@ router.put('/:id', validateUserId, validateUser, (req, res, next) => { console.log(req.name); }); -router.delete('/:id', validateUserId, (req, res) => { +router.delete('/:id', validateUserId, async (req, res, next) => { // RETURN THE FRESHLY DELETED USER OBJECT // this needs a middleware to verify user id + try{ + await User.remove(req.params.id) + res.json(req.user) + }catch(err) { + next(err) + } console.log(req.user); }); -router.get('/:id/posts', validateUserId, (req, res) => { +router.get('/:id/posts', validateUserId, async (req, res, next) => { // RETURN THE ARRAY OF USER POSTS // this needs a middleware to verify user id + try{ + const posts = await User.getUserPosts(req.params.id) + res.json(posts) + }catch (err){ + next(err) + } console.log(req.user); }); From e81597266e7bc7d70c3fa6882a2b343e98aa4923 Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Wed, 24 Nov 2021 15:00:26 -0800 Subject: [PATCH 11/11] complete --- api/users/users-router.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/api/users/users-router.js b/api/users/users-router.js index 4bf2e6445..20f075e07 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -76,10 +76,22 @@ router.get('/:id/posts', validateUserId, async (req, res, next) => { console.log(req.user); }); -router.post('/:id/posts', validateUserId, validatePost, (req, res) => { +router.post('/:id/posts', + validateUserId, + validatePost, + async (req, res, next) => { // RETURN THE NEWLY CREATED USER POST // this needs a middleware to verify user id // and another middleware to check that the request body is valid + try{ + const newPost = await Post.insert({ + user_id: req.params.id, + text: req.text, + }) + res.status(201).json(newPost) + }catch (err){ + next(err) + } console.log(req.user); console.log(req.text); });