const express = require('express'); const mongoose = require('mongoose'); const router = express.Router(); const Todo = mongoose.model('Todo'); const asyncHelper = require('../asyncHelper'); const { NotFoundError } = require('../errors'); // index router.get( '/', asyncHelper(async (req, res) => { const { listId } = res.locals || req.body; const todos = listId ? await Todo.find({ list: listId, user: req.user.id }).exec() : await Todo.find({ user: req.user.id }).exec(); res.json({ success: true, data: todos.reverse().map(todo => todo.toJson()) }); }), ); // create router.post( '/', asyncHelper(async (req, res) => { const { listId } = res.locals || req.body; const { text } = req.body; const { id } = req.body || mongoose.Types.ObjectId(); const todo = new Todo({ text, list: listId, user: req.user.id, _id: id }); await todo.save(); res.json({ success: true, data: todo.toJson() }); }), ); // update router.patch( '/:todoId', asyncHelper(async (req, res) => { const { todoId } = req.params; const { text, completed } = req.body; const todo = await Todo.findOne({ _id: todoId, user: req.user.id }); if (!todo) { throw new NotFoundError("can't find todo"); } if (text !== undefined) { todo.text = text; } if (completed !== undefined) { todo.completed = completed; } await todo.save(); res.json({ success: true, data: todo.toJson() }); }), ); // delete router.delete( '/:todoId', asyncHelper(async (req, res) => { const { todoId } = req.params; const todo = await Todo.findOne({ _id: todoId, user: req.user.id }).exec(); if (!todo) { throw new NotFoundError(`can't find todo with id ${todoId}`); } await todo.remove(); res.json({ success: true }); }), ); module.exports = router;