Commit d51337d0afb9e1157c7fd4662b43dd65ef09d643

Authored by Geoffrey PREUD'HOMME
1 parent a470afda

Améliorations diverses API

* Simplifié le code route
* Possibilité de mixer arguments url et post data
app/routes/ApiRtes.js
... ... @@ -18,30 +18,75 @@ var api = express();
18 18 // Connection à la BDD
19 19 mongoose.connect(require('../../config/db').url);
20 20  
21   -// Authentication
22   -reqAuth = function () {
23   - return function (req, res, next) {
24   - if (req.session.data && req.session.data.login) {
25   - next();
  21 +// Fonctions diverses
  22 +ensureOkay = function (res, status, cb) {
  23 + // TODO Statut par défaut / optionnel
  24 + // status = 500;
  25 + return function (err, data) {
  26 + // TODO Différencier data non-présent / faux
  27 + if (err) {
  28 + res.status(status).json(err);
26 29 } else {
27   - res.status(401).end();
  30 + cb(data);
28 31 }
29 32 };
30 33 };
31 34  
  35 +giveBackNull = function (res, status) {
  36 + // TODO Statut par défaut / optionnel
  37 + // status = 200;
  38 + return ensureOkay(res, 404, function (data) {
  39 + res.status(status);
  40 + if (status != 204 && status != 205) {
  41 + res.json(data);
  42 + } else {
  43 + res.end();
  44 + }
  45 + });
  46 +};
  47 +
  48 +ensureExists = function (res, status, cb) {
  49 + // TODO Statut par défaut / optionnel
  50 + // status = 404;
  51 + return ensureOkay(res, 500, function (data) {
  52 + if (data) {
  53 + cb(data);
  54 + } else {
  55 + res.status(status).end();
  56 + }
  57 + });
  58 +};
  59 +
  60 +giveBack = function (res, status) {
  61 + // TODO Statut par défaut / optionnel
  62 + // status = 200;
  63 + return ensureExists(res, 404, function (data) {
  64 + res.status(status);
  65 + if (status != 204 && status != 205) {
  66 + res.json(data);
  67 + } else {
  68 + res.end();
  69 + }
  70 + });
  71 +};
  72 +
  73 +// Authentication
  74 +reqAuth = function (req, res, next) {
  75 + if (req.session.data && req.session.data.login) {
  76 + next();
  77 + } else {
  78 + res.status(401).end();
  79 + }
  80 +};
  81 +
32 82 reqVerified = function (verify) { // Assert mais pour les droits (d'où le 403)
33 83 return function (req, res, next) {
34   - reqAuth()(req, res, function () {
35   - verify(req, res, function (err, verified) {
36   - if (err) {
37   - res.status(500).send(err);
38   - } else {
39   - if (verified) {
40   - next();
41   - } else {
42   - res.status(403).end();
43   - }
44   - }
  84 + reqAuth(req, res, function () {
  85 + verify(req, res, function (err, data) {
  86 + cb = ensureExists(res, 403, function () {
  87 + next(); // Si on passe quoi que ce soit à next(), erreur 500
  88 + });
  89 + cb(err, data);
45 90 });
46 91 });
47 92 };
... ... @@ -53,31 +98,19 @@ reqOwn = function (objName) {
53 98 });
54 99 };
55 100  
56   -reqMembre = function () {
57   - return reqVerified(function (req, res, cb) {
58   - cb(null, req.session.data.membre);
59   - });
60   -};
  101 +reqMembre = reqVerified(function (req, res, cb) {
  102 + cb(null, req.session.data.membre);
  103 +});
61 104  
62   -reqBureau = function () {
63   - return reqVerified(function (req, res, cb) {
64   - cb(null, req.session.data.bureau);
65   - });
66   -};
  105 +reqBureau = reqVerified(function (req, res, cb) {
  106 + cb(null, req.session.data.bureau);
  107 +});
67 108  
68 109 assert = function (test) {
69 110 return function (req, res, next) {
70   - test(req, res, function (err, verified) {
71   - if (err) {
72   - res.status(500).send(err);
73   - } else {
74   - if (verified) {
75   - next();
76   - } else {
77   - res.status(400).end();
78   - }
79   - }
80   - });
  111 + test(req, res, ensureExists(res, 400, function () {
  112 + next();
  113 + }));
81 114 };
82 115 };
83 116  
... ... @@ -94,6 +127,7 @@ decrypt = function () {
94 127 };
95 128 };
96 129  
  130 +
97 131 // Sessions
98 132  
99 133 sessionData = function (session, cb) {
... ... @@ -130,241 +164,136 @@ api.get('/session', function (req, res) { // Informations sur la session
130 164 api.post('/session', decrypt(), assert(function (req, res, cb) {
131 165 cb(null, req.body && typeof req.body.login == 'string' && req.body.login !== '' && typeof req.body.pass == 'string' && req.body.pass !== '');
132 166 }), function (req, res) { // Se connecter
133   - PolyUserServ.verify(req.body.login, req.body.pass, function (err, verified) {
134   - if (err) {
135   - res.status(500).send(err);
136   - } else {
137   - if (verified) {
138   - sessionData({
139   - login: req.body.login
140   - }, function (session) {
141   - req.session.data = session;
142   - req.session.save(function (err) {
143   - if (err) {
144   - res.status(500).end(err);
145   - } else {
146   - res.status(201).send(session);
147   - }
148   - });
149   - });
150   - } else {
151   - req.session.destroy(function (err) {
  167 + PolyUserServ.verify(req.body.login, req.body.pass, ensureOkay(res, 500, function (verified) {
  168 + if (verified) {
  169 + sessionData({
  170 + login: req.body.login
  171 + }, function (session) {
  172 + req.session.data = session;
  173 + req.session.save(function (err) {
152 174 if (err) {
153   - res.status(500).end(err);
  175 + res.status(500).json(err);
154 176 } else {
155   - res.status(401).end();
  177 + res.status(201).json(session);
156 178 }
157 179 });
158   - }
  180 + });
  181 + } else {
  182 + req.session.destroy(ensureOkay(res, 500, function () {
  183 + res.status(401).end();
  184 + }));
159 185 }
160   - });
  186 + }));
161 187 });
162 188  
163 189 api.delete('/session', function (req, res) { // Se déconnecter
164 190 req.session.destroy();
165   - res.status(200).end();
  191 + res.status(205).end();
166 192 });
167 193  
168 194  
169 195 // Membres
170 196 api.get('/membres', function (req, res) { // Liste des membres
171   - MembresServ.list(function (err, membres) {
172   - if (err)
173   - res.status(500).send(err);
174   - else
175   - res.json(membres);
176   - });
  197 + MembresServ.list(giveBack(res, 200));
177 198 });
178 199  
179 200 api.post('/membres', assert(function (req, res, cb) {
180 201 cb(null, typeof req.body.login == 'string' && req.body.login !== '');
181   -}), reqBureau(), function (req, res) { // Ajout d'un membre
182   - MembresServ.add(req.body, function (err, membre) {
183   - if (err)
184   - res.status(500).send(err);
185   - else
186   - res.json(membre);
187   - });
  202 +}), reqBureau, function (req, res) { // Ajout d'un membre
  203 + MembresServ.add(req.body, giveBack(res, 201));
188 204 });
189 205  
190   -api.delete('/membres/:membre_id', reqBureau(), function (req, res) { // Supression d'un membre
191   - MembresServ.remove(req.params.membre_id, function (err, membre) {
192   - if (err)
193   - res.status(500).send(err);
194   - else
195   - res.json(null);
196   - });
  206 +api.delete('/membres/:membre_id', reqBureau, function (req, res) { // Supression d'un membre
  207 + MembresServ.remove(req.params.membre_id, giveBack(res, 205));
197 208 });
198 209  
199 210 // Dossiers
200   -api.get('/dosss/:doss_id', reqAuth(), function (req, res) { // Un doss
  211 +api.get('/dosss/:doss_id', reqAuth, function (req, res) { // Un doss
201 212 // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
202 213 // TODO Requêtes séparées ?
203   - DosssServ.get(req.params.doss_id, function (err, doss) { // TODO Async
204   - if (err) {
205   - res.status(500).send(err);
206   - } else if (!doss) {
207   - res.status(404).end();
208   - } else {
209   - DosssServ.children(doss._id, function (err, dosss) {
210   - if (err) {
211   - res.status(500).send(err);
212   - } else {
213   - doss.dosss = dosss;
214   - ConvsServ.children(doss._id, function (err, convs) {
215   - if (err) {
216   - res.status(500).send(err);
217   - } else {
218   - doss.convs = convs;
219   - res.json(doss);
220   - }
221   - });
222   - }
223   - });
224   - }
225   - });
  214 + // TODO Async
  215 + DosssServ.get(req.params.doss_id, ensureExists(res, 404, function (doss) {
  216 + DosssServ.children(doss._id, ensureOkay(res, 500, function (dosss) {
  217 + ConvsServ.children(doss._id, ensureOkay(res, 500, function (convs) {
  218 + doss.dosss = dosss;
  219 + doss.convs = convs;
  220 + res.json(doss);
  221 + }));
  222 + }));
  223 + }));
226 224 });
227 225  
228   -api.post('/dosss', reqMembre(), function (req, res) { // Ajout d'un doss
  226 +api.post('/dosss', reqMembre, function (req, res) { // Ajout d'un doss
229 227 // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
230 228 DosssServ.getId(req.body.parent, function (parent) { // TODO Async
231 229 req.body.parent = parent;
232   - DosssServ.add(req.body, function (err, doss) {
233   - if (err)
234   - res.status(500).send(err);
235   - else
236   - res.json(doss);
237   - });
  230 + DosssServ.add(req.body, giveBackNull(res, 201));
238 231 });
239 232 });
240 233  
241   -api.delete('/dosss/:doss_id', reqBureau(), function (req, res) { // Supression d'un doss
242   - DosssServ.remove(req.params.doss_id, function (err, doss) {
243   - if (err)
244   - res.status(500).send(err);
245   - else
246   - res.json(null);
247   - });
  234 +api.delete('/dosss/:doss_id', reqBureau, function (req, res) { // Supression d'un doss
  235 + DosssServ.remove(req.params.doss_id, giveBackNull(res, 205));
248 236 });
249 237  
250 238 // Conversations
251 239  
  240 +getSubject = function (modl) {
  241 + // TODO Gérer les dossiers
  242 + return function (req, res, next) {
  243 + modl.findById(req.params._id, ensureExists(res, 404, function (data) {
  244 + req.subject = data;
  245 + next();
  246 + }));
  247 + };
  248 +};
  249 +
252 250 getConv = function (req, res, next) {
253   - ConvModl.findById(req.params.conv_id, function (err, conv) {
254   - if (err) {
255   - res.status(500).json(err);
256   - } else {
257   - if (conv) {
258   - req.conv = conv;
259   - next();
260   - } else {
261   - res.status(404).end();
262   - }
263   - }
264   - });
  251 + ConvModl.findById(req.params.conv_id, ensureExists(res, 404, function (data) {
  252 + req.conv = conv;
  253 + next();
  254 + }));
265 255 };
266 256  
267   -api.get('/convs/:conv_id', reqAuth(), getConv, function (req, res) { // Une conv
268   - res.json(req.conv);
  257 +api.get('/convs/:_id', reqAuth, getSubject(ConvModl), function (req, res) { // Une conv
  258 + res.json(req.subject);
269 259 });
270 260  
271   -api.post('/convs', reqMembre(), function (req, res) { // Ajout d'un conv
  261 +// Ajout d'un conv
  262 +api.post('/convs', reqMembre, function (req, res) {
272 263 // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
273 264 DosssServ.getId(req.body.parent, function (parent) { // TODO Async
274 265 req.body.parent = parent;
275   - ConvsServ.add(req.body, function (err, conv) {
276   - if (err)
277   - res.status(500).send(err);
278   - else
279   - res.json(conv);
280   - });
  266 + ConvsServ.add(req.body, giveBack(res, 201));
281 267 });
282 268 });
283 269  
284   -api.delete('/convs/:conv_id', reqBureau(), getConv, function (req, res) { // Supression d'un conv
285   - req.conv.remove(function (err) {
286   - if (err) // TODO Fonction propre
287   - res.status(500).send(err);
288   - else
289   - res.status(205).end();
290   - });
  270 +// Supression d'un conv
  271 +api.delete('/convs/:_id', reqBureau, getSubject(ConvModl), function (req, res) {
  272 + req.subject.remove(giveBack(res, 205));
291 273 });
292 274  
293 275 // Messages
294   -api.get('/messs/:conv_id', reqAuth(), function (req, res) { // Liste des messs
295   - MessServ.list(req.params.conv_id, function (err, messs) {
296   - if (err)
297   - res.status(500).send(err);
298   - else
299   - res.json(messs);
300   - });
301   -});
302 276  
303   -// api.get('/messs/:mess_id', reqAuth(), function (req, res) { // Une mess
304   -// MessServ.get(req.params.mess_id, function (err, mess) {
305   -// if (err)
306   -// res.status(500).send(err);
307   -// else
308   -// res.json(mess);
309   -// });
310   -// });
  277 +api.get('/messs/:conv_id', reqAuth, function (req, res) { // Liste des messs
  278 + MessServ.list(req.params.conv_id, giveBackNull(res, 200));
  279 +});
311 280  
312   -api.post('/messs', reqMembre(), function (req, res) { // Ajout d'un mess
  281 +api.post('/messs', reqMembre, function (req, res) { // Ajout d'un mess
313 282 data = req.body;
314 283 data.login = req.session.data.login;
315   - MessServ.add(data, function (err, mess) {
316   - if (err)
317   - res.status(500).send(err);
318   - else
319   - res.json(mess);
320   - });
  284 + MessServ.add(data, giveBack(res, 201));
321 285 });
322 286  
323   -api.put('/messs', reqMembre(), function (req, res, next) { // Édition d'un mess
324   - MessModl.findById(req.body._id, function (err, mess) { // TODO Fonction propre
325   - // TODO Utiliser req.params
326   - if (err) {
327   - res.status(500).json(err);
328   - } else {
329   - if (mess) {
330   - req.mess = mess;
331   - next();
332   - } else {
333   - res.status(404).end();
334   - }
335   - }
336   - });
337   -}, reqOwn('mess'), function (req, res) {
338   - req.mess.content = req.body.content;
  287 +// Édition d'un mess
  288 +api.put('/messs/:_id', reqMembre, getSubject(MessModl), reqOwn('mess'), function (req, res) {
  289 + req.subject.content = req.body.content;
339 290 // TODO Edit date
340   - req.mess.save(function (err, mess) {
341   - if (err) // TODO Fonction propre
342   - res.status(500).send(err);
343   - else
344   - res.json(mess);
345   - });
  291 + req.subject.save(giveBack(res, 201));
346 292 });
347 293  
348   -api.delete('/messs/:mess_id', reqMembre(), function (req, res, next) { // Supression d'un mess
349   - MessModl.findById(req.params.mess_id, function (err, mess) { // TODO Fonction propre
350   - if (err) {
351   - res.status(500).json(err);
352   - } else {
353   - if (mess) {
354   - req.mess = mess;
355   - next();
356   - } else {
357   - res.status(404).end();
358   - }
359   - }
360   - });
361   -}, reqOwn('mess'), function (req, res) {
362   - req.mess.remove(function (err) {
363   - if (err) // TODO Fonction propre
364   - res.status(500).send(err);
365   - else
366   - res.status(205).end();
367   - });
  294 +// Supression d'un mess
  295 +api.delete('/messs/:_id', reqMembre, getSubject(MessModl), reqOwn('mess'), function (req, res) {
  296 + req.subject.remove(giveBack(res, 205));
368 297 });
369 298  
370 299 api.all('/coffee', function (req, res) {
... ...
public/js/controllers/ForumConvCtrl.js
... ... @@ -8,10 +8,10 @@ angular.module('ForumConvCtrl', ['SessionsServ', 'ApiServ', 'MessEditDrct'])
8 8 SessionServ.onChange(function () {
9 9 $scope.session = SessionServ.cur;
10 10 });
11   - ApiServ("récupération de la conversation", 'get', 'convs', $routeParams.conv_id, function (err, conv) {
  11 + ApiServ("récupération de la conversation", 'get', ['convs', $routeParams.conv_id], null, function (err, conv) {
12 12 if (!err) {
13 13 $scope.conv = conv;
14   - ApiServ("récupération des messages", 'get', 'messs', conv._id, function (err, messs) {
  14 + ApiServ("récupération des messages", 'get', ['messs', conv._id], null, function (err, messs) {
15 15 if (!err) {
16 16 $scope.messs = messs;
17 17 }
... ... @@ -33,7 +33,7 @@ angular.module('ForumConvCtrl', ['SessionsServ', 'ApiServ', 'MessEditDrct'])
33 33 };
34 34  
35 35 $scope.delMess = function (index) {
36   - ApiServ("suppression du message", 'delete', 'messs', $scope.messs[index]._id, function (err) {
  36 + ApiServ("suppression du message", 'delete', ['messs', $scope.messs[index]._id], null, function (err) {
37 37 if (!err)
38 38 $scope.messs.splice(index, 1);
39 39 });
... ... @@ -42,9 +42,10 @@ angular.module('ForumConvCtrl', ['SessionsServ', 'ApiServ', 'MessEditDrct'])
42 42 $scope.editButton = function (index) {
43 43 mess = $scope.messs[index];
44 44 if (mess.editMode) {
45   - ApiServ("édition du message", 'put', 'messs', mess, function (err, data) {
  45 + ApiServ("édition du message", 'put', ['messs', mess._id], {
  46 + content: mess.content
  47 + }, function (err, data) {
46 48 if (!err) {
47   - console.log(data);
48 49 mess.content = data.content;
49 50 mess.editDate = data.editDate;
50 51 mess.editMode = false;
... ...
public/js/controllers/ForumDirCtrl.js
... ... @@ -10,7 +10,7 @@ angular.module('ForumDirCtrl', ['SessionsServ', 'ApiServ'])
10 10 $scope.session = SessionServ.cur;
11 11 });
12 12  
13   - ApiServ("récupération du dossier", 'get', 'dosss', $routeParams.doss_id, function (err, doss) {
  13 + ApiServ("récupération du dossier", 'get', ['dosss', $routeParams.doss_id], null, function (err, doss) {
14 14 if (err) {
15 15 console.error(err);
16 16 } else {
... ... @@ -24,7 +24,6 @@ angular.module('ForumDirCtrl', ['SessionsServ', 'ApiServ'])
24 24  
25 25 // Dossiers
26 26 $scope.addDoss = function () {
27   - console.log('CALLA');
28 27 $scope.formDoss.parent = $routeParams.doss_id;
29 28 ApiServ("création du dossier", 'post', 'dosss', $scope.formDoss, function (err, doss) {
30 29 if (!err) {
... ... @@ -35,7 +34,7 @@ angular.module('ForumDirCtrl', ['SessionsServ', 'ApiServ'])
35 34 };
36 35  
37 36 $scope.delDoss = function (index) {
38   - ApiServ("suppression du dossier", 'delete', 'dosss', $scope.dosss[index]._id, function (err) {
  37 + ApiServ("suppression du dossier", 'delete', ['dosss', $scope.dosss[index]._id], null, function (err) {
39 38 if (!err)
40 39 $scope.dosss.splice(index, 1);
41 40 });
... ... @@ -53,7 +52,7 @@ angular.module('ForumDirCtrl', ['SessionsServ', 'ApiServ'])
53 52 };
54 53  
55 54 $scope.delConv = function (index) {
56   - ApiServ("suppression de la conversation", 'delete', 'convs', $scope.convs[index]._id, function (err) {
  55 + ApiServ("suppression de la conversation", 'delete', ['convs', $scope.convs[index]._id], null, function (err) {
57 56 if (!err)
58 57 $scope.convs.splice(index, 1);
59 58 });
... ...
public/js/controllers/MembreCtrl.js
... ... @@ -8,7 +8,7 @@ angular.module('MembreCtrl', ['SessionsServ', 'ApiServ', 'ui.sortable'])
8 8 $scope.session = SessionServ.cur;
9 9 });
10 10  
11   - ApiServ("récupération de la liste des membres", 'get', 'membres', function (err, membres) {
  11 + ApiServ("récupération de la liste des membres", 'get', 'membres', null, function (err, membres) {
12 12 if (!err)
13 13 $scope.membres = membres;
14 14 });
... ... @@ -29,7 +29,7 @@ angular.module('MembreCtrl', ['SessionsServ', 'ApiServ', 'ui.sortable'])
29 29 };
30 30  
31 31 $scope.deleteMembre = function (index) {
32   - ApiServ("création du membre", 'delete', 'membres', $scope.membres[index]._id, function (err, data) {
  32 + ApiServ("création du membre", 'delete', ['membres', $scope.membres[index]._id], null, function (err, data) {
33 33 if (!err) {
34 34 $scope.membres.splice(index, 1);
35 35 }
... ...
public/js/services/ApiServ.js
1 1 angular.module('ApiServ', ['NotifyServ'])
2 2 .service('ApiServ', function ($http, NotifyServ) {
3   - return function (name, method, href) {
4   - var cb;
5   - link = '/api/' + href;
6   - arglen = arguments.length;
7   - if (typeof arguments[arglen - 1] == 'function') {
8   - cb = arguments[arglen - 1];
9   - arglen--;
10   - } else {
  3 + return function (name, method, params, data, cb) {
  4 + if (!cb) {
11 5 cb = function () {
12 6 return undefined;
13 7 };
14 8 }
15 9  
16   - if (method == 'get' || method == 'delete') { // TODO url & data en même temps
17   - for (arg = 3; arg < arglen; arg++) {
18   - link += '/' + arguments[arg];
19   - }
20   - request = $http[method](link);
21   - } else {
22   - request = $http[method](link, arguments[3]);
  10 + link = '/api';
  11 + if (typeof params == 'string') {
  12 + params = [params];
23 13 }
24   - request
  14 + for (var param in params) {
  15 + link += '/' + params[param];
  16 + }
  17 + $http[method](link, data)
25 18 .success(function (data) {
26 19 cb(null, data);
27 20 })
... ...
public/views/membres.html
... ... @@ -10,7 +10,7 @@
10 10 <th>Nom</th>
11 11 <th>Section</th>
12 12 <th>Rôle</th>
13   - <th ng-show="session.canAddMembre || session.canDelMembre">Action</th>
  13 + <th ng-show="session.bureau">Action</th>
14 14 </tr>
15 15 </thead>
16 16 <tbody as-sortable="dragControlListeners" ng-model="membres">
... ... @@ -18,7 +18,7 @@
18 18 <td>{{ membre.nom }}</td>
19 19 <td>{{ membre.section }}</td>
20 20 <td>{{ membre.role }}</td>
21   - <td ng-show="session.canDelMembre">
  21 + <td ng-show="session.bureau">
22 22 <button type="button" class="btn btn-default" aria-label="Déplacer" data-as-sortable-item-handle>
23 23 <span class="glyphicon glyphicon-resize-vertical" aria-hidden="true"></span>
24 24 </button>
... ... @@ -28,7 +28,7 @@
28 28 </td>
29 29 </tr>
30 30 </tbody>
31   - <tfoot id="membre-form" ng-show="session.canAddMembre">
  31 + <tfoot id="membre-form" ng-show="session.bureau">
32 32 <tr class="form-group">
33 33 <td>
34 34 <input type="text" class="form-control input-lg" placeholder="Login Polytech" ng-model="formData.login">
... ... @@ -46,4 +46,4 @@
46 46 </tr>
47 47 </tfoot>
48 48 </table>
49 49 -</div>
  50 +</div>
50 51 \ No newline at end of file
... ...