-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
165 lines (139 loc) · 4.91 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
const mongoose = require('mongoose');
const express = require('express');
const bodyParser = require('body-parser');
const _ = require('lodash');
const dotenv = require('dotenv');
dotenv.config();
// O body-parser atribui o valor para a variável pegando o value do elemento que possui o name, o qual está dentro de um form.
// const {variável} = req.body.{name:value};
// date() agora executa a função getDate() do módulo date.js
// console.log(date);
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
/* Especifica para o express para servir o folder public, o qual contém CSS */
app.use(express.static("public"));
/* Especifica ao Express quais arquivos de modelo renderizar. No caso os ejs. */
/* O método res.render() utiliza o 'view engine' para renderizar páginas. */
/* Por padrão o 'view engine' irá olhar a pasta 'views' para renderizar a página. */
app.set('view engine', 'ejs');
// Conecta/Cria o DB todolistDB
mongoose.connect(process.env.MONGO_URL, { useNewURLParser: true });
// Schema é como se fosse o molde para determinado item ser criado.
const itemsSchema = new mongoose.Schema({
name: {
type: String,
required: true
}
});
// A collection será items
const Item = mongoose.model('Item', itemsSchema);
const item1 = new Item({
name: "Organize room"
});
const item2 = new Item({
name: "Check passage"
});
const item3 = new Item({
name: "Practice focus methods"
});
const defaultItems = [item1, item2, item3];
const listSchema = {
name: String,
items: [itemsSchema]
};
// A collection será lists
const List = mongoose.model("List", listSchema);
// Rotas
app.get("/", function (req, res) {
Item.find({}, function (err, foundItems) {
if (err) {
console.log(err);
} else {
if (foundItems.length === 0) {
Item.insertMany(defaultItems, function (err) {
if (err) {
console.log(err);
} else {
console.log("Default items added successfully!");
}
});
res.redirect("/");
} else {
res.render('list', { listTitle: "Today", newListItems: foundItems });
}
}
});
});
app.get("/:customList", (req, res) => {
// req.params.customList -> Parâmetro customList da requisição ao endereço.
const customListName = _.capitalize(req.params.customList);
console.log("Moved to " + customListName + " list");
// Procura por uma lista já existente.
// Existe: Redireciona para ela.
// Não existe: cria a lista, salva(atualiza) e redireciona.
List.findOne({ name: customListName }, function (err, foundList) {
if (!err) {
if (!foundList) {
const list = new List({
name: customListName,
items: defaultItems
});
list.save();
res.redirect("/" + customListName);
} else {
res.render('list', { listTitle: foundList.name, newListItems: foundList.items });
}
} else {
console.log(err);
};
});
});
// Realizado através do botão + ou Enter
app.post("/", function (req, res) {
// Pega o valor do elemento de name newItem dentro do form no submit
const itemName = req.body.newItem;
// Pega o valor do elemento de name list dentro do form no submit
const listName = req.body.list;
const item = new Item({
name: itemName
});
if (listName === "Today") {
item.save();
res.redirect('/');
} else {
List.findOne({ name: listName }, function (err, foundList) {
foundList.items.push(item);
foundList.save();
res.redirect('/' + listName);
});
};
console.log("Added " + itemName + " to " + listName + " list");
});
// Executado quando o usuário clica no checkbox
app.post("/delete", function (req, res) {
const checkedItemId = req.body.checkbox;
const listName = req.body.listName;
if (listName === 'Today') {
Item.findByIdAndDelete(checkedItemId, function (err) {
if (!err) {
console.log("Item removed from To do list");
res.redirect('/');
} else {
console.log(err);
}
});
} else {
// Primeiro encontra a lista e $pull em items encontra o item com a id a ser removido. Callback function.
List.findOneAndUpdate({ name: listName }, { $pull: { items: { _id: checkedItemId } } }, function (err, foundList) {
if (!err) {
console.log("Item removed from " + listName + " list");
res.redirect('/' + listName);
} else {
console.log(err);
};
});
};
});
app.get("/about", function (req, res) {
res.render("about");
});