diff --git a/api/middleware/middleware.js b/api/middleware/middleware.js index 0cceb716a..33e8b67ca 100644 --- a/api/middleware/middleware.js +++ b/api/middleware/middleware.js @@ -1,17 +1,69 @@ +const User = require('../users/users-model') + function logger(req, res, next) { - // DO YOUR MAGIC + // DO YOUR MAGIC + const timeStamp = new Date().toLocaleString() + const method = req.method + const url = req.originalUrl + console.log(`[${timeStamp}] ${method} to ${url}`) + next() } -function validateUserId(req, res, next) { +async function validateUserId(req, res, next) { // DO YOUR MAGIC + // 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', + }) + } + } function validateUser(req, res, next) { // DO YOUR MAGIC + // 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) { // DO YOUR MAGIC + // console.log('validatePost middleware') + const { text } = req.body + if(!text || !text.trim()){ + res.status(400).json({ + message: 'missing required text field', + }) + }else{ + req.text= text.trim() + next() + } } // do not forget to expose these functions to other modules +module.exports = { + validateUserId, + validateUser, + validatePost, + logger, +} \ No newline at end of file diff --git a/api/server.js b/api/server.js index badc3026a..757007277 100644 --- a/api/server.js +++ b/api/server.js @@ -1,8 +1,12 @@ const express = require('express'); - +const { logger } = require('./middleware/middleware'); const server = express(); +const usersRouter = require('./users/users-router'); // remember express by default cannot parse JSON in request bodies +server.use(express.json()) +server.use(logger) +server.use('/api/users', usersRouter); // 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..0984759a3 100644 --- a/api/users/users-router.js +++ b/api/users/users-router.js @@ -1,44 +1,75 @@ +// The middleware functions also need to be required const express = require('express'); +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 User = require("./users-model") +const Post = require('../posts/posts-model') 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', (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) => { +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.name) }); -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 + console.log(req.user) + console.log(req.name) }); -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, 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) }); +router.use((err, req, res, next) => { + res.status(err.status || 500).json({ + customMessafe: 'something bad happened', + message: err.message, + stack: err.stack, + }) +}) + // do not forget to export the router +module.exports = router diff --git a/index.js b/index.js index 602039f1b..9e9ab19df 100644 --- a/index.js +++ b/index.js @@ -1 +1,7 @@ // require your server and launch it +// console.log('Hello World!') + const server = require('./api/server') + const PORT = 5000 + server.listen(PORT, () => { + console.log('listening on' , PORT) + }) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a073034f1..955d741ee 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", @@ -1851,6 +1850,7 @@ "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", + "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -2479,7 +2479,8 @@ "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1" + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "bin": { "escodegen": "bin/escodegen.js", @@ -4083,6 +4084,7 @@ "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", "graceful-fs": "^4.2.4", "jest-regex-util": "^27.4.0", "jest-serializer": "^27.4.0", @@ -6238,6 +6240,7 @@ "hasInstallScript": true, "dependencies": { "node-addon-api": "^3.0.0", + "node-gyp": "3.x", "node-pre-gyp": "^0.11.0" }, "optionalDependencies": {