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.

480 lines
16 KiB

7 years ago
7 years ago
7 years ago
7 years ago
  1. //File: controllers/userController.js
  2. var mongoose = require('mongoose');
  3. var userModel = mongoose.model('userModel');
  4. var notificationModel = mongoose.model('notificationModel');
  5. var travelModel = mongoose.model('travelModel');
  6. /* */
  7. var jwt = require('jsonwebtoken'); // used to create, sign, and verify tokens
  8. var express = require("express");
  9. var app = express();
  10. var config = require('../config'); // get our config file
  11. app.set('superSecret', config.secret); // secret variable
  12. var crypto = require('crypto');
  13. /* */
  14. var request = require('request');
  15. //POST - Insert a new User in the DB
  16. exports.signup = function(req, res) {
  17. var user = new userModel({
  18. username: req.body.username,
  19. password: crypto.createHash('sha256').update(req.body.password).digest('base64'),
  20. description: req.body.description,
  21. avatar: req.body.avatar,
  22. email: req.body.email,
  23. phone: req.body.phone,
  24. telegram: req.body.telegram
  25. });
  26. if (user.username == undefined) {
  27. return res.status(500).jsonp("empty inputs");
  28. } else if (user.password == undefined) {
  29. return res.status(500).jsonp("empty inputs");
  30. } else if (user.email == undefined) {
  31. return res.status(500).jsonp("empty inputs");
  32. }
  33. user.save(function(err, user) {
  34. if (err) return res.send(500, err.message);
  35. exports.login(req, res);
  36. });
  37. };
  38. //POST - auth user
  39. exports.login = function(req, res) {
  40. // find the user
  41. userModel.findOne({
  42. username: req.body.username
  43. })
  44. .select('+password')
  45. .exec(function(err, user) {
  46. if (err) throw err;
  47. if (!user) {
  48. res.json({
  49. success: false,
  50. message: 'Authentication failed. User not found.'
  51. });
  52. } else if (user) {
  53. req.body.password = crypto.createHash('sha256').update(req.body.password).digest('base64');
  54. // check if password matches
  55. if (user.password != req.body.password) {
  56. res.json({
  57. success: false,
  58. message: 'Authentication failed. Wrong password.'
  59. });
  60. } else {
  61. // if user is found and password is right
  62. // create a token
  63. var token = jwt.sign({
  64. foo: 'bar'
  65. }, app.get('superSecret'), {
  66. //expiresInMinutes: 1440 // expires in 24 hours
  67. //expiresIn: '60m'
  68. });
  69. user.token = token;
  70. user.save(function(err, user) {
  71. if (err) return res.send(500, err.message);
  72. //res.status(200).jsonp(travel);
  73. console.log(user);
  74. // return the information including token as JSON
  75. user.password = "";
  76. res.json({
  77. success: true,
  78. message: 'Enjoy your token!',
  79. token: token,
  80. user: user
  81. });
  82. });
  83. }
  84. }
  85. });
  86. };
  87. //GET - Return all Users in the DB
  88. exports.getAllUsers = function(req, res) {
  89. userModel.find()
  90. .limit(Number(req.query.pageSize))
  91. .skip(Number(req.query.pageSize) * Number(req.query.page))
  92. .exec(function(err, users) {
  93. if (err) return res.send(500, err.message);
  94. res.status(200).jsonp(users);
  95. });
  96. };
  97. exports.getUserById = function(req, res) {
  98. userModel.findOne({
  99. _id: req.params.userid
  100. })
  101. .lean()
  102. .populate('travels', 'title from to date type')
  103. .exec(function(err, user) {
  104. if (err) return res.send(500, err.message);
  105. if (!user) {
  106. res.json({
  107. success: false,
  108. message: 'User not found.'
  109. });
  110. } else if (user) {
  111. res.status(200).jsonp(user);
  112. }
  113. });
  114. };
  115. exports.getUserByToken = function(req, res) {
  116. userModel.findOne({
  117. 'token': req.headers['x-access-token']
  118. })
  119. .lean()
  120. .populate('travels', 'title from to date')
  121. .exec(function(err, user) {
  122. if (err) return res.send(500, err.message);
  123. if (!user) {
  124. res.json({
  125. success: false,
  126. message: 'User not found.'
  127. });
  128. } else if (user) {
  129. res.status(200).jsonp(user);
  130. }
  131. });
  132. };
  133. exports.getTravelsByUserId = function(req, res) {
  134. travelModel.find({
  135. user: req.params.userid
  136. })
  137. .lean()
  138. .exec(function(err, travels) {
  139. if (err) return res.send(500, err.message);
  140. travelModel.find({
  141. joins: req.params.userid
  142. })
  143. .lean()
  144. .exec(function(err, joins) {
  145. if (err) return res.send(500, err.message);
  146. res.json({
  147. travels: travels,
  148. joins: joins
  149. });
  150. });
  151. });
  152. };
  153. exports.getUserLikes = function(req, res) {
  154. userModel.findOne({
  155. _id: req.params.userid
  156. })
  157. .lean()
  158. .populate('likes', 'username avatar description')
  159. .exec(function(err, user) {
  160. if (err) return res.send(500, err.message);
  161. if (!user) {
  162. res.json({
  163. success: false,
  164. message: 'User not found.'
  165. });
  166. } else if (user) {
  167. res.status(200).jsonp(user.likes);
  168. }
  169. });
  170. };
  171. exports.getNotifications = function(req, res) {
  172. userModel.findOne({
  173. 'token': req.headers['x-access-token']
  174. })
  175. .lean()
  176. .populate('notifications')
  177. .exec(function(err, user) {
  178. if (err) return res.send(500, err.message);
  179. if (!user) {
  180. res.json({
  181. success: false,
  182. message: 'User not found.'
  183. });
  184. } else if (user) {
  185. //res.status(200).jsonp(user.notifications);
  186. notificationModel.find({
  187. 'user': user._id
  188. })
  189. .lean()
  190. .exec(function(err, notifications) {
  191. if (err) return res.send(500, err.message);
  192. if (!notifications) {
  193. res.json({
  194. success: false,
  195. message: 'No pendent notifications.'
  196. });
  197. } else if (notifications) {
  198. res.status(200).jsonp(notifications);
  199. }
  200. });
  201. }
  202. });
  203. };
  204. function getRandomInt(min, max) {
  205. min = Math.ceil(min);
  206. max = Math.floor(max);
  207. return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive
  208. }
  209. function postImage(req, res, filename, fileImg) {
  210. url = "http://127.0.0.1:3050/image";
  211. var importFile = function(fileImg) {
  212. var decodedFile = new Buffer(fileImg, 'base64');
  213. var r = request.post(url, function(err, httpResponse, body) {
  214. if (err) {
  215. console.log(err);
  216. }
  217. //console.log(body);
  218. updateUserWithNewImages(req, res, body);
  219. });
  220. var form = r.form();
  221. form.append('file', decodedFile, {
  222. filename: filename + '.png'
  223. });
  224. }
  225. importFile(fileImg);
  226. }
  227. function updateUserWithNewImages(req, res, imgUrl){
  228. //adding random number to the url, to force ionic reload the image
  229. req.body.avatar = imgUrl+ "?" + getRandomInt(1, 9999);
  230. userModel.update({
  231. 'token': req.headers['x-access-token']
  232. }, req.body,
  233. function(err) {
  234. if (err) return console.log(err);
  235. exports.getUserByToken(req, res);
  236. });
  237. }
  238. exports.updateUser = function(req, res) {
  239. if (req.body.newAvatar) {
  240. urlImg = postImage(req, res, "avatar_"+req.body.username, req.body.newAvatar);
  241. }
  242. /*if (req.body.newFaircoin) {
  243. urlImg = postImage(req, res, "fairdir_"+req.body.username,req.body.newFaircoin);
  244. }*/
  245. if (!req.body.newAvatar){
  246. updateUserWithNewImages(req, res, req.body.avatar);
  247. }
  248. /*userModel.update({
  249. 'token': req.headers['x-access-token']
  250. }, req.body,
  251. function(err) {
  252. if (err) return console.log(err);
  253. exports.getUserByToken(req, res);
  254. });*/
  255. };
  256. //DELETE - Delete a user with specified ID
  257. exports.deleteUser = function(req, res) {
  258. userModel.findOne({
  259. 'token': req.headers['x-access-token']
  260. })
  261. .exec(function(err, user) {
  262. user.remove(function(err) {
  263. if (err) return res.send(500, err.message);
  264. res.status(200).jsonp("deleted");
  265. })
  266. });
  267. };
  268. exports.likeUser = function(req, res) {
  269. userModel.findOne({
  270. 'token': req.headers['x-access-token']
  271. })
  272. .exec(function(err, userL) {
  273. if (err) return res.send(500, err.message);
  274. if (!userL) {
  275. res.json({
  276. success: false,
  277. message: 'no user with that token, login again'
  278. });
  279. } else if (userL) {
  280. userModel.findOne({
  281. _id: req.params.userid,
  282. likes: {
  283. '$ne': userL._id
  284. }
  285. })
  286. .exec(function(err, user) {
  287. if (err) return res.send(500, err.message);
  288. if (!user) {
  289. res.json({
  290. success: false,
  291. message: 'Like not posible, user not exist, or like was already done'
  292. });
  293. } else if (user) {
  294. //res.status(200).jsonp(user);
  295. var notification = new notificationModel({
  296. concept: "like",
  297. message: "user " + userL.username + " adds a like to you",
  298. date: new Date(),
  299. icon: 'like.png',
  300. link: "users/" + user._id,
  301. user: user._id
  302. });
  303. notification.save(function(err, notification) {
  304. if (err) return res.send(500, err.message);
  305. user.likes.push(userL._id);
  306. user.notifications.push(notification._id);
  307. user.save(function(err, user) {
  308. if (err) return res.send(500, err.message);
  309. exports.getUserById(req, res);
  310. });
  311. });
  312. } //end of else if user
  313. });
  314. } //end of else if userL
  315. });
  316. };
  317. exports.unlikeUser = function(req, res) {
  318. userModel.findOne({
  319. 'token': req.headers['x-access-token']
  320. })
  321. .exec(function(err, userL) {
  322. if (err) return res.send(500, err.message);
  323. if (!userL) {
  324. res.json({
  325. success: false,
  326. message: 'no user with that token, login again'
  327. });
  328. } else if (userL) {
  329. userModel.findOne({
  330. _id: req.params.userid,
  331. likes: userL._id
  332. })
  333. .exec(function(err, user) {
  334. if (err) return res.send(500, err.message);
  335. if (!user) {
  336. res.json({
  337. success: false,
  338. message: 'Unlike not posible'
  339. });
  340. } else if (user) {
  341. //res.status(200).jsonp(user);
  342. var notification = new notificationModel({
  343. concept: "like",
  344. message: "user " + userL.username + " removes like on you",
  345. date: new Date(),
  346. icon: 'like.png',
  347. link: "users/" + user._id,
  348. user: user._id
  349. });
  350. notification.save(function(err, notification) {
  351. if (err) return res.send(500, err.message);
  352. var indexOf = user.likes.indexOf(userL._id);
  353. user.likes.splice(indexOf, 1);
  354. user.notifications.push(notification._id);
  355. user.save(function(err, user) {
  356. if (err) return res.send(500, err.message);
  357. exports.getUserById(req, res);
  358. });
  359. });
  360. } //end of else if user
  361. });
  362. } //end of else if userL
  363. });
  364. };
  365. /* fav */
  366. exports.addFav = function(req, res) {
  367. var tokenuser;
  368. userModel.find({
  369. token: req.headers['x-access-token']
  370. }, function(err, users) {
  371. tokenuser = users[0];
  372. });
  373. userModel.findById(req.params.userId, function(err, user) {
  374. // first search if user have already said like
  375. var favRepeated = false;
  376. for (var i = 0; i < user.favs.length; i++) {
  377. if (user.favs[i].username == tokenuser.username) {
  378. favRepeated = true;
  379. }
  380. }
  381. console.log("favRepeated: " + favRepeated);
  382. if (favRepeated == false) {
  383. //fav
  384. var fav = {
  385. userId: tokenuser._id,
  386. username: tokenuser.username,
  387. avatar: tokenuser.avatar
  388. };
  389. user.favs.push(fav);
  390. //notification
  391. var notification = {
  392. concept: "like",
  393. otherusername: tokenuser.username,
  394. description: "user " + tokenuser.username + " favs you",
  395. date: new Date(),
  396. link: "",
  397. user: user._id
  398. };
  399. user.notifications.push(notification);
  400. user.save(function(err, user) {
  401. if (err) return res.send(500, err.message);
  402. //once saved, send the users json to client
  403. userModel.find(function(err, users) {
  404. if (err) res.send(500, err.message);
  405. res.status(200).jsonp(users);
  406. });
  407. });
  408. } else {
  409. userModel.find(function(err, users) {
  410. if (err) res.send(500, err.message);
  411. res.status(200).jsonp(users);
  412. });
  413. }
  414. });
  415. };
  416. exports.doUnfav = function(req, res) {
  417. var tokenuser;
  418. userModel.find({
  419. token: req.headers['x-access-token']
  420. }, function(err, users) {
  421. tokenuser = users[0];
  422. });
  423. userModel.findById(req.params.userId, function(err, user) {
  424. for (var i = 0; i < user.favs.length; i++) {
  425. if (user.favs[i].username == tokenuser.username) {
  426. user.favs.splice(i, 1);
  427. }
  428. }
  429. user.save(function(err, travel) {
  430. if (err) return res.send(500, err.message);
  431. //res.status(200).jsonp(travel);
  432. userModel.find(function(err, users) {
  433. if (err) res.send(500, err.message);
  434. res.status(200).jsonp(users);
  435. });
  436. });
  437. });
  438. };