forked from hulyak/todolist
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
204 lines (182 loc) · 5.4 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
// jshint esversion:6
const express = require('express');
const bodyParser = require('body-parser');
const _ = require("lodash");
//require mongoose
const mongoose = require('mongoose');
//current directory
// const date = require(__dirname + "/date.js");
const app = express();
//set up body parser for post method
app.use(
bodyParser.urlencoded({
extended: true,
})
);
app.use(bodyParser.json());
//serve up static files
app.use(express.static('public'));
// set up ejs as a view engine
app.set('view engine', 'ejs');
//store in the collection
//use mongoose instead
// const items = ["Buy food", "Cook food", "Eat food"];
// const workItems = [];
//create a new db inside mongodb; connect to url where mongodb is hosted locally and name of the database(todolistDB)
//mongodb://localhost:27017
mongoose.connect('mongodb+srv://admin:[email protected]/todolistDB', {
useUnifiedTopology: true,
useNewUrlParser: true,
});
//create a new items schema
const itemsSchema = {
name: String,
};
//create a new Mongoose model based on the schema
const Item = mongoose.model('Item', itemsSchema);
//create 3 new documents
const item1 = new Item({
name: 'Todo list',
});
const item2 = new Item({
name: 'Hit the + button to add a new item',
});
const item3 = new Item({
name: '<-- Hit this to delete an item.',
});
const defaultItems = [item1, item2, item3];
//for dynamic routes /work /home, create new schema
const listSchema = {
name: String,
items: [itemsSchema],
};
//List model, create new list documents based off model
const List = mongoose.model('List', listSchema);
app.get('/', (req, res) => {
// const day = date.getDate();
// render list.ejs file with passing two variables one is from ejs one from app.js
// res.render("list", {
// listTitle: day,
// newListItems: items
// });
//find all {} condition mongoose
//this causes to add same items for every time program starts
//check if the items collection has empty add defaults, if not don't add to the root route
//clear out/delete database db.dropDatabase()
//find gives an array back as a result
Item.find({}, function(err, foundItems) {
console.log(foundItems);
// it should be empty, insertMany will not add items again
if (foundItems.length === 0) {
Item.insertMany(defaultItems, function(err) {
if (err) {
console.log(err);
} else {
console.log('Successfully saved default items to DB');
}
});
//redirect root route, and go to else
res.redirect('/');
} else {
//pass over the items that are inside items collection
res.render('list', { listTitle: 'Today', newListItems: foundItems });
}
});
});
//item exists when user types sth
app.post('/', (req, res) => {
const itemName = req.body.newItem;
const listName = req.body.list;
// if (req.body.list === "Work"){
// workItems.push(itemName);
// res.redirect("/work");
// }else{
// console.log(itemName);
// render new list item
// items.push(itemName);
// triggers get route
// res.redirect("/");
// }
//for mongoose, create a new item document
const item = new Item({
name: itemName,
});
if (listName === 'Today') {
item.save(); //save the new todo item entered by user to the db
res.redirect('/'); //show up in the page under default todos
} else {
//customlist
List.findOne({ name: listName }, function(err, foundList) {
foundList.items.push(item);
foundList.save();
res.redirect('/' + listName); //direct the user's route
});
}
});
//delete todos with mongoose findByIdAndRemove() add callback
app.post('/delete', function(req, res) {
const checkedItemId = req.body.checkbox;
const listName = req.body.listName;
if (listName === 'Today') {
Item.findByIdAndRemove(checkedItemId, function(err) {
if (!err) {
console.log('Successfully deleted checked item.');
res.redirect('/');
}
});
} else {
//custom list
List.findOneAndUpdate(
{ name: listName },
{ $pull: { items: { _id: checkedItemId } } }, //from items array
function(err, foundList) {
if (!err) {
res.redirect('/' + listName);
}
}
);
}
});
// work todo list
// app.get('/work', (req, res) => {
// res.render('list', { listTitle: 'Work list', newListItems: workItems });
// });
//dynamic route parameters with express
app.get('/:customListName', function(req, res) {
const customListName = _.capitalize(req.params.customListName); //lodash
List.findOne({ name: customListName }, function(err, foundList) {
if (!err) {
if (!foundList) {
//create a new list, use List model
const list = new List({
name: customListName, //whatever the user types
items: defaultItems,
});
list.save(); //save to list collection
res.redirect('/' + customListName);
} else {
//show an existing list
res.render('list', {
listTitle: foundList.name, //dynamic
newListItems: foundList.items,
});
}
}
});
});
app.post('/work', (req, res) => {
let item = req.body.newItem;
workItems.push(item);
res.redirect('/work');
});
// about page
// app.get('/about', (req, res) => {
// res.render('about');
// });
let port = process.env.PORT;
if (port == null || port == "") {
port = 3000;
}
app.listen(port, () => {
console.log('Server has started');
});