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.

512 lines
22 KiB

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