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