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.

303 lines
13 KiB

7 years ago
  1. var express = require('express');
  2. var app = express();
  3. var config = require('../config/config');
  4. var crypto = require('crypto');
  5. app.set('superSecret', config.secret);
  6. var userModel = require('../models/userModel');
  7. var routineModel = require('../models/routineModel');
  8. //var trainerModel = require('../models/trainerModel');
  9. /** GET '/routines/' **/
  10. exports.getRoutines = function (req, res) {
  11. routineModel.find()
  12. .limit(Number(req.query.pageSize))
  13. .skip(Number(req.query.pageSize)*Number(req.query.page))
  14. .exec(function (err, routines) {
  15. if (err) return res.send(500, err.message);
  16. res.status(200).jsonp(routines);
  17. });
  18. };
  19. /** GET '/routines/:routineid' **/
  20. exports.getRoutineById = function (req, res) {
  21. routineModel.findOne({_id: req.params.routineid})
  22. .lean()
  23. .populate('trainer', 'name avatar')
  24. .populate('client', 'name avatar points.total')
  25. .exec(function (err, routine) {
  26. if (err) return res.send(500, err.message);
  27. res.status(200).jsonp(routine);
  28. });
  29. };
  30. /** DELETE '/routines/:routineid' **/
  31. exports.deleteRoutineById = function (req, res) {
  32. userModel.findOne({'tokens.token': req.headers['x-access-token'], role:'trainer'}, function (err, trainer) {
  33. if (err) return res.send(500, err.message);
  34. if (!trainer) {
  35. res.json({success: false, message: 'Trainer not found.'});
  36. } else if (trainer) {
  37. for (var i = 0; i < trainer.routines.length; i++) {
  38. if (trainer.routines[i].equals(req.params.routineid)) {//Solo si esa routine ha sido creada por el trainer
  39. trainer.routines.splice(i, 1);
  40. //també s'hauria de treure la referència al user que és client d'aquesta routine
  41. trainer.save(function (err, trainer) {//guardem el trainer amb la rutina treta
  42. if (err) return res.send(500, err.message);
  43. routineModel.findByIdAndRemove({_id: req.params.routineid}, function (err) {//elminem la routine
  44. if (err !== null) return res.send(500, err.message);
  45. res.status(200).jsonp('Deleted routine');
  46. });
  47. });
  48. }
  49. }
  50. }
  51. });
  52. };
  53. /** PUT '/routines/:routineid' **/
  54. exports.updateRoutineById = function (req, res) {
  55. userModel.findOne({'tokens.token': req.headers['x-access-token'], role:'trainer'}, function (err, user) {
  56. if (err) return res.send(500, err.message);
  57. if (!user) {
  58. res.json({success: false, message: 'Trainer not found.'});
  59. } else if (user) {
  60. for (var i = 0; i < user.routines.length; i++) {
  61. if (user.routines[i].equals(req.params.routineid)) {
  62. user.routines.splice(i, 1);// <-- perquè es fa l'splice de user.routines si després no es guarda el user??
  63. /* Solo si esa routine ha sido creada por el trainer */
  64. var id = req.params.routineid;
  65. var routine = req.body;
  66. routineModel.update({"_id": id}, routine,
  67. function (err) {
  68. if (err) return console.log(err);
  69. console.log(routine);
  70. res.status(200).jsonp(routine);
  71. });
  72. }
  73. }
  74. }
  75. });
  76. };
  77. /** POST '/routines/addToClient/:clientid' **/
  78. exports.addRoutineToClient = function (req, res) {
  79. userModel.findOne({
  80. 'tokens.token': req.headers['x-access-token'],
  81. 'clients.client': req.params.clientid,
  82. 'role': 'trainer'
  83. }, function (err, trainer) {
  84. if (err) return res.send(500, err.message);
  85. if (!trainer) {
  86. res.json({success: false, message: 'Routine creation failed. Trainer not found.'});
  87. } else if (trainer) {
  88. var routine = new routineModel({
  89. title: req.body.title,
  90. description: req.body.description,
  91. trainer: trainer._id,//a partir del token, pillem la id
  92. client: req.params.clientid//es guarda de quin user és la routine
  93. });
  94. //guardem la routine
  95. routine.save(function (err, routine) {
  96. if (err) {
  97. console.log(err.message);
  98. return res.status(500).send(err.message);
  99. }
  100. //ara guardem la routineid al trainer
  101. trainer.routines.push(routine._id);
  102. trainer.save(function (err, trainer) {
  103. if (err) return res.send(500, err.message);
  104. });
  105. //res.status(200).jsonp(routine);
  106. //ara afegim la routine al client
  107. userModel.findOne({'_id': req.params.clientid}, function (err, user) {
  108. if (err) return res.send(500, err.message);
  109. if (!user) {
  110. res.json({success: false, message: 'adding routine to client failed. user not found.'});
  111. } else if (user) {
  112. user.routines.push(routine._id);
  113. /* gamification */
  114. var reward = {
  115. concept: "new routine",
  116. date: Date(),
  117. value: +5
  118. };
  119. user.points.history.push(reward);
  120. user.points.total = user.points.total + 5;
  121. /* end of gamification */
  122. var notification = {
  123. state: "pendent",
  124. message: "trainer has added a routine to you",
  125. link: "training",
  126. icon: "newroutine.png",
  127. date: Date()
  128. };
  129. user.notifications.push(notification);
  130. user.save(function (err) {
  131. if (err) return res.send(500, err.message);
  132. res.status(200).jsonp(routine);
  133. });
  134. }//end else if
  135. });
  136. });
  137. }//else
  138. });
  139. };
  140. /** POST '/routines/:routineid/days' **/
  141. exports.addDayToRoutine = function (req, res) {
  142. userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, trainer) {
  143. if (err) return res.send(500, err.message);
  144. if (!trainer) {
  145. res.json({success: false, message: 'Routine day addition failed. Trainer not found.'});
  146. } else if (trainer) {
  147. routineModel.findOne({_id: req.params.routineid}, function (err, routine) {
  148. if (err) return res.send(500, err.message);
  149. if (trainer._id.equals(routine.trainer)) {// si el trainer que fa el post realment és el trainer creator de la routine
  150. routine.days.push(req.body.day);
  151. routine.save(function (err, routine) {
  152. if (err) {
  153. return res.status(500).send(err.message);
  154. }
  155. routineModel.findOne({_id: routine._id})
  156. .lean()
  157. .populate('trainer', 'name avatar')
  158. .populate('client', 'name avatar points.total')
  159. .exec(function (err, routine) {
  160. if (err) return res.send(500, err.message);
  161. res.status(200).jsonp(routine);
  162. });
  163. });
  164. }
  165. });
  166. }// end else if
  167. });
  168. };
  169. /** POST '/routines/choose' **/
  170. exports.chooseRoutine = function (req, res) {
  171. userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, user) {
  172. if (err) return res.send(500, err.message);
  173. if (!user) {
  174. res.json({success: false, message: 'choosing routine failed. user not found.'});
  175. } else if (user) {
  176. console.log(user);//aquí potser caldria comprovar que la routine és la que han creat per l'user
  177. user.routines.push(req.body.routineid);
  178. /* gamification */
  179. var reward = {
  180. concept: "choosing routine",
  181. date: Date(),
  182. value: +5
  183. };
  184. user.points.history.push(reward);
  185. user.points.total = user.points.total + 5;
  186. /* end of gamification */
  187. user.save(function (err) {
  188. if (err) return res.send(500, err.message);
  189. res.status(200).jsonp(user);
  190. });
  191. }//end else if
  192. });
  193. };
  194. /** DELETE '/routines/choose' **/
  195. exports.unchooseRoutine = function (req, res) {
  196. userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, user) {
  197. if (err) return res.send(500, err.message);
  198. if (!user) {
  199. res.json({success: false, message: 'choosing routine failed. user not found.'});
  200. } else if (user) {
  201. for (var i = 0; i < user.routines.length; i++) {
  202. if (user.routines[i] == req.body.routineid) {//deletes the diets of the user with the dietid
  203. user.routines.splice(i, 1);
  204. }
  205. }
  206. /* gamification */
  207. var reward = {
  208. concept: "unchoosing routine",
  209. date: Date(),
  210. value: -7
  211. };
  212. user.points.history.push(reward);
  213. user.points.total = user.points.total - 7;
  214. /* end of gamification */
  215. user.save(function (err) {
  216. if (err) return res.send(500, err.message);
  217. res.status(200).jsonp(user);
  218. });
  219. }//end else if
  220. });
  221. };
  222. /** POST '/routines/completeDay/:routineid' **/
  223. exports.completeDayGamificatedRoutine = function (req, res) {
  224. //1r intentamos darle los puntos al usuario por haber completado el día
  225. userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, user) {
  226. if (err)
  227. return res.send(500, err.message);
  228. if (!user) {
  229. res.json({success: false, message: 'choosing routine failed. user not found.'});
  230. }
  231. else if (user) {
  232. /* gamification */
  233. var reward =
  234. {
  235. concept: "routine day complete",
  236. date: Date(),
  237. value: +1
  238. };
  239. user.points.history.push(reward);
  240. user.points.total = user.points.total + 1;
  241. /* end of gamification */
  242. user.save(function (err) {
  243. if (err)
  244. return res.send(500, err.message);
  245. });
  246. //Ahora intentamos añadir done = true dentro del modelo rutina
  247. routineModel.findOne({'_id': req.params.routineid}, function (err, routine) {
  248. if (err)
  249. return res.send(500, err.message);
  250. if (!routine) {
  251. res.json({success: false, message: 'Routine not found'});
  252. }
  253. else if (routine) {
  254. var indexDay = -1;
  255. for (var i = 0; i < routine.days.length; i++) //routine.days
  256. {
  257. if (routine.days[i]._id.equals(req.body.dayid)) {
  258. //aquí hem trobat el dia que busquem
  259. indexDay = JSON.parse(JSON.stringify(i));
  260. }
  261. }//End for looking for days
  262. if (indexDay > -1) {
  263. /* True to day done*/
  264. routine.days[indexDay].done = true;
  265. /* end of done*/
  266. routine.save(function (err) {
  267. if (err)
  268. return res.send(500, err.message);
  269. routineModel.findOne({_id: routine._id})
  270. .lean()
  271. .populate('trainer', 'name avatar')
  272. .populate('client', 'name avatar points.total')
  273. .exec(function (err, routine) {
  274. if (err) return res.send(500, err.message);
  275. res.status(200).jsonp(routine);
  276. });
  277. });//Routine.save
  278. }//End if when day foung
  279. else {
  280. res.json({success: false, message: 'Day not found'});
  281. }
  282. }//End else if found routine
  283. });//En routineModel for done = true
  284. }//End else if (user)
  285. });//En UserModel findOne()
  286. };//End function