var express = require('express'); var app = express(); var config = require('../config/config'); var crypto = require('crypto'); app.set('superSecret', config.secret); var userModel = require('../models/userModel'); var routineModel = require('../models/routineModel'); //var trainerModel = require('../models/trainerModel'); /** GET '/routines/' **/ exports.getRoutines = function (req, res) { routineModel.find() .limit(Number(req.query.pageSize)) .skip(Number(req.query.pageSize)*Number(req.query.page)) .exec(function (err, routines) { if (err) return res.send(500, err.message); res.status(200).jsonp(routines); }); }; /** GET '/routines/:routineid' **/ exports.getRoutineById = function (req, res) { routineModel.findOne({_id: req.params.routineid}) .lean() .populate('trainer', 'name avatar') .populate('client', 'name avatar points.total') .exec(function (err, routine) { if (err) return res.send(500, err.message); res.status(200).jsonp(routine); }); }; /** DELETE '/routines/:routineid' **/ exports.deleteRoutineById = function (req, res) { userModel.findOne({'tokens.token': req.headers['x-access-token'], role:'trainer'}, function (err, trainer) { if (err) return res.send(500, err.message); if (!trainer) { res.json({success: false, message: 'Trainer not found.'}); } else if (trainer) { for (var i = 0; i < trainer.routines.length; i++) { if (trainer.routines[i].equals(req.params.routineid)) {//Solo si esa routine ha sido creada por el trainer trainer.routines.splice(i, 1); //també s'hauria de treure la referència al user que és client d'aquesta routine trainer.save(function (err, trainer) {//guardem el trainer amb la rutina treta if (err) return res.send(500, err.message); routineModel.findByIdAndRemove({_id: req.params.routineid}, function (err) {//elminem la routine if (err !== null) return res.send(500, err.message); res.status(200).jsonp('Deleted routine'); }); }); } } } }); }; /** PUT '/routines/:routineid' **/ exports.updateRoutineById = function (req, res) { userModel.findOne({'tokens.token': req.headers['x-access-token'], role:'trainer'}, function (err, user) { if (err) return res.send(500, err.message); if (!user) { res.json({success: false, message: 'Trainer not found.'}); } else if (user) { for (var i = 0; i < user.routines.length; i++) { if (user.routines[i].equals(req.params.routineid)) { user.routines.splice(i, 1);// <-- perquè es fa l'splice de user.routines si després no es guarda el user?? /* Solo si esa routine ha sido creada por el trainer */ var id = req.params.routineid; var routine = req.body; routineModel.update({"_id": id}, routine, function (err) { if (err) return console.log(err); console.log(routine); res.status(200).jsonp(routine); }); } } } }); }; /** POST '/routines/addToClient/:clientid' **/ exports.addRoutineToClient = function (req, res) { userModel.findOne({ 'tokens.token': req.headers['x-access-token'], 'clients.client': req.params.clientid, 'role': 'trainer' }, function (err, trainer) { if (err) return res.send(500, err.message); if (!trainer) { res.json({success: false, message: 'Routine creation failed. Trainer not found.'}); } else if (trainer) { var routine = new routineModel({ title: req.body.title, description: req.body.description, trainer: trainer._id,//a partir del token, pillem la id client: req.params.clientid//es guarda de quin user és la routine }); //guardem la routine routine.save(function (err, routine) { if (err) { console.log(err.message); return res.status(500).send(err.message); } //ara guardem la routineid al trainer trainer.routines.push(routine._id); trainer.save(function (err, trainer) { if (err) return res.send(500, err.message); }); //res.status(200).jsonp(routine); //ara afegim la routine al client userModel.findOne({'_id': req.params.clientid}, function (err, user) { if (err) return res.send(500, err.message); if (!user) { res.json({success: false, message: 'adding routine to client failed. user not found.'}); } else if (user) { user.routines.push(routine._id); /* gamification */ var reward = { concept: "new routine", date: Date(), value: +5 }; user.points.history.push(reward); user.points.total = user.points.total + 5; /* end of gamification */ var notification = { state: "pendent", message: "trainer has added a routine to you", link: "training", icon: "newroutine.png", date: Date() }; user.notifications.push(notification); user.save(function (err) { if (err) return res.send(500, err.message); res.status(200).jsonp(routine); }); }//end else if }); }); }//else }); }; /** POST '/routines/:routineid/days' **/ exports.addDayToRoutine = function (req, res) { userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, trainer) { if (err) return res.send(500, err.message); if (!trainer) { res.json({success: false, message: 'Routine day addition failed. Trainer not found.'}); } else if (trainer) { routineModel.findOne({_id: req.params.routineid}, function (err, routine) { if (err) return res.send(500, err.message); if (trainer._id.equals(routine.trainer)) {// si el trainer que fa el post realment és el trainer creator de la routine routine.days.push(req.body.day); routine.save(function (err, routine) { if (err) { return res.status(500).send(err.message); } routineModel.findOne({_id: routine._id}) .lean() .populate('trainer', 'name avatar') .populate('client', 'name avatar points.total') .exec(function (err, routine) { if (err) return res.send(500, err.message); res.status(200).jsonp(routine); }); }); } }); }// end else if }); }; /** POST '/routines/choose' **/ exports.chooseRoutine = function (req, res) { userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, user) { if (err) return res.send(500, err.message); if (!user) { res.json({success: false, message: 'choosing routine failed. user not found.'}); } else if (user) { console.log(user);//aquí potser caldria comprovar que la routine és la que han creat per l'user user.routines.push(req.body.routineid); /* gamification */ var reward = { concept: "choosing routine", date: Date(), value: +5 }; user.points.history.push(reward); user.points.total = user.points.total + 5; /* end of gamification */ user.save(function (err) { if (err) return res.send(500, err.message); res.status(200).jsonp(user); }); }//end else if }); }; /** DELETE '/routines/choose' **/ exports.unchooseRoutine = function (req, res) { userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, user) { if (err) return res.send(500, err.message); if (!user) { res.json({success: false, message: 'choosing routine failed. user not found.'}); } else if (user) { for (var i = 0; i < user.routines.length; i++) { if (user.routines[i] == req.body.routineid) {//deletes the diets of the user with the dietid user.routines.splice(i, 1); } } /* gamification */ var reward = { concept: "unchoosing routine", date: Date(), value: -7 }; user.points.history.push(reward); user.points.total = user.points.total - 7; /* end of gamification */ user.save(function (err) { if (err) return res.send(500, err.message); res.status(200).jsonp(user); }); }//end else if }); }; /** POST '/routines/completeDay/:routineid' **/ exports.completeDayGamificatedRoutine = function (req, res) { //1r intentamos darle los puntos al usuario por haber completado el día userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, user) { if (err) return res.send(500, err.message); if (!user) { res.json({success: false, message: 'choosing routine failed. user not found.'}); } else if (user) { /* gamification */ var reward = { concept: "routine day complete", date: Date(), value: +1 }; user.points.history.push(reward); user.points.total = user.points.total + 1; /* end of gamification */ user.save(function (err) { if (err) return res.send(500, err.message); }); //Ahora intentamos añadir done = true dentro del modelo rutina routineModel.findOne({'_id': req.params.routineid}, function (err, routine) { if (err) return res.send(500, err.message); if (!routine) { res.json({success: false, message: 'Routine not found'}); } else if (routine) { var indexDay = -1; for (var i = 0; i < routine.days.length; i++) //routine.days { if (routine.days[i]._id.equals(req.body.dayid)) { //aquí hem trobat el dia que busquem indexDay = JSON.parse(JSON.stringify(i)); } }//End for looking for days if (indexDay > -1) { /* True to day done*/ routine.days[indexDay].done = true; /* end of done*/ routine.save(function (err) { if (err) return res.send(500, err.message); routineModel.findOne({_id: routine._id}) .lean() .populate('trainer', 'name avatar') .populate('client', 'name avatar points.total') .exec(function (err, routine) { if (err) return res.send(500, err.message); res.status(200).jsonp(routine); }); });//Routine.save }//End if when day foung else { res.json({success: false, message: 'Day not found'}); } }//End else if found routine });//En routineModel for done = true }//End else if (user) });//En UserModel findOne() };//End function