You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

602 lines
24 KiB

  1. var config = require('../config');
  2. var pageSize = config.pageSize;
  3. var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens
  4. var express = require("express");
  5. var app = express();
  6. app.set('superSecret', config.secret); // secret variable
  7. var crypto = require('crypto');
  8. var request = require('request');
  9. //data models
  10. var mongoose = require('mongoose');
  11. var adminModel = mongoose.model('adminModel');
  12. var userModel = mongoose.model('userModel');
  13. var userController = require('../controllers/userController');
  14. var notificationModel = mongoose.model('notificationModel');
  15. var travelModel = mongoose.model('travelModel');
  16. var travelCtrl = require('../controllers/travelController');
  17. //POST - Insert a new User in the DB
  18. /*exports.signup = function(req, res) {
  19. var admin = new adminModel({
  20. username: req.body.username,
  21. password: crypto.createHash('sha256').update(req.body.password).digest('base64'),
  22. email: req.body.email,
  23. phone: req.body.phone,
  24. telegram: req.body.telegram
  25. });
  26. if (admin.username == undefined) {
  27. return res.status(500).jsonp("empty inputs");
  28. } else if (admin.password == undefined) {
  29. return res.status(500).jsonp("empty inputs");
  30. } else if (admin.email == undefined) {
  31. return res.status(500).jsonp("empty inputs");
  32. }
  33. adminPasswordGetted = crypto.createHash('sha256').update(req.body.adminPassword).digest('base64');
  34. console.log(adminPasswordGetted);
  35. console.log(adminConfig.passwordHash);
  36. if (adminPasswordGetted != adminConfig.passwordHash) {
  37. return res.status(500).jsonp("admin password not valid");
  38. }
  39. admin.save(function(err, admin) {
  40. if (err) return res.send(500, err.message);
  41. exports.login(req, res);
  42. });
  43. };*/
  44. //POST - auth user
  45. exports.login = function(req, res) {
  46. // find the user
  47. adminModel.findOne({
  48. username: req.body.username
  49. })
  50. .select('+password')
  51. .exec(function(err, user) {
  52. if (err) throw err;
  53. if (!user) {
  54. res.json({
  55. success: false,
  56. message: 'Authentication failed. User not found.'
  57. });
  58. } else if (user) {
  59. req.body.password = crypto.createHash('sha256').update(req.body.password).digest('base64');
  60. // check if password matches
  61. if (user.password != req.body.password) {
  62. res.json({
  63. success: false,
  64. message: 'Authentication failed. Wrong password.'
  65. });
  66. } else {
  67. // if user is found and password is right
  68. // create a token
  69. var token = jwt.sign({
  70. foo: 'bar'
  71. }, app.get('superSecret'), {
  72. //expiresInMinutes: 1440 // expires in 24 hours
  73. //expiresIn: '60m'
  74. });
  75. user.token = token;
  76. user.save(function(err, user) {
  77. if (err) return res.send(500, err.message);
  78. //res.status(200).jsonp(travel);
  79. console.log(user);
  80. // return the information including token as JSON
  81. user.password = "";
  82. res.json({
  83. success: true,
  84. message: 'Enjoy your token!',
  85. token: token,
  86. user: user
  87. });
  88. });
  89. }
  90. }
  91. });
  92. };
  93. exports.getAllAdmins = function(req, res) {
  94. adminModel.find()
  95. .limit(pageSize)
  96. .skip(pageSize * Number(req.query.page))
  97. .exec(function(err, admins) {
  98. if (err) return res.send(500, err.message);
  99. res.status(200).jsonp(admins);
  100. });
  101. };
  102. exports.changePassword = function(req, res) {
  103. //if(req.body.)
  104. userModel.update({
  105. 'token': req.headers['x-access-token']
  106. }, req.body,
  107. function(err) {
  108. if (err) return console.log(err);
  109. exports.getUserByToken(req, res);
  110. });
  111. };
  112. exports.deleteTravel = function(req, res) {
  113. adminModel.findOne({
  114. 'token': req.headers['x-access-token']
  115. })
  116. .exec(function(err, admin) {
  117. if (!admin) {
  118. res.json({
  119. success: false,
  120. message: 'Admin not found'
  121. });
  122. } else if (admin) {
  123. if (err) return res.send(500, err.message);
  124. travelModel.findById(req.params.travelid, function(err, travel) {
  125. if (err) return res.send(500, err.message);
  126. //add notification to the user who has created the travel
  127. userModel.findOne({
  128. _id: travel.user
  129. })
  130. .exec(function(err, user) {
  131. if (err) return res.send(500, err.message);
  132. if (!user) {
  133. //console.log("Notification not posible, user owner of the travel not exist");
  134. } else if (user) {
  135. var notification = new notificationModel({
  136. concept: "admin",
  137. message: "an admin has deleted your travel: " + travel.title,
  138. date: new Date(),
  139. icon: 'admin',
  140. link: "users/" + user._id,
  141. user: user._id
  142. });
  143. notification.save(function(err, notification) {
  144. if (err) return res.send(500, err.message);
  145. user.notifications.push(notification._id);
  146. user.save(function(err, user) {
  147. if (err) return res.send(500, err.message);
  148. //notification added to user
  149. });
  150. });
  151. }
  152. });
  153. travel.remove(function(err) {
  154. if (err) return res.send(500, err.message);
  155. travelCtrl.getAllTravels(req, res);
  156. });
  157. });
  158. }
  159. });
  160. };
  161. exports.deleteUser = function(req, res) {
  162. adminModel.findOne({
  163. 'token': req.headers['x-access-token']
  164. })
  165. .exec(function(err, admin) {
  166. if (!admin) {
  167. res.json({
  168. success: false,
  169. message: 'Admin not found'
  170. });
  171. } else if (admin) {
  172. if (err) return res.send(500, err.message);
  173. userModel.findOne({
  174. _id: req.params.userid
  175. })
  176. .exec(function(err, user) {
  177. if (err) return res.send(500, err.message);
  178. if (!user) {
  179. res.json({
  180. success: false,
  181. message: 'Delete user not posible, user not exist'
  182. });
  183. } else if (user) {
  184. //delete all the travels of this user
  185. travelModel.find({
  186. user: user._id
  187. }).remove().exec(function(err, data) {});
  188. //delete all the comments of this user
  189. //now delete user
  190. user.remove(function(err) {
  191. if (err) return res.send(500, err.message);
  192. res.status(200).jsonp("deleted");
  193. });
  194. }
  195. });
  196. }
  197. });
  198. };
  199. function isNodeInNodes(node, nodes) {
  200. for (var i = 0; i < nodes.length; i++) {
  201. if (node.title == nodes[i].title) {
  202. return (i);
  203. }
  204. }
  205. return (-1);
  206. }
  207. exports.network = function(req, res) {
  208. adminModel.findOne({
  209. 'token': req.headers['x-access-token']
  210. })
  211. .exec(function(err, admin) {
  212. if (!admin) {
  213. res.json({
  214. success: false,
  215. message: 'Admin not found'
  216. });
  217. } else if (admin) {
  218. if (err) return res.send(500, err.message);
  219. userModel.find()
  220. .limit(pageSize)
  221. .skip(pageSize * Number(req.query.page))
  222. .lean()
  223. //.populate({path: 'travels', populate: {path: 'joins', populate: {path: 'username'}}})
  224. .populate('travels', 'title type joins')
  225. .populate('likes', 'username avatar')
  226. .exec(function(err, users) {
  227. if (err) return res.send(500, err.message);
  228. /*res.status(200).jsonp(users);*/
  229. var nodes = [];
  230. var edges = [];
  231. for (var i = 0; i < users.length; i++) {
  232. var node = {
  233. title: users[i].username,
  234. label: users[i].username,
  235. image: users[i].avatar,
  236. shape: "image",
  237. id: users[i]._id,
  238. group: users[i]._id
  239. };
  240. var lNode = isNodeInNodes(node, nodes);
  241. if (lNode < 0) {
  242. nodes.push(node);
  243. var uNode = nodes.length - 1;
  244. }
  245. for (var j = 0; j < users[i].likes.length; j++) {
  246. /*console.log(i + ", " + j);
  247. console.log(nodes);*/
  248. var node = {
  249. title: users[i].likes[j].username,
  250. label: users[i].likes[j].username,
  251. image: users[i].likes[j].avatar,
  252. shape: "image",
  253. id: users[i].likes[j]._id
  254. };
  255. var lNode = isNodeInNodes(node, nodes);
  256. if (lNode < 0) {
  257. //node no exist
  258. nodes.push(node);
  259. lNode = nodes.length - 1;
  260. } else {
  261. //node already exist
  262. }
  263. var edge = {
  264. from: users[i]._id,
  265. to: users[i].likes[j]._id,
  266. label: "like",
  267. arrows: "to",
  268. color: {
  269. color: "#E57373" //red300
  270. }
  271. };
  272. edges.push(edge);
  273. }
  274. for (var j = 0; j < users[i].travels.length; j++) {
  275. /*console.log(i + ", " + j);
  276. console.log(nodes);*/
  277. var node = {
  278. title: users[i].travels[j].title,
  279. label: users[i].travels[j].title,
  280. image: "img/" + users[i].travels[j].type + ".png",
  281. shape: "image",
  282. id: users[i].travels[j]._id,
  283. value: "0.5",
  284. group: users[i]._id
  285. };
  286. var lNode = isNodeInNodes(node, nodes);
  287. if (lNode < 0) {
  288. //node no exist
  289. nodes.push(node);
  290. lNode = nodes.length - 1;
  291. } else {
  292. //node already exist
  293. }
  294. var edge = {
  295. from: users[i]._id,
  296. to: users[i].travels[j]._id,
  297. color: {
  298. color: "#616161" //grey
  299. }
  300. };
  301. edges.push(edge);
  302. //users joining travels
  303. /*for(var k=0; k<users[i].travels[j].joins.length; k++){
  304. var node = {
  305. title: users[i].travels[j].joins[k].username,
  306. label: users[i].travels[j].joins[k].username,
  307. image: users[i].travels[j].joins[k].avatar,
  308. shape: "image",
  309. id: users[i].travels[j].joins[k]._id
  310. };
  311. var lNode = isNodeInNodes(node, nodes);
  312. if (lNode<0){
  313. //node no exist
  314. nodes.push(node);
  315. lNode = nodes.length -1;
  316. }
  317. var edge={
  318. from: users[i].travels[j].joins[k]._id,
  319. to: users[i].travels[j]._id,
  320. color: {
  321. color: "#4DD0E1"//cyan300
  322. }
  323. };
  324. edges.push(edge);
  325. }*/
  326. }
  327. }
  328. var resp = {
  329. nodes: nodes,
  330. edges: edges
  331. };
  332. res.status(200).jsonp(resp);
  333. });
  334. }
  335. });
  336. };
  337. exports.getUserNetwork = function(req, res) {
  338. adminModel.findOne({
  339. 'token': req.headers['x-access-token']
  340. })
  341. .exec(function(err, admin) {
  342. if (!admin) {
  343. res.json({
  344. success: false,
  345. message: 'Admin not found'
  346. });
  347. } else if (admin) {
  348. if (err) return res.send(500, err.message);
  349. userModel.findOne({
  350. _id: req.params.userid
  351. })
  352. .lean()
  353. .populate('travels', 'title type joins')
  354. .populate('likes', 'username avatar')
  355. .exec(function(err, user) {
  356. if (err) return res.send(500, err.message);
  357. /*res.status(200).jsonp(users);*/
  358. var nodes = [];
  359. var edges = [];
  360. //for (var i = 0; i < users.length; i++) {
  361. var node = {
  362. title: user.username,
  363. label: user.username,
  364. image: user.avatar,
  365. shape: "image",
  366. id: user._id,
  367. group: user._id
  368. };
  369. var lNode = isNodeInNodes(node, nodes);
  370. if (lNode < 0) {
  371. nodes.push(node);
  372. var uNode = nodes.length - 1;
  373. }
  374. for (var j = 0; j < user.likes.length; j++) {
  375. /*console.log(i + ", " + j);
  376. console.log(nodes);*/
  377. var node = {
  378. title: user.likes[j].username,
  379. label: user.likes[j].username,
  380. image: user.likes[j].avatar,
  381. shape: "image",
  382. id: user.likes[j]._id
  383. };
  384. var lNode = isNodeInNodes(node, nodes);
  385. if (lNode < 0) {
  386. //node no exist
  387. nodes.push(node);
  388. lNode = nodes.length - 1;
  389. } else {
  390. //node already exist
  391. }
  392. var edge = {
  393. from: user._id,
  394. to: user.likes[j]._id,
  395. label: "like",
  396. arrows: "to",
  397. color: {
  398. color: "#E57373" //red300
  399. }
  400. };
  401. edges.push(edge);
  402. }
  403. for (var j = 0; j < user.travels.length; j++) {
  404. /*console.log(i + ", " + j);
  405. console.log(nodes);*/
  406. var node = {
  407. title: user.travels[j].title,
  408. label: user.travels[j].title,
  409. image: "img/" + user.travels[j].type + ".png",
  410. shape: "image",
  411. id: user.travels[j]._id,
  412. value: "0.5",
  413. group: user._id
  414. };
  415. var lNode = isNodeInNodes(node, nodes);
  416. if (lNode < 0) {
  417. //node no exist
  418. nodes.push(node);
  419. lNode = nodes.length - 1;
  420. } else {
  421. //node already exist
  422. }
  423. var edge = {
  424. from: user._id,
  425. to: user.travels[j]._id,
  426. color: {
  427. color: "#616161" //grey
  428. }
  429. };
  430. edges.push(edge);
  431. }
  432. //add users that has add like to the user
  433. userModel.find({
  434. likes: req.params.userid
  435. })
  436. .exec(function(err, users) {
  437. for (var i = 0; i < users.length; i++) {
  438. /*console.log(i + ", " + j);
  439. console.log(nodes);*/
  440. var node = {
  441. title: users[i].username,
  442. label: users[i].username,
  443. image: users[i].avatar,
  444. shape: "image",
  445. id: users[i]._id
  446. };
  447. var lNode = isNodeInNodes(node, nodes);
  448. if (lNode < 0) {
  449. //node no exist
  450. nodes.push(node);
  451. lNode = nodes.length - 1;
  452. } else {
  453. //node already exist
  454. }
  455. var edge = {
  456. from: users[i]._id,
  457. to: req.params.userid,
  458. label: "like",
  459. arrows: "to",
  460. color: {
  461. color: "#E57373" //red300
  462. }
  463. };
  464. edges.push(edge);
  465. }
  466. var resp = {
  467. nodes: nodes,
  468. edges: edges
  469. };
  470. res.status(200).jsonp(resp);
  471. });
  472. //}
  473. });
  474. }
  475. });
  476. };
  477. // user validation
  478. exports.validateUser = function(req, res) {
  479. adminModel.findOne({
  480. 'token': req.headers['x-access-token']
  481. })
  482. .exec(function(err, admin) {
  483. if (!admin) {
  484. res.json({
  485. success: false,
  486. message: 'Admin not found'
  487. });
  488. } else if (admin) {
  489. if (err) return res.send(500, err.message);
  490. userModel.findOne({
  491. _id: req.params.userid
  492. })
  493. .exec(function(err, user) {
  494. if (err) return res.send(500, err.message);
  495. user.validated = true;
  496. user.validatedBy = admin._id;
  497. var notification = new notificationModel({
  498. concept: "admin",
  499. message: "an admin has validated your account",
  500. date: new Date(),
  501. icon: 'admin',
  502. link: "users/" + user._id,
  503. user: user._id
  504. });
  505. notification.save(function(err, notification) {
  506. if (err) return res.send(500, err.message);
  507. user.notifications.push(notification._id);
  508. user.save(function(err, user) {
  509. if (err) return res.send(500, err.message);
  510. userController.getUserById(req, res);
  511. });
  512. });
  513. });
  514. }
  515. });
  516. };
  517. // user unvalidate
  518. exports.unvalidateUser = function(req, res) {
  519. adminModel.findOne({
  520. 'token': req.headers['x-access-token']
  521. })
  522. .exec(function(err, admin) {
  523. if (!admin) {
  524. res.json({
  525. success: false,
  526. message: 'Admin not found'
  527. });
  528. } else if (admin) {
  529. if (err) return res.send(500, err.message);
  530. userModel.findOne({
  531. _id: req.params.userid
  532. })
  533. .exec(function(err, user) {
  534. if (err) return res.send(500, err.message);
  535. user.validated = false;
  536. user.validatedBy = admin._id;
  537. var notification = new notificationModel({
  538. concept: "admin",
  539. message: "an admin has unvalidated your account",
  540. date: new Date(),
  541. icon: 'admin',
  542. link: "users/" + user._id,
  543. user: user._id
  544. });
  545. notification.save(function(err, notification) {
  546. if (err) return res.send(500, err.message);
  547. user.notifications.push(notification._id);
  548. user.save(function(err, user) {
  549. if (err) return res.send(500, err.message);
  550. userController.getUserById(req, res);
  551. });
  552. });
  553. });
  554. }
  555. });
  556. };