diff --git a/.gitignore b/.gitignore index 3f8e1d990..f105f8eae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ node_modules -.vscode/* \ No newline at end of file +config +.vscode/ +.env \ No newline at end of file diff --git a/config/.env b/config/.env deleted file mode 100644 index dbe126e0a..000000000 --- a/config/.env +++ /dev/null @@ -1,2 +0,0 @@ -PORT = 2121 -DB_STRING = mongodb+srv://demo:demo@cluster0.hcds1.mongodb.net/todos?retryWrites=true&w=majority \ No newline at end of file diff --git a/controllers/todos.js b/controllers/todos.js index b10950f93..908dd61cb 100644 --- a/controllers/todos.js +++ b/controllers/todos.js @@ -1,19 +1,30 @@ const Todo = require('../models/Todo') +const TodoList = require('../models/TodoList') module.exports = { getTodos: async (req,res)=>{ console.log(req.user) try{ const todoItems = await Todo.find({userId:req.user.id}) + const todoLists = await TodoList.find({ownerId:req.user.id}) const itemsLeft = await Todo.countDocuments({userId:req.user.id,completed: false}) - res.render('todos.ejs', {todos: todoItems, left: itemsLeft, user: req.user}) + res.render('todos.ejs', {todos: todoItems, left: itemsLeft, user: req.user, todoLists: todoLists}) + }catch(err){ + console.log(err) + } + }, + createList: async (req, res)=>{ + try{ + await TodoList.create({name: req.body.todoList, ownerId: req.user.id}) + console.log('Todo List has been created!') + res.redirect('/todos') }catch(err){ console.log(err) } }, createTodo: async (req, res)=>{ try{ - await Todo.create({todo: req.body.todoItem, completed: false, userId: req.user.id}) + await Todo.create({todo: req.body.todoItem, completed: false, userId: req.user.id, todoListId: req.params.listId}) console.log('Todo has been added!') res.redirect('/todos') }catch(err){ @@ -51,5 +62,22 @@ module.exports = { }catch(err){ console.log(err) } - } + }, + deleteList: async (req, res)=>{ + try{ + let list = await TodoList.findById({_id: req.params.id}); + let todosInList = await Todo.countDocuments({todoListId: req.params.id}) + if(todosInList > 0){ + console.log("Can't delete List - Todos still in list") + res.redirect("/todos") + }else{ + await TodoList.remove({_id: req.params.id}); + console.log("List Deleted"); + res.redirect("/todos"); + } + }catch(err){ + console.log(err) + res.redirect("/todos"); + } + }, } \ No newline at end of file diff --git a/models/Todo.js b/models/Todo.js index 8698f6900..fbf11271f 100644 --- a/models/Todo.js +++ b/models/Todo.js @@ -12,7 +12,11 @@ const TodoSchema = new mongoose.Schema({ userId: { type: String, required: true + }, + todoListId:{ + type: mongoose.Schema.Types.ObjectId, + ref: "TodoList", } -}) +}); module.exports = mongoose.model('Todo', TodoSchema) diff --git a/models/TodoList.js b/models/TodoList.js new file mode 100644 index 000000000..9425bc3e3 --- /dev/null +++ b/models/TodoList.js @@ -0,0 +1,14 @@ +const mongoose = require('mongoose') + +const TodoListSchema = new mongoose.Schema({ + name: { + type: String, + required: true, + }, + ownerId: { + type: mongoose.Schema.Types.ObjectId, + ref: "User" + } +}) + +module.exports = mongoose.model('TodoList', TodoListSchema) diff --git a/package-lock.json b/package-lock.json index f5d8debf0..6445810d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "express": "^4.17.1", "express-flash": "^0.0.2", "express-session": "^1.17.1", + "method-override": "^3.0.0", "mongodb": "^3.6.5", "mongoose": "^5.12.3", "morgan": "^1.10.0", @@ -1030,6 +1031,28 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "node_modules/method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "dependencies": { + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/method-override/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -2716,6 +2739,27 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "requires": { + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", diff --git a/package.json b/package.json index 8c294b38a..9c45c4a92 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "express": "^4.17.1", "express-flash": "^0.0.2", "express-session": "^1.17.1", + "method-override": "^3.0.0", "mongodb": "^3.6.5", "mongoose": "^5.12.3", "morgan": "^1.10.0", diff --git a/routes/todos.js b/routes/todos.js index 03dcf42e4..9aee9c66e 100644 --- a/routes/todos.js +++ b/routes/todos.js @@ -5,7 +5,9 @@ const { ensureAuth } = require('../middleware/auth') router.get('/', ensureAuth, todosController.getTodos) -router.post('/createTodo', todosController.createTodo) +router.post('/createTodo/:listId', todosController.createTodo) + +router.post('/createList', todosController.createList) router.put('/markComplete', todosController.markComplete) @@ -13,4 +15,7 @@ router.put('/markIncomplete', todosController.markIncomplete) router.delete('/deleteTodo', todosController.deleteTodo) +router.delete('/deleteList/:id', todosController.deleteList) + + module.exports = router \ No newline at end of file diff --git a/server.js b/server.js index b031c4cad..f6ad26fb9 100644 --- a/server.js +++ b/server.js @@ -9,6 +9,7 @@ const logger = require('morgan') const connectDB = require('./config/database') const mainRoutes = require('./routes/main') const todoRoutes = require('./routes/todos') +const methodOverride = require("method-override"); require('dotenv').config({path: './config/.env'}) @@ -37,7 +38,11 @@ app.use(passport.initialize()) app.use(passport.session()) app.use(flash()) - + +//Use forms for put / delete +app.use(methodOverride("_method")); + +//Routes app.use('/', mainRoutes) app.use('/todos', todoRoutes) diff --git a/views/todos.ejs b/views/todos.ejs index d76747a08..7e187d222 100644 --- a/views/todos.ejs +++ b/views/todos.ejs @@ -9,22 +9,40 @@