From 3a8df79bf5a12bbfa763450555b7315b1c855022 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Wed, 23 May 2018 20:46:47 +0300 Subject: [PATCH] api fixes --- app.js | 1 + config/app.js | 4 +++- models/Todo.js | 1 + package-lock.json | 32 +++++++++++++++++++++----------- package.json | 1 + routes/lists.js | 6 +++--- routes/todos.js | 24 ++++++++++++++++-------- 7 files changed, 46 insertions(+), 23 deletions(-) diff --git a/app.js b/app.js index be36cac..7d01743 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,7 @@ require('./models/TodoList'); require('./models/Todo'); app.use('/lists', require('./routes/lists')); +app.use('/todos', require('./routes/todos')); // 404 route app.use((req, res) => { diff --git a/config/app.js b/config/app.js index 2c0925d..b548ade 100644 --- a/config/app.js +++ b/config/app.js @@ -2,13 +2,15 @@ const express = require('express'); const bodyParser = require('body-parser'); const methodOverride = require('method-override'); const morgan = require('morgan'); +const cors = require('cors'); const app = express(); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); +app.use(cors()); -app.use(morgan('tiny')); +app.use(morgan('dev')); app.use(methodOverride('_method')); diff --git a/models/Todo.js b/models/Todo.js index 252b108..f439f2c 100644 --- a/models/Todo.js +++ b/models/Todo.js @@ -29,6 +29,7 @@ TodoSchema.methods.toJson = function () { id: this._id.toString(), text: this.text, list: this.list.toString(), + completed: this.completed, }; }; diff --git a/package-lock.json b/package-lock.json index b12d432..84dec69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1649,6 +1649,15 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cors": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", + "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -4621,11 +4630,6 @@ "verror": "1.10.0" } }, - "kareem": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.0.7.tgz", - "integrity": "sha512-p8+lEpsNs4N0fvNOC1/zzDO0wDrD3Pb1G+OwfIG+gKVK3MyY5jeaGYh+9Qx6jb4fEG2b3E6U98vaE9MH7Gilsw==" - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -4970,13 +4974,13 @@ } }, "mongoose": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.1.1.tgz", - "integrity": "sha512-pmVX//61yX8hV/Db790Cym8CGYd29OYQROYx6ve6ab4LbUW0+GehiBVDlnE9Tvogaz8nndHlVUb+iXwOBw/MNw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.1.2.tgz", + "integrity": "sha512-k9hssPMgBnUYG5e9NoUbx/2ERDyelDY0Vf6BwjtmoETUhVT7pQUe1o+oelLLuHF3ZVY2qgienK8pnrI5pdvlxA==", "requires": { "async": "2.1.4", "bson": "~1.0.5", - "kareem": "2.0.7", + "kareem": "2.1.0", "lodash.get": "4.4.2", "mongodb": "3.0.8", "mongoose-legacy-pluralize": "1.0.2", @@ -4985,6 +4989,13 @@ "ms": "2.0.0", "regexp-clone": "0.0.1", "sliced": "1.0.1" + }, + "dependencies": { + "kareem": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.1.0.tgz", + "integrity": "sha512-ycoMY1tVkcH1/NaxGn2erZaUC3CodmX7Fl6DUVXjN73+uecWYTaaldRkxNY3HeSKQnQTWnoxRKnZfVHcB8tIWg==" + } } }, "mongoose-legacy-pluralize": { @@ -10330,8 +10341,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", diff --git a/package.json b/package.json index ee2e485..6aa0ae6 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "author": "", "dependencies": { "body-parser": "^1.18.3", + "cors": "^2.8.4", "dotenv": "^5.0.1", "express": "^4.16.3", "method-override": "^2.3.10", diff --git a/routes/lists.js b/routes/lists.js index 6dba0b8..d64e354 100644 --- a/routes/lists.js +++ b/routes/lists.js @@ -27,7 +27,7 @@ router.post( const { name } = req.body; const newList = new TodoList({ name }); await newList.save(); - res.json({ success: true }); + res.json({ success: true, data: newList.toJson() }); }), ); @@ -53,7 +53,7 @@ router.patch( const { listId } = res.locals; const { name } = req.body; const patch = {}; - if (name) { + if (name !== undefined) { patch.name = name; } const list = await TodoList.findByIdAndUpdate( @@ -63,7 +63,7 @@ router.patch( ).exec(); await list.slugify(); await list.save(); - res.json({ success: true }); + res.json({ success: true, data: list.toJson() }); }), ); router.use('/:slug/todos', listIdMiddleware, require('./todos')); diff --git a/routes/todos.js b/routes/todos.js index 1fc13af..3081a9a 100644 --- a/routes/todos.js +++ b/routes/todos.js @@ -12,7 +12,7 @@ const { NotFoundError } = require('../errors'); router.get( '/', asyncHelper(async (req, res) => { - const { listId } = res.locals; + const { listId } = res.locals || req.body; const todos = await Todo.find({ list: listId }).exec(); res.json({ success: true, data: todos.map(todo => todo.toJson()) }); }), @@ -22,11 +22,12 @@ router.get( router.post( '/', asyncHelper(async (req, res) => { - const { listId } = res.locals; + const { listId } = res.locals || req.body; const { text } = req.body; + console.log(req.body); const todo = new Todo({ text, list: listId }); await todo.save(); - res.json({ success: true }); + res.json({ success: true, data: todo.toJson() }); }), ); @@ -37,14 +38,21 @@ router.patch( const { todoId } = req.params; const { text, completed } = req.body; const patch = {}; - if (text) { + if (text !== undefined) { patch.text = text; } - if (completed) { + if (completed !== undefined) { patch.completed = completed; } - await Todo.update({ _id: todoId }, { $set: patch }).exec(); - res.json({ success: true }); + const todo = await Todo.findByIdAndUpdate( + { _id: todoId }, + { $set: patch }, + { new: true }, + ).exec(); + if (!todo) { + throw new NotFoundError(`can't find todo with id ${todoId}`); + } + res.json({ success: true, data: todo.toJson() }); }), ); @@ -55,7 +63,7 @@ router.delete( const { todoId } = req.params; const todo = await Todo.findById(todoId).exec(); if (!todo) { - throw new NotFoundError('cant find todo'); + throw new NotFoundError(`can't find todo with id ${todoId}`); } await todo.remove(); res.json({ success: true });