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