-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathapp.js
197 lines (163 loc) · 4.62 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
const dotenv = require("dotenv")
const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const _ = require("lodash");
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static("public"));
app.set("view engine", "ejs");
// Set up mongoose connection local -- uncomment this if you are using it locally
// mongoose.connect("mongodb://127.0.0.1:27017/todolistDB");
// dotenv
dotenv.config({path:"./config.env"})
// Set up mongoose connection "MongoDB Atlas"
const DB = process.env.DATABASE;
mongoose.connect(DB)
// Mongoose Schema for individual to-do list items
const itemSchema = new mongoose.Schema({
name: {
type: String,
require: true,
},
});
const Item = new mongoose.model("Item", itemSchema);
const item1 = new Item({
name: "Welcome to your TO DO 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];
// Mongoose Schema for custom lists
const listSchema = {
name: String,
items: [itemSchema],
};
const List = mongoose.model("List", listSchema);
// Default route for the home page
app.get("/", function (req, res) {
// Find all items in the collection
Item.find({})
.then((foundItems) => {
if (foundItems.length === 0) {
// Insert default items if the collection is empty
Item.insertMany(defaultItems)
.then(() => {
console.log("Default items inserted");
// Redirect to the home page to display the default items
res.redirect("/");
})
.catch((error) => {
console.log(error);
});
} else {
// Render the home page and pass the found items
res.render("list", { listTitle: "Today", newListItems: foundItems });
}
})
.catch((error) => {
console.log(error);
});
});
// Route for adding new items
app.post("/", function (req, res) {
const itemName = req.body.newItem;
const listName = req.body.list;
// Check if itemName is not an empty string
if (itemName.trim() !== '') {
// Create a new item based on the input
const item = new Item({
name: itemName,
});
if (listName === "Today") {
// Save the item to the default collection
item.save();
res.redirect("/");
} else {
// Find the custom list and push the new item
List.findOne({ name: listName })
.then((foundItems) => {
foundItems.items.push(item);
foundItems.save();
res.redirect("/" + listName);
})
.catch((err) => {
console.log(err);
});
}
} else {
if (listName === "Today") {
res.redirect("/");
} else {
List.findOne({ name: listName })
.then((foundItems) => {
res.redirect("/" + listName);
})
.catch((err) => {
console.log(err);
});
}
}
});
// Route for deleting items
app.post("/delete", function (req, res) {
const listName = req.body.listName;
const checkItemId = req.body.checkbox;
// Delete the item from the default collection
if (listName == "Today") {
deleteCheckedItem();
} else {
// Find the custom list and pull the item from the array
deleteCustomItem();
}
async function deleteCheckedItem() {
await Item.deleteOne({ _id: checkItemId });
res.redirect("/");
}
async function deleteCustomItem() {
await List.findOneAndUpdate(
{ name: listName },
{ $pull: { items: { _id: checkItemId } } }
);
res.redirect("/" + listName);
}
});
// Custom route for dynamic lists
app.get("/:customListName", function (req, res) {
const customListName = _.capitalize(req.params.customListName);
// Find a list with the custom list name
List.findOne({ name: customListName })
.then((foundList) => {
if (!foundList) {
// Create a new list if it doesn't exist
const list = new List({
name: customListName,
items: defaultItems,
});
list.save();
console.log("saved");
res.redirect("/" + customListName);
} else {
// Render the existing custom list
res.render("list", {
listTitle: foundList.name,
newListItems: foundList.items,
});
}
})
.catch((err) => {
console.log(err);
});
});
// About Page
app.get("/about", function (req, res) {
res.render("about");
});
// Start the server at Port 3000
app.listen(3000, function () {
console.log("Server started on port 3000.");
});