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};