From 498d323c129cb2afb0e6859fd5a2ced79bb1b0af Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Tue, 18 Jan 2022 13:18:27 -0800 Subject: [PATCH 1/5] server up and running, logger middleware created --- api/middleware/middleware.js | 12 ++++++++++++ api/server.js | 5 ++++- api/users/users-router.js | 4 ++++ index.js | 9 +++++++++ package-lock.json | 15 ++++++++++++++- package.json | 1 + 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/api/middleware/middleware.js b/api/middleware/middleware.js index 0cceb716a..16ff25d19 100644 --- a/api/middleware/middleware.js +++ b/api/middleware/middleware.js @@ -1,5 +1,11 @@ function logger(req, res, next) { // DO YOUR MAGIC + const timeStamp = new Date().toLocaleString() + const method = req.method + const url = req.originalUrl + // console.log('logger middleware'); + console.log(`[${timeStamp}] ${method} to ${url}`); + next() } function validateUserId(req, res, next) { @@ -15,3 +21,9 @@ function validatePost(req, res, 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 badc3026a..3088f1624 100644 --- a/api/server.js +++ b/api/server.js @@ -1,9 +1,12 @@ const express = require('express'); const server = express(); +// const userRouter = require('../api/users') +const { logger } = require('./middleware/middleware') // remember express by default cannot parse JSON in request bodies - +server.use(express.json()) +server.use(logger) // global middlewares and the user's router need to be connected here server.get('/', (req, res) => { diff --git a/api/users/users-router.js b/api/users/users-router.js index 9d8a0e278..9a972d72e 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -1,7 +1,11 @@ const express = require('express'); // You will need `users-model.js` and `posts-model.js` both +const User = require('./users-model') +const Posts = require('../posts/posts-model') + // The middleware functions also need to be required +const { validateUserId, validateUser, validatePost } = require('../middleware/middleware') const router = express.Router(); diff --git a/index.js b/index.js index 602039f1b..06c1ec639 100644 --- a/index.js +++ b/index.js @@ -1 +1,10 @@ // require your server and launch it +const server = require('./api/server') + +require('colors') + +const port = 9000 + +server.listen(port, () => { + console.log(`Server listening on port ${port}`); +}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a073034f1..208c2d856 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "packages": { "": { - "name": "node-api3-project", "version": "1.0.0", "dependencies": { + "colors": "^1.4.0", "express": "^4.17.1", "knex": "^0.95.14", "sqlite3": "^5.0.2" @@ -1995,6 +1995,14 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" }, + "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", @@ -8782,6 +8790,11 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" }, + "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", diff --git a/package.json b/package.json index 8f31b3fe7..bb3f148a1 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "url": "git+https://github.com/BloomInstituteOfTechnology/node-api3-project.git" }, "dependencies": { + "colors": "^1.4.0", "express": "^4.17.1", "knex": "^0.95.14", "sqlite3": "^5.0.2" From e933d47b3180741c405ddde225a5c965b214e83a Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Tue, 18 Jan 2022 13:49:33 -0800 Subject: [PATCH 2/5] middleware created --- api/middleware/middleware.js | 38 +++++++++++++++++++++++++++++++++++- api/server.js | 6 +++--- api/users/users-router.js | 17 ++++++++-------- 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/api/middleware/middleware.js b/api/middleware/middleware.js index 16ff25d19..81e13d0a3 100644 --- a/api/middleware/middleware.js +++ b/api/middleware/middleware.js @@ -1,3 +1,5 @@ +const User = require('../users/users-model') + function logger(req, res, next) { // DO YOUR MAGIC const timeStamp = new Date().toLocaleString() @@ -8,16 +10,50 @@ function logger(req, res, next) { next() } -function validateUserId(req, res, next) { +async function validateUserId(req, res, next) { // DO YOUR MAGIC + try{ + const user = await User.getById(req.params.id) + if(!user){ + res.status(404).json({ + message: 'user not found' + }) + }else{ + req.user = user + next() + } + }catch(err){ + res.status(500).json({ + message: 'Problem finding user' + }) + } + next() } function validateUser(req, res, next) { // DO YOUR MAGIC + 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) { // DO YOUR MAGIC + 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/server.js b/api/server.js index 3088f1624..010d9eeae 100644 --- a/api/server.js +++ b/api/server.js @@ -1,11 +1,11 @@ const express = require('express'); -const server = express(); -// const userRouter = require('../api/users') +const userRouter = require('../api/users/users-router') 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 9a972d72e..e733049df 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -1,8 +1,8 @@ const express = require('express'); // You will need `users-model.js` and `posts-model.js` both -const User = require('./users-model') -const Posts = require('../posts/posts-model') +// const User = require('./users-model') +// const Posts = require('../posts/posts-model') // The middleware functions also need to be required const { validateUserId, validateUser, validatePost } = require('../middleware/middleware') @@ -13,36 +13,37 @@ 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 }); -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 }); -router.put('/:id', (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 }); -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 }); -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 }); -router.post('/:id/posts', (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 }); // do not forget to export the router +module.exports = router \ No newline at end of file From 9d460dfe780f783144d69227c9063659504e8775 Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Tue, 18 Jan 2022 13:54:03 -0800 Subject: [PATCH 3/5] getting users --- api/users/users-router.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/api/users/users-router.js b/api/users/users-router.js index e733049df..0bcf2c831 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -1,16 +1,21 @@ const express = require('express'); // You will need `users-model.js` and `posts-model.js` both -// const User = require('./users-model') -// const Posts = require('../posts/posts-model') +const User = require('./users-model') +const Posts = require('../posts/posts-model') // The middleware functions also need to be required const { validateUserId, validateUser, validatePost } = require('../middleware/middleware') 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) => { @@ -45,5 +50,13 @@ router.post('/:id/posts', validateUserId, validatePost, (req, res) => { // and another middleware to check that the request body is valid }); +router.use((err, req, res, next) => { + res.status(err.status || 500).json({ + customMessage: 'Error inside user router', + message: err.message, + stack: err.stack + }) +}) + // do not forget to export the router module.exports = router \ No newline at end of file From 5b97651c8902b01620f5a9af4bbf97f84e5c58f7 Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Tue, 18 Jan 2022 14:01:43 -0800 Subject: [PATCH 4/5] getting user by id, posting new users --- api/users/users-router.js | 8 +++++++- data/database.db3 | Bin 28672 -> 28672 bytes 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/api/users/users-router.js b/api/users/users-router.js index 0bcf2c831..f4bb5c8a8 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -21,11 +21,17 @@ 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) }); -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) }); router.put('/:id', validateUserId, validateUser, (req, res) => { diff --git a/data/database.db3 b/data/database.db3 index 90697a674f2f906de0b66e39736d5ed4790e297e..acb551e09453afe8a97d243e453e2dcdd9541f00 100644 GIT binary patch delta 120 zcmZp8z}WDBae_1>*F+g-My`zs^Yt0IHW{!8NO19IFz~)XKP5gKGGl9x| T`FXgRr5T~Bxi*)^cMAXjJyIh$ delta 90 zcmZp8z}WDBae_1>=R_H2M$U~1^Ys}yHyN-9h;j0lFz~29?&86|(0sz>@92Nio From b0697a6d4087d10a52bee1c64693a4e367f5cc85 Mon Sep 17 00:00:00 2001 From: Cynthia Coronado Date: Tue, 18 Jan 2022 17:11:31 -0800 Subject: [PATCH 5/5] wip --- api/users/users-router.js | 39 +++++++++++++++++++++++++++++++++----- data/database.db3 | Bin 28672 -> 28672 bytes 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/api/users/users-router.js b/api/users/users-router.js index f4bb5c8a8..d67328e13 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -34,26 +34,55 @@ router.post('/', validateUser, (req, res, next) => { .catch(next) }); -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.status(201).json(user) + }) + .catch(next) }); -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) + } }); -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) + } +}); -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) + } }); router.use((err, req, res, next) => { diff --git a/data/database.db3 b/data/database.db3 index acb551e09453afe8a97d243e453e2dcdd9541f00..be0d441d8272493266dfe2af3715f4a41a762d15 100644 GIT binary patch delta 71 zcmZp8z}WDBae_1>-$WT_M!t;+OYE6B`AaslJ0$Y+FfcIiNT=lI<(DPqO)l}D0F)`+ T%pQ=$&kd4+N^CBP?-2k1<4_c^ delta 71 zcmZp8z}WDBae_1>*F+g-My`zsOYE7s_%k-MJ0$Y+aB(p+NGDh3m1JZlPA>7E0F=qx V%pQ=$&&|y&%?Op)ToT_S007~i6tMsR