· 5 years ago · Jun 15, 2020, 03:14 PM
1/**
2 * Controllers
3 */
4var projectController = require("./data/projectController");
5var authController = require("./data/auth/authController");
6var calculateController = require("./data/calculateController");
7/**
8 * Configuration needed for Express
9 */
10var config = require("./config");
11
12/**
13 * Variables Lodash - Joi - Port instantation - Response - Bcrypt - JWT
14 */
15const _ = require("lodash");
16const Joi = require("joi");
17const port = process.env.PORT || 8081;
18var writeResponse = require("./helpers/response").writeResponse;
19const jwt = require("jsonwebtoken");
20const bcrypt = require("bcryptjs");
21
22const SECRET_KEY = "secretkey23456";
23/**
24 * Project API calls
25 */
26
27//// GET user projects by user id
28config.app.get("/popapi/projects", (req, res) => {
29 projectController.getProjects().then((allProjects) => {
30 res.send(allProjects);
31 });
32});
33
34//// DELETE project
35config.app.delete("/popapi/projects/delete/:projectname/:user_id", (req, res) => {
36 projectController
37 .deleteProject(req.params.projectname, req.params.user_id)
38 .then((resultDeleted) => {
39 res.send(resultDeleted);
40 });
41});
42
43//// GET admin projects by user id
44config.app.get("/popapi/projects/admin/:user_id", (req, res) => {
45 projectController
46 .getAdminProjectsByUserId(req.params.user_id)
47 .then((allProjects) => {
48 res.send(allProjects);
49 });
50});
51
52//// GET user projects by user id
53config.app.get("/popapi/projects/user/:user_id", (req, res) => {
54 projectController
55 .getUserProjectsByUserId(req.params.user_id)
56 .then((allProjects) => {
57 res.send(allProjects);
58 });
59});
60
61// POST sign up project with password
62config.app.post("/popapi/projects/signup", (req, res) => {
63 projectController
64 .signUpForProject(req.body.user_id, req.body.projectname, req.body.password)
65 .then((project) => {
66 res.send(project);
67 });
68});
69
70//// GET specific project membertypes
71config.app.get("/popapi/projects/membertypes/:projectname", (req, res) => {
72 projectController
73 .getProjectMemberTypes(req.params.projectname)
74 .then((allMemberTypes) => {
75 res.send(allMemberTypes);
76 });
77});
78
79//// POST create a new project
80config.app.post("/popapi/projects", (req, res) => {
81 // Joi Validations
82 const {
83 error
84 } = validateProjectParameters(req.body.user_id);
85 if (error) {
86 if (error.details[0].type === "string.regex.base")
87 // RESPONSE 400 IF ERROR
88 res
89 .status(400)
90 .send(
91 "Password must be between 8 - 30 characters long with (capitalized) letters or numbers."
92 );
93 }
94 // Request Body parameters of project
95
96 const project = {
97 user_id: req.body.user_id,
98 projectname: req.body.projectName,
99 passwordAdmin: req.body.passwordAdmin,
100 passwordUser: req.body.passwordUser,
101 maxGroupMembers: req.body.maxGroupMembers,
102 groupName: req.body.groupName,
103 kindOfGroupMembers: req.body.kindOfGroupMembers,
104 totalMembers: req.body.totalMembers,
105 maxAmountGroups: req.body.maxAmountGroups,
106 };
107 // Controller request to send response
108 projectController
109 .createNewProject(
110 project.user_id,
111 project.projectname,
112 project.passwordAdmin,
113 project.passwordUser,
114 project.maxGroupMembers,
115 project.groupName,
116 project.kindOfGroupMembers,
117 project.totalMembers,
118 project.maxAmountGroups
119 )
120 .then((project) => {
121 res.send(project);
122 });
123});
124
125//// POST add new user to specific project
126config.app.post("/popapi/projects/adduser", (req, res) => {
127 (belbinResults = req.body.belbinResults),
128 (duoProfiles = req.body.duoProfiles),
129 (selectedMemberType = req.body.selectedMemberType),
130 (user_id = req.body.user_id),
131 (projectname = req.body.projectname);
132 projectController
133 .addUserToProject(
134 belbinResults,
135 duoProfiles,
136 selectedMemberType,
137 user_id,
138 projectname
139 )
140 .then((project) => {
141 res.send(project);
142 });
143});
144
145//// POST make user admin of specific project
146config.app.post("/popapi/projects/makeadmin", (req, res) => {
147 (user_id = req.body.user_id), (projectname = req.body.projectname);
148 projectController
149 .makeUserAdminOfProject(user_id, projectname)
150 .then((project) => {
151 res.send(project);
152 });
153});
154
155//// GET project related details
156config.app.get("/popapi/projects/:projectname/:user_id", (req, res) => {
157 projectController
158 .getProjectRelatedDetails(req.params.projectname, req.params.user_id)
159 .then((allDetails) => {
160 res.send(allDetails);
161 });
162});
163
164//// DELETE user from project
165config.app.delete("/popapi/projects/:projectname/:user_id", (req, res) => {
166 projectController
167 .deleteUserFromProject(req.params.projectname, req.params.user_id)
168 .then((resultDeleted) => {
169 res.send(resultDeleted);
170 });
171});
172
173/**
174 * Authentication API calls
175 */
176
177// POST register
178config.app.post("/popapi/register", (req, res, next) => {
179 // Get props
180 const user = {
181 /* Auth */
182 username: _.get(req.body, "username"),
183 password: _.get(req.body, "password"),
184 /* Properties */
185 firstname: _.get(req.body, "firstname"),
186 lastname: _.get(req.body, "lastname"),
187 };
188 // Error Validation
189 if (!user.username) {
190 throw {
191 username: "This field is required.",
192 status: 400,
193 };
194 }
195 if (!user.password) {
196 throw {
197 password: "This field is required.",
198 status: 400,
199 };
200 }
201 const pwcrypted = bcrypt.hashSync(user.password);
202 if (!user.firstname) {
203 throw {
204 firstname: "This field is required.",
205 status: 400,
206 };
207 }
208 if (!user.lastname) {
209 throw {
210 lastname: "This field is required.",
211 status: 400,
212 };
213 }
214 const expires_in = 24 * 60 * 60;
215 const accesToken = jwt.sign({
216 id: user.id
217 }, SECRET_KEY, {
218 expiresIn: expires_in,
219 });
220 // Create user with controller
221 authController
222 .createNewUser(
223 user.username,
224 pwcrypted,
225 user.firstname,
226 user.lastname,
227 accesToken,
228 expires_in
229 )
230 .then((user) => writeResponse(res, user, 201))
231 .catch(next);
232});
233
234// POST login
235config.app.post("/popapi/login", (req, res, next) => {
236 // Get props
237 const authUser = {
238 /* Auth */
239 username: _.get(req.body, "username"),
240 password: _.get(req.body, "password"),
241 };
242 // Error Validation
243 if (!authUser.username) {
244 throw {
245 username: "This field is required.",
246 status: 400,
247 };
248 }
249 if (!authUser.password) {
250 throw {
251 password: "This field is required.",
252 status: 400,
253 };
254 }
255 // Check result
256 authController
257 .getUser(authUser.username)
258 .then((user) => {
259 const result = bcrypt.compareSync(authUser.password, user.password);
260 if (!result) {
261 throw {
262 password: "Password not valid!",
263 status: 401,
264 };
265 }
266 })
267 .catch(next);
268 // Create response
269 const expires_in = 24 * 60 * 60;
270 const accessToken = jwt.sign({
271 id: authUser.id
272 }, SECRET_KEY, {
273 expiresIn: expires_in,
274 });
275 // Create user with controller
276 authController
277 .loginUser(authUser.username, authUser.password)
278 .then((user) => {
279 const resp = {
280 id: user.id,
281 username: user.username,
282 firstname: user.firstname,
283 lastname: user.lastname,
284 access_token: accessToken,
285 expires_in: expires_in
286 }
287 writeResponse(res, resp, 200)
288 })
289 .catch(next);
290});
291
292/**
293 * Export groups
294 */
295
296config.app.post("/popapi/projects/addgroups", (req, res) => {
297 // Get props
298 const rezponse = {
299 /* Auth */
300 projectname: _.get(req.body, "projectname"),
301 groups: _.get(req.body, "groups"),
302 lonelyUsers: _.get(req.body, "lonelyUsers"),
303 };
304 // Add groups
305 calculateController
306 .addGroupsToProject(
307 rezponse.projectname,
308 rezponse.groups,
309 rezponse.lonelyUsers
310 )
311 .then((rezult) => {
312 res.send(rezult);
313 });
314});
315
316// Get all grouos
317config.app.get("/popapi/groups/:projectname", (req, res) => {
318 calculateController
319 .getProjectGroups(req.params.projectname)
320 .then((allGroups) => {
321 res.send(allGroups);
322 });
323});
324
325// get alll selections
326config.app.get("/popapi/selections/:groupname", (req, res) => {
327 calculateController.getUsersOfGroup(req.params.groupname).then((allUsers) => {
328 res.send(allUsers);
329 });
330});
331
332//// GET user projects by user id
333config.app.get("/popapi/projects/user/:user_id", (req, res) => {
334 projectController
335 .getUserProjectsByUserId(req.params.user_id)
336 .then((allProjects) => {
337 res.send(allProjects);
338 });
339});
340
341config.app.get("/popapi/projects/:projectname/:user_id", (req, res) => {
342 projectController
343 .getProjectRelatedDetails(req.params.projectname, req.params.user_id)
344 .then((allDetails) => {
345 res.send(allDetails);
346 });
347});
348
349/**
350 * Validation methods
351 */
352
353// Validate project
354function validateProjectParameters(project) {
355 // Joi schema for validation of body request
356 const schema = {
357 projectname: Joi.string().min(2).required(),
358 passwordAdmin: Joi.string()
359 .regex(/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/)
360 .required(),
361 passwordUser: Joi.string()
362 .regex(/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/)
363 .required(),
364 };
365 // Create results of joi
366 return Joi.validate(project, schema);
367}
368
369// Make express server listen to port 8081
370var server = config.app.listen(port, () =>
371 console.log(`Listening on ${port}...`)
372);
373
374// Socket setup
375// var io = config.socket(server);
376
377// io.on("connection", function (socket) {
378// console.log("Socket connected");
379
380// // Update projects of user
381// // New user signed up for a project
382// socket.on("newActiveUserToProject", function (data) {
383// // Commit to user's projects
384// io.sockets.emit("projectsUpdated");
385// });
386// // User deleted from project, update active members
387// socket.on("userDeletedFromProject", function () {
388// io.sockets.emit("projectsUpdated");
389// });
390
391// // Calculate started
392// socket.on("calculateProjectGroups", function (data) {
393// // Calculate users not in group en set as relation ship property
394// calculateController
395// .setUsersNotInGroup(data.projectname)
396// .then(allUsersNotInGroup => {
397// // Al deze users meegeven ...
398// calculateController
399// .setCountGroupsOfProject(data.projectname)
400// .then(resultAmounts => {
401// // countGroups is aantal
402// io.sockets.emit("calculateGroups", {
403// allUsersNotInGroup: allUsersNotInGroup,
404// resultAmounts: resultAmounts
405// });
406// });
407// });
408// });
409// });