arnaucube
arnaucube/socketioMEANseedPublic Self-hosted repository
socketioMEANseed/server/controllers/publicationController.js
server/controllers/publicationController.jsRaw
  1var express = require('express');
  2var app = express();
  3var publicationModel = require('../models/publicationModel');
  4var userModel = require('../models/userModel');
  5//var trainerModel = require('../models/trainerModel');
  6var crypto = require('crypto');
  7
  8/**GET '/publications' **/
  9exports.getAllPublications = function (req, res) {
 10    publicationModel.find()
 11    .limit(Number(req.query.pageSize))
 12    .skip(Number(req.query.pageSize)*Number(req.query.page))
 13    .lean()
 14    .populate('user', 'name avatar')
 15    .exec(function (err, publications) {
 16        if (err) return res.send(500, err.message);
 17        if (!publications) {
 18            //
 19        } else if (publications) {
 20            res.status(200).jsonp(publications);
 21        }
 22    });
 23};
 24/** GET '/publications/getById/:publicationid' **/
 25exports.getPublicationById = function (req, res) {
 26    publicationModel.findOne({_id: req.params.publicationid})
 27        .lean()
 28        .populate('likes', 'name avatar')
 29        .exec(function (err, publication) {
 30            if (err) return res.send(500, err.message);
 31            if (!publication) {
 32                res.json({success: false, message: 'publication not found.'});
 33            } else if (publication) {
 34                res.status(200).jsonp(publication);
 35            }
 36        });
 37};
 38/**POST '/publications' **/
 39exports.postPublication = function (req, res) {
 40    userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, user) {
 41        if (err) return res.send(500, err.message);
 42        if (!user) {
 43            res.json({success: false, message: 'user not found.'});
 44        } else if (user) {
 45            //aquí ja hem agafat el user a partir del seu token
 46            var publication = new publicationModel({
 47                title: req.body.title,
 48                content: req.body.content,
 49                date: new Date(),
 50                user: user._id,
 51                photo: req.body.photo
 52            });
 53            //fins aquí tenim la variable publication amb els continguts
 54            //ara cal 1r guardar el model publication a la base de dades
 55            publication.save(function (err, publication) {
 56                if (err) return res.send(500, err.message);
 57
 58                //i 2n, afegir la id de la publicació generada al user.publications
 59                user.publications.push(publication._id);
 60                /* gamification */
 61                var reward = {
 62                    concept: "added new publication to Timeline",
 63                    date: Date(),
 64                    value: +1
 65                };
 66                user.points.history.push(reward);
 67                user.points.total = user.points.total + 1;
 68                /* end of gamification */
 69                user.save(function (err, user) {
 70                    if (err) return res.send(500, err.message);
 71                    res.status(200).jsonp(user);
 72                });
 73            });
 74        }//end else if
 75    });
 76};
 77
 78/**GET '/users/:userid/publications' **/
 79exports.getUserPublicationsByUserId = function (req, res) {
 80    userModel.findOne({_id: req.params.userid}, function (err, user) {
 81        if (err) return res.send(500, err.message);
 82    }).populate('publications')
 83        .exec(function (error, user) {
 84            if (error !== null) res.send(500, error.message);
 85            console.log(JSON.stringify(user, null, "\t"));
 86            res.status(200).jsonp(user.publications);
 87        });
 88};
 89
 90/**DELETE '/publications/:publicationid' **/
 91exports.deletePublicationById = function (req, res) {
 92    userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, user) {
 93        if (err) return res.send(500, err.message);
 94        if (!user) {
 95            res.json({success: false, message: 'user not found.'});
 96        } else if (user) {
 97            for (var i = 0; i < user.publications.length; i++) {
 98                if (user.publications[i].equals(req.params.publicationid)) {//només si el user és qui ha fet la publication la pot esborrar
 99                    user.publications.splice(i, 1);
100                    user.save(function (err, user) {//guardem l'user
101                        if (err) return res.send(500, err.message);
102
103                        publicationModel.findByIdAndRemove({_id: req.params.publicationid}, function (err) {
104                            if (err !== null) return res.send(500, err.message);
105                            res.status(200).jsonp('Deleted');
106                        });
107                    });
108                }
109            }
110        }
111    });
112};
113
114/** POST '/publications/:publicationid/like' **/
115exports.likePublication = function (req, res) {
116    userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, user) {
117        if (err) return res.send(500, err.message);
118        if (!user) {
119            res.json({success: false, message: 'user not found.'});
120        } else if (user) {
121            console.log(user.name);
122            //ara busquem el userB
123            publicationModel.findOne({_id: req.params.publicationid}, function (err, publication) {
124                if (err) return res.send(500, err.message);
125                if (!publication) {
126                    res.json({success: false, message: 'publication not found.'});
127                } else if (publication) {
128
129                    //          for(var i=0; i<userB.timeline)
130                    publication.likes.push(user._id);
131                    publication.save(function (err, publication) {
132                        if (err) return res.send(500, err.message);
133
134                        /* gamification */
135                        var reward = {
136                            concept: "liked publication " + publication.title,
137                            date: Date(),
138                            value: +1
139                        };
140                        user.points.history.push(reward);
141                        user.points.total = user.points.total + 1;
142                        /* end of gamification */
143                        user.save(function (err, user) {
144                            if (err) return res.send(500, err.message);
145                            //ara busquem el user que ha fet la publication que ha rebut el like
146                            userModel.findOne({_id: publication.user})
147                            .exec(function (err, userB) {
148                                /*notification*/
149                                var notification = {
150                                    state: "pendent",
151                                    message: "user clicked like",
152                                    link: "user/"+userB._id,
153                                    icon: "newlike.png",
154                                    date: Date()
155                                };
156                                userB.notifications.push(notification);
157                                /* end of notification*/
158                                userB.save(function (err, user) {
159                                    if (err) return res.send(500, err.message);
160                                    publicationModel.findOne({_id: req.params.publicationid})
161                                    .lean()
162                                    .populate('user', 'name avatar')
163                                    .exec(function (err, publication) {
164                                        if (err) return res.send(500, err.message);
165                                        if (!publication) {
166                                            //
167                                        } else if (publication) {
168                                            res.status(200).jsonp(publication);
169                                        }
170                                    });
171                                });
172                            });
173
174                        });
175
176                    });
177                }//end else if
178            });
179        }//end else if
180    });
181};
182
183/** POST '/publications/:publicationid/dislike' **/
184exports.dislikePublication = function (req, res) {
185    userModel.findOne({'tokens.token': req.headers['x-access-token']}, function (err, user) {
186        if (err) return res.send(500, err.message);
187        if (!user) {
188            res.json({success: false, message: 'user not found.'});
189        } else if (user) {
190            console.log(user.name);
191            //ara busquem el userB
192            publicationModel.findOne({_id: req.params.publicationid}, function (err, publication) {
193                if (err) return res.send(500, err.message);
194                if (!publication) {
195                    res.json({success: false, message: 'publication not found.'});
196                } else if (publication) {
197
198                    for (var i = 0; i < publication.likes.length; i++) {
199                        if (publication.likes[i].equals(user._id)) {
200                            publication.likes.splice(i, 1);
201                        }
202                    }
203                    publication.save(function (err, publication) {
204                        if (err) return res.send(500, err.message);
205
206                        /* gamification */
207                        var reward = {
208                            concept: "disliked publication " + publication.title,
209                            date: Date(),
210                            value: -1
211                        };
212                        user.points.history.push(reward);
213                        user.points.total = user.points.total - 1;
214                        /* end of gamification */
215                        user.save(function (err, user) {
216                            if (err) return res.send(500, err.message);
217
218                            publicationModel.findOne({_id: req.params.publicationid})
219                                .lean()
220                                .populate('user', 'name avatar')
221                                .exec(function (err, publication) {
222                                    if (err) return res.send(500, err.message);
223                                    if (!publication) {
224                                        //
225                                    } else if (publication) {
226                                        res.status(200).jsonp(publication);
227                                    }
228                                });
229                        });
230                    });
231                }//end else if
232            });
233        }//end else if
234    });
235};
236
237/** GET '/publications/newsfeed' **/
238var ObjectId = require('mongodb').ObjectID;
239exports.getNewsFeed = function (req, res) {//getPublicationsFromFollowingUsers
240    //primer agafem l'user que fa la petició, per saber quins users està seguint
241    var newsfeed = [];
242    userModel.findOne({'tokens.token': req.headers['x-access-token']})
243        .exec(function (err, user) {
244            if (err) return res.send(500, err.message);
245            if (!user) {
246                res.json({success: false, message: 'getting newsfeed failed. user not found.'});
247            } else if (user) {
248                console.log("getting newsfeed for user: " + user.name);
249
250                var following = [];
251                for (var i = 0; i < user.following.length; i++) {//això ho fem perquè necessitem la array amb el contingut en format objectid
252                    following.push(new ObjectId(user.following[i]));
253                }
254                following.push(new ObjectId(user._id));//així també reb les seves pròpies publicacions
255
256                publicationModel.find({user: {$in: following}})
257                    .lean()
258                    .populate('user', 'name avatar')
259                    .exec(function (err, publications) {
260                        if (err) return res.send(500, err.message);
261                        if (!publications) {
262                            //
263                        } else if (publications) {
264                            res.status(200).jsonp(publications);
265                        }
266                    });
267            }
268        });
269};