arnaucube
arnaucube/socketioMEANseedPublic Self-hosted repository
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