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 dietModel = require('../models/dietModel'); //var chefModel = require('../models/chefModel'); /** GET '/diets' ***/ exports.getDiets = function (req, res) { dietModel.find() .limit(Number(req.query.pageSize)) .skip(Number(req.query.pageSize)*Number(req.query.page)) .exec(function (err, diets) { if (err) return res.send(500, err.message); res.status(200).jsonp(diets); }); }; /** GET '/diets/:dietid' **/ exports.getDietById = function (req, res) { dietModel.findOne({_id: req.params.dietid}) .lean() .populate('chef', 'name avatar') .exec(function (err, diet) { if (err) return res.send(500, err.message); res.status(200).jsonp(diet); }); }; /**DELETE '/diets/:dietid' **/ exports.deleteDietById = function (req, res) { userModel.findOne({'tokens.token': req.headers['x-access-token'], role:'chef'}, function (err, chef) { if (err) return res.send(500, err.message); if (!chef) { res.json({success: false, message: 'Chef not found.'}); } else if (chef) { for (var i = 0; i < chef.diets.length; i++) { if (chef.diets[i].equals(req.params.dietid)) { chef.diets.splice(i, 1); chef.save(function (err, chef) {//guardem el chef amb la dieta treta if (err) return res.send(500, err.message); dietModel.findByIdAndRemove({_id: req.params.dietid}, function (err) { if (err !== null) return res.send(500, err.message); res.status(200).jsonp('Deleted diet'); }); }); } } } }); }; /** PUT '/diets/:dietid' **/ exports.updateDietById = function (req, res) { userModel.findOne({'tokens.token': req.headers['x-access-token'], role:'chef'}, function (err, chef) { if (err) return res.send(500, err.message); if (!chef) { res.json({success: false, message: 'Chef not found.'}); } else if (chef) { for (var i = 0; i < chef.diets.length; i++) { if (chef.diets[i].equals(req.params.dietid)) { chef.diets.splice(i, 1); //<-- splice? quan s'està fent un update? no s'hauria d'eliminar //tot i que no afecta, pq l'splice aquest després no es guarda a la base de dades pq no hi ha cap chef.save /* Solo si esa dieta ha sido creada por el chef */ var id = req.params.dietid; var diet = req.body; dietModel.update({"_id": id}, diet, function (err) { if (err) return console.log(err); console.log(diet); res.status(200).jsonp(diet); }); } } } }); }; /**POST '/diets' **/ exports.createDiet = function (req, res) { userModel.findOne({'tokens.token': req.headers['x-access-token'], role:'chef'}, function (err, chef) { if (err) return res.send(500, err.message); if (!chef) { res.json({success: false, message: 'Diet creation failed. Chef not found.'}); } else if (chef) { var diet = new dietModel({ title: req.body.title, description: req.body.description, chef: chef._id,//a partir del token, pillem la id client: req.params.clientid//es guarda de quin user és la diet }); //guardem la diet diet.save(function (err, diet) { if (err) { console.log(err.message); return res.status(500).send(err.message); } //ara guardem la dietid al chef chef.diets.push(diet._id); chef.save(function (err, chef) { if (err) return res.send(500, err.message); }); res.status(200).jsonp(diet); }); }//else }); }; /** POST '/diets/:dietid/days' **/ exports.addDayToDiet = function (req, res) { userModel.findOne({'tokens.token': req.headers['x-access-token'], role:'chef'}, function (err, chef) { if (err) return res.send(500, err.message); if (!chef) { res.json({success: false, message: 'Diet day addition failed. Trainer not found.'}); } else if (chef) { dietModel.findOne({_id: req.params.dietid}, function (err, diet) { if (err) return res.send(500, err.message); if (chef._id.equals(diet.chef)) {// si el chef que fa el post realment és el chef creator de la diet diet.days.push(req.body.day); diet.save(function (err, diet) { if (err) { return res.status(500).send(err.message); } res.status(200).jsonp(diet); }); } }); }// end else if }); }; /** POST '/diets/choose' **/ exports.chooseDiet = 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 diet failed. user not found.'}); } else if (user) { user.diets.push(req.params.dietid); /* gamification */ var reward = { concept: "choosing diet", 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 '/diets/choose' **/ exports.unchooseDiet = 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: 'user not found.'}); } else if (user) { for (var i = 0; i < user.diets.length; i++) { if (user.diets[i].equals(req.params.dietid)) {//deletes the diets of the user with the dietid user.diets.splice(i, 1); } } /* gamification */ var reward = { concept: "unchoosing diet", 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 '/diets/completeDay/:dietid' **/ exports.completeDayGamificatedDiet = 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 diet failed. user not found.'}); } else if (user) { /* gamification */ var reward = { concept: "diet 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 dieta dietModel.findOne({'_id': req.params.dietid}, function (err, diet) { if (err) return res.send(500, err.message); if (!diet) { res.json({success: false, message: 'Diet not found'}); } else if (diet) { var indexDay = -1; for (var i = 0; i < diet.days.length; i++) //diet.days { if (diet.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*/ diet.days[indexDay].done = true; /* end of done*/ diet.save(function (err) { if (err) return res.send(500, err.message); res.status(200).jsonp(diet); });//diet.save }//End if when day foung else { res.json({success: false, message: 'Day not found'}); } }//End else if found diet });//En dietModel for done = true }//End else if (user) });//En UserModel findOne() };//End function