-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
187 lines (168 loc) · 5.48 KB
/
index.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
// Import packages:
const express = require("express");
const session = require("express-session");
const bodyParser = require("body-parser");
const mongo = require("mongodb").MongoClient;
const slug = require("slug");
const app = express();
require("dotenv").config();
//Setting the global variables:
const DB_PORT = process.env.PORT || process.env.DB_PORT;
const DB_HOST = process.env.DB_HOST;
const DB_NAME = process.env.DB_NAME;
let url = DB_HOST + ":" + DB_PORT;
let db = null;
//This will be the variable taken from the login
//in the total dating app:
let idThisUser = 1;
//Connecting to the database:
mongo.connect(url, {
useUnifiedTopology: true
}, connectDB);
//Setting and using the middleware:
app.set("view engine", "ejs");
app.set("views", "view-ejs");
app.use(express.static("static"));
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(session({
secret: process.env.SESSION_SECRET,
resave: true,
saveUninitialized: true,
}));
//Getting all the paths and calling the functions:
app.get("/", home);
app.get("/filters", filters);
app.post("/", postPreferences);
app.get("/*", error);
//Listen to the server:
app.listen(DB_PORT, connected);
async function connectDB(err, client) {
//Makes a connection to the database and logs if database
// is connected.
try {
db = await client.db(DB_NAME);
console.log("Database is connected...");
} catch {
console.log(err);
}
};
async function home(req, res, next) {
//Shows the index page with the filtered users and stores this
//user's preferences as a session.
try {
const datingUsers = await db.collection("datingUsers").find().toArray();
let usersWithoutOwn = datingUsers.filter(removeOwn);
let thisUser = datingUsers.filter(getOwn);
req.session.gender = thisUser[0].prefGender;
req.session.movie = thisUser[0].prefMovies;
let filtered = await checkGenderPref(usersWithoutOwn, thisUser);
res.render("index.ejs", {
users: filtered
});
} catch (err) {
next(err);
}
}
function removeOwn(user) {
//Returns all users who do not have the same ID as this user's ID:
return user.id !== idThisUser;
}
function getOwn(user) {
//Returns the user whose ID is the same as this user's ID:
return user.id === idThisUser;
}
// function testFilter(users, loggedIn) {
// //Filters the users by gender and movie preferences and returns
// //a boolean if the conditions are correct for both sides:
// return users.filter(function (user) {
// if ((loggedIn[0].prefGender === user.gender && loggedIn[0].gender === user.prefGender)
// || (user.prefGender === "everyone" && loggedIn[0].prefGender === "everyone")
// || (user.prefGender === "everyone" && user.gender === loggedIn[0].prefGender)
// || (loggedIn[0].prefGender === "everyone" && user.prefGender === loggedIn[0].gender)) {
// if (loggedIn[0].prefMovies === "") {
// return true;
// } else if (loggedIn[0].prefMovies !== "") {
// return user.movies.find(function (movie){
// return movie === loggedIn[0].prefMovies;
// });
// }
// }
// })
// }
function checkGenderPref(users, loggedIn) {
//Filters the users by gender and movie preferences and returns
//a boolean if the conditions are correct for both sides:
return users.filter(function (user) {
if (loggedIn[0].prefGender === user.gender && loggedIn[0].gender === user.prefGender) {
return checkMoviePref(user, loggedIn);
} else if (user.prefGender === "everyone" && loggedIn[0].prefGender === "everyone") {
return checkMoviePref(user, loggedIn);
} else if (user.prefGender === "everyone" && user.gender === loggedIn[0].prefGender) {
return checkMoviePref(user, loggedIn);
} else if (loggedIn[0].prefGender === "everyone" && user.prefGender === loggedIn[0].gender) {
return checkMoviePref(user, loggedIn);
}
})
}
function checkMoviePref(user, loggedIn) {
//Filters the users by gender and movie preferences and returns
//a boolean if the conditions are correct for both sides:
if (loggedIn[0].prefMovies === "") {
return true;
} else if (loggedIn[0].prefMovies !== "") {
return user.movies.find(function (movie) {
return movie === loggedIn[0].prefMovies;
});
}
}
function filters(req, res) {
//Displays the filter page:
res.render("filters", {
gender: req.session.gender,
movie: req.session.movie
});
}
async function postPreferences(req, res, next) {
//Retrieves the entered preferences and sends them to the
//updatePreferences function. After this the index page is
//redirected again:
try {
//console.log(req.body.remove);
if (req.body.remove) {
req.session.destroy();
await updatePreferences("everyone", "");
} else {
let genderPreference = slug(req.body.gender);
let moviePreference = slug(req.body.movies);
await updatePreferences(genderPreference, moviePreference);
}
res.redirect("/");
} catch (err) {
next(err);
}
}
async function updatePreferences(genderPreference, moviePreference) {
//Updates the database with the new preferences from the form:
try {
await db.collection("datingUsers").updateOne({
id: idThisUser
}, {
$set: {
prefGender: genderPreference,
prefMovies: moviePreference
}
});
} catch {
next(err);
}
}
function error(req, res) {
//Displays the error page:
res.status(404).render("404");
};
function connected() {
//Server listening on given port:
console.log(`Server is listening on port ${DB_PORT}`);
}