arnaucube
arnaucube/commonroutesServerPublic Self-hosted repository
commonroutesServer/controllers/travelController.js
controllers/travelController.jsRaw
  1var request = require('request');
  2
  3var config = require('../config');
  4var pageSize=config.pageSize;
  5
  6//import data models
  7var mongoose = require('mongoose');
  8var userModel  = mongoose.model('userModel');
  9var notificationModel  = mongoose.model('notificationModel');
 10var travelModel  = mongoose.model('travelModel');
 11var commentModel  = mongoose.model('commentModel');
 12
 13exports.getAllTravels = function(req, res) {
 14	//get travels with futures dates ($gte - greater than and equal than)
 15	travelModel.find({date: {$gte: new Date()}})
 16	.sort('date')
 17    .limit(pageSize)
 18    .skip(pageSize * Number(req.query.page))
 19    .lean()
 20    .populate('user', 'username avatar validated')
 21    .exec(function (err, travels) {
 22        if (err) return res.send(500, err.message);
 23        res.status(200).jsonp(travels);
 24    });
 25};
 26
 27exports.getTravelById = function (req, res) {
 28    travelModel.findOne({_id: req.params.travelid})
 29    .lean()
 30    .populate('user', 'username avatar validated telegram phone')
 31    .populate('joins', 'username avatar')
 32    .populate('joinPetitions', 'username avatar')
 33    .populate('comments', 'comment user')
 34    .exec(function (err, travel) {
 35        if (err) return res.send(500, err.message);
 36        if (!travel) {
 37            res.json({success: false, message: 'travel not found.'});
 38        } else if (travel) {
 39
 40            res.status(200).jsonp(travel);
 41        }
 42    });
 43};
 44
 45exports.addTravel = function(req, res) {
 46	userModel.findOne({'token': req.headers['x-access-token']})
 47	.exec(function(err, user){
 48		if (err) return res.send(500, err.message);
 49		if (!user) {
 50			console.log("user not found");
 51            res.json({success: false, message: 'User not found.'});
 52        } else if (user) {
 53			var travel = new travelModel({
 54				title: req.body.title,
 55			    description:   req.body.description,
 56			    user:   user._id,
 57			    from:   req.body.from,
 58			    to:   req.body.to,
 59			    date:   req.body.date,
 60				periodic: req.body.periodic,
 61			    generateddate: Date(),
 62				seats: req.body.seats,
 63				package: req.body.package,
 64				collectivized: req.body.collectivized,
 65				type: req.body.type
 66			});
 67
 68			travel.save(function(err, travel) {
 69				if(err) return res.send(500, err.message);
 70
 71				// send travel to telegram bot
 72				request({
 73				  uri: 'http://127.0.0.1:3003/api/travel',
 74				  method: 'POST',
 75				  json: travel
 76				}, function (error, response, body) {
 77				  if (!error && response.statusCode == 200) {
 78				    // console.log(body.id) // Print the shortened url.
 79				  } else if (error){
 80						console.log("error sending travel to bot: " + error);
 81					}
 82				});
 83
 84
 85				user.travels.push(travel._id);
 86				user.save(function (err, user) {
 87                    if (err) return res.send(500, err.message);
 88					exports.getAllTravels(req, res);
 89                });
 90			});//end of travel.save
 91		}
 92	});//end of usermodel.find
 93
 94
 95};
 96
 97exports.updateTravel = function(req, res) {
 98	userModel.findOne({'token': req.headers['x-access-token']})
 99	.exec(function(err, user){
100        if (err) return res.send(500, err.message);
101				// search if the travel exist for that user
102				travelModel.findOne({_id: req.body._id, user: user._id})
103				.exec(function(err, travel){
104					if (!travel) {
105							res.send(500, 'travel not found.');
106					} else if (travel) {
107						// now update travel
108						travelModel.update({
109							_id: req.body._id, user: user._id
110						}, req.body,
111						function(err, travel) {
112							if (err) {
113								res.send(500, 'travel not found.');
114							}
115							console.log(travel);
116							res.status(200).jsonp(travel);
117						});
118					}
119				});
120
121
122    });
123};
124
125exports.deleteTravel = function(req, res) {
126	userModel.findOne({'token': req.headers['x-access-token']})
127	.exec(function(err, user){
128		if (err) return res.send(500, err.message);
129		travelModel.findById(req.params.travelid, function(err, travel) {
130			if (err) return res.send(500, err.message);
131			if(travel.user.equals(user._id))
132			{
133				travel.remove(function(err) {
134					if(err) return res.send(500, err.message);
135
136					console.log("deleted");
137					exports.getAllTravels(req, res);
138				});
139			}
140		});
141	});
142};
143
144
145exports.addJoinPetition = function(req, res) {
146	userModel.findOne({'token': req.headers['x-access-token']})
147	.exec(function(err, userJoining){
148		if (err) return res.send(500, err.message);
149		if (!userJoining) {
150            res.json({success: false, message: 'User not found.'});
151        } else if (userJoining) {
152			travelModel.findOne({
153				_id: req.params.travelid,
154				user: {'$ne': userJoining._id},
155				joins: {'$ne': userJoining._id},
156				joinPetitions: {'$ne': userJoining._id}
157			})
158			.exec(function(err, travel){
159				if (err) return res.send(500, err.message);
160				if (!travel) {
161		            res.json({success: false, message: 'travel not found. You can not join a travel if you have created it, or if you have already joined'});
162		        } else if (travel) {
163					travel.joinPetitions.push(userJoining._id);
164					travel.save(function(err, travel) {
165						if(err) return res.send(500, err.message);
166
167						//start saving notification, get user owner of travel
168						userModel.findOne({_id: travel.user})
169						.exec(function(err, user){
170							if (err) return res.send(500, err.message);
171							if (!user) {
172					            res.json({success: false, message: 'User not found.'});
173					        } else if (user) {
174							//notification
175								var notification = new notificationModel({
176									concept: "join",
177									message: "user "+userJoining.username+" joins your travel "+travel.title,
178									date: new Date(),
179									icon: 'ion-person-add',
180									link: "travels/" + travel._id,
181			                        user: user._id
182								});
183								notification.save(function(err, notification) {
184									if (err) return res.send(500, err.message);
185									user.notifications.push(notification._id);
186									user.save(function(err, user) {
187										if (err) return res.send(500, err.message);
188
189										console.log("notification saved");
190										exports.getTravelById(req, res);
191									});
192								});
193							}
194						});//end saving notification
195					});
196				}//end of else if travel
197			});
198		}//end of else if user
199	});
200};
201
202exports.unJoin = function(req, res) {
203	userModel.findOne({'token': req.headers['x-access-token']})
204	.exec(function(err, userJoining){
205		if (!userJoining) {
206            res.json({success: false, message: 'userJoining not found.'});
207        } else if (userJoining) {
208			travelModel.findOne({
209				_id: req.params.travelid,
210				joinPetitions: userJoining._id
211			})
212			.exec(function(err, travel){
213				if (err) return res.send(500, err.message);
214				if (!travel) {
215		            res.json({success: false, message: 'can not unjoin this travel'});
216		        } else if (travel) {
217					for(var i=0; i<travel.joinPetitions.length; i++)
218					{
219						if(travel.joinPetitions[i].equals(userJoining._id))
220						{
221							travel.joinPetitions.splice(i, 1);
222						}
223					}
224					travel.save(function(err, travel) {
225						if(err) return res.send(500, err.message);
226						//start saving notification, get user owner of travel
227						userModel.findOne({_id: travel.user})
228						.exec(function(err, user){
229							if (err) return res.send(500, err.message);
230							if (!user) {
231				            res.json({success: false, message: 'User not found.'});
232				        } else if (user) {
233								//notification
234								var notification = new notificationModel({
235									concept: "unjoin",
236									message: "user "+userJoining.username+" unjoins your travel "+travel.title,
237									date: new Date(),
238									icon: 'ion-arrow-return-left',
239									link: "travels/" + travel._id,
240			                        user: user._id
241								});
242								notification.save(function(err, notification) {
243									if (err) return res.send(500, err.message);
244									user.notifications.push(notification._id);
245									user.save(function(err, user) {
246										if (err) return res.send(500, err.message);
247
248										console.log("notification saved");
249										exports.getTravelById(req, res);
250									});
251								});
252							}
253						});//end saving notification
254					});
255				}
256			});
257		}
258
259	});
260};
261
262
263exports.declineJoin = function(req, res) {
264	userModel.findOne({'token': req.headers['x-access-token']})
265	.exec(function(err, userOwner){
266		if (err) return res.send(500, err.message);
267		if (!userOwner) {
268            res.json({success: false, message: 'User not found.'});
269        } else if (userOwner) {
270			travelModel.findOne({
271				_id: req.params.travelid,
272				user: userOwner._id,
273				joinPetitions: req.body.userid
274			})
275			.exec(function(err, travel){
276				if (err) return res.send(500, err.message);
277				if (!travel) {
278		            res.json({success: false, message: 'travel not found. You can not join a travel if you have created it, or if you have already joined'});
279		        } else if (travel) {
280					var indexPetition=-1;
281					for(var i=0; i<travel.joinPetitions.length; i++)
282					{
283						if(travel.joinPetitions[i].equals(req.body.userid))
284						{
285							indexPetition=JSON.parse(JSON.stringify(i));
286						}
287					}
288					if(indexPetition>-1)
289					{
290						travel.joinPetitions.splice(indexPetition, 1);
291					}
292					travel.save(function(err, travel) {
293						if(err) return res.send(500, err.message);
294
295						//start saving notification, get user owner of travel
296						userModel.findOne({_id: req.body.userid})
297						.exec(function(err, user){
298							if (err) return res.send(500, err.message);
299							if (!user) {
300					            res.json({success: false, message: 'User not found.'});
301					        } else if (user) {
302							//notification
303								var notification = new notificationModel({
304									concept: "travel",
305									message: "user "+userOwner.username+" declines your petition for "+travel.title,
306									date: new Date(),
307									icon: 'ion-close',
308									link: "travels/" + travel._id,
309			                        user: user._id
310								});
311								notification.save(function(err, notification) {
312									if (err) return res.send(500, err.message);
313									user.notifications.push(notification._id);
314									user.save(function(err, user) {
315										if (err) return res.send(500, err.message);
316
317										console.log("notification saved");
318										exports.getTravelById(req, res);
319									});
320								});
321							}
322						});//end saving notification
323					});//end of travel save
324				}//end of else if travel
325			});
326		}//end of else if user
327	});
328};
329
330exports.acceptJoin = function(req, res) {
331	userModel.findOne({'token': req.headers['x-access-token']})
332	.exec(function(err, userOwner){
333		if (err) return res.send(500, err.message);
334		if (!userOwner) {
335            res.json({success: false, message: 'User not found.'});
336        } else if (userOwner) {
337			travelModel.findOne({
338				_id: req.params.travelid,
339				user: userOwner._id,
340				joinPetitions: req.body.userid
341			})
342			.exec(function(err, travel){
343				if (err) return res.send(500, err.message);
344				if (!travel) {
345		            res.json({success: false, message: 'travel not found. You can not join a travel if you have created it, or if you have already joined'});
346		        } else if (travel) {
347					var indexPetition=-1;
348					for(var i=0; i<travel.joinPetitions.length; i++)
349					{
350						if(travel.joinPetitions[i].equals(req.body.userid))
351						{
352							indexPetition=JSON.parse(JSON.stringify(i));
353						}
354					}
355					if(indexPetition>-1)
356					{
357						travel.joins.push(JSON.parse(JSON.stringify(travel.joinPetitions[indexPetition])));
358						travel.joinPetitions.splice(indexPetition, 1);
359						console.log(travel);
360					}
361					travel.save(function(err, travel) {
362						if(err) return res.send(500, err.message);
363
364						//start saving notification, get user owner of travel
365						userModel.findOne({_id: req.body.userid})
366						.exec(function(err, user){
367							if (err) return res.send(500, err.message);
368							if (!user) {
369				            res.json({success: false, message: 'User not found.'});
370				        } else if (user) {
371								//notification
372								var notification = new notificationModel({
373									concept: "travel",
374									message: "user "+userOwner.username+" accepts your petition for "+travel.title,
375									date: new Date(),
376									icon: 'ion-checkmark',
377									link: "travels/" + travel._id,
378			                        user: user._id
379								});
380								notification.save(function(err, notification) {
381									if (err) return res.send(500, err.message);
382									user.notifications.push(notification._id);
383									user.save(function(err, user) {
384										if (err) return res.send(500, err.message);
385
386										console.log("notification saved");
387										exports.getTravelById(req, res);
388									});
389								});
390							}
391						});//end saving notification
392					});//end of travel save
393				}//end of else if travel
394			});
395		}//end of else if user
396	});
397};
398
399exports.leave = function(req, res) {
400	userModel.findOne({'token': req.headers['x-access-token']})
401	.exec(function(err, userLeaving){
402		if (!userLeaving) {
403            res.json({success: false, message: 'userLeaving not found.'});
404        } else if (userLeaving) {
405			travelModel.findOne({
406				_id: req.params.travelid,
407				joins: userLeaving._id
408			})
409			.exec(function(err, travel){
410				if (err) return res.send(500, err.message);
411				if (!travel) {
412		            res.json({success: false, message: 'can not unjoin this travel'});
413		        } else if (travel) {
414					for(var i=0; i<travel.joins.length; i++)
415					{
416						if(travel.joins[i].equals(userLeaving._id))
417						{
418							travel.joins.splice(i, 1);
419						}
420					}
421					travel.save(function(err, travel) {
422						if(err) return res.send(500, err.message);
423						//start saving notification, get user owner of travel
424						userModel.findOne({_id: travel.user})
425						.exec(function(err, user){
426							if (err) return res.send(500, err.message);
427							if (!user) {
428					            res.json({success: false, message: 'User not found.'});
429					        } else if (user) {
430							//notification
431								var notification = new notificationModel({
432									concept: "leave",
433									message: "user "+userLeaving.username+" leaves your travel "+travel.title,
434									date: new Date(),
435									icon: 'ion-log-out',
436									link: "travels/" + travel._id,
437			                        user: user._id
438								});
439								notification.save(function(err, notification) {
440									if (err) return res.send(500, err.message);
441									user.notifications.push(notification._id);
442									user.save(function(err, user) {
443										if (err) return res.send(500, err.message);
444
445										console.log("notification saved");
446										exports.getTravelById(req, res);
447									});
448								});
449							}
450						});//end saving notification
451					});
452				}
453			});
454		}
455
456	});
457};
458
459
460
461
462
463//currently not used
464exports.addComment = function(req, res) {
465	/*var comment = new commentModel({
466		travelId: req.params.travelId,
467		commentUserId: req.body.commentUserId,
468		commentUsername: req.body.commentUsername,
469		comment: req.body.comment,
470		commentAvatar: req.body.commentAvatar
471	});
472
473	comment.save(function(err, comment) {
474		if(err) return res.send(500, err.message);
475    res.status(200).jsonp(comment);
476	});*/
477	userModel.find({
478		token: req.headers['x-access-token']
479	}, function(err, users){
480		var user=users[0];
481
482		travelModel.findById(req.params.travelId, function(err, travel){
483			console.log(travel.title);
484			var comment = {
485				commentUserId: user._id,
486				commentUsername: user.username,
487				comment: req.body.comment,
488				commentAvatar: user.avatar
489			};
490			travel.comments.push(comment);
491
492			travel.save(function(err, travel) {
493				if(err) return res.send(500, err.message);
494		    //res.status(200).jsonp(travel);
495				travelModel.find({date: {$gte: new Date()}}, function(err, travels) {
496				    if(err) res.send(500, err.message);
497						res.status(200).jsonp(travels);
498				});
499			});
500
501			//start saving notification, get user owner of travel
502			userModel.find({
503		      username: travel.owner
504		  }, function(err, userowners) {
505				var userowner=userowners[0];
506				//notification
507				var notification = {
508					concept: "comment",
509					otherusername: user.username,
510					description: "user "+user.username+" comments your travel "+travel.title,
511					date: new Date(),
512					link: "",
513					user: userowners[0]._id
514				};
515				userowner.notifications.push(notification);
516				userowner.save(function(err, userowner) {
517					console.log("notification saved");
518				});
519			});//end saving notification
520
521		});
522	});//end of userModel.find
523};
524//currently not used
525exports.getCommentsByTravelId = function(req, res) {
526    commentModel.find({
527      travelId: req.params.travelId
528  }, function(err, comments) {
529
530      if (err) throw err;
531
532      if (!comments) {
533        res.json({ success: false, message: 'no comments for travelId' });
534    } else if (comments) {
535          // return the information including token as JSON
536		 res.jsonp(comments);
537
538      }
539
540    });
541};