Blame view

app/routes/ApiRtes.js 10 KB
7a1fe62d   Geoffrey PREUD'HOMME   Consistence des noms
1
  var MembresServ = require('../services/MembresServ');
7664a626   Geoffrey PREUD'HOMME   Support de la nui...
2
  var NinfoServ = require('../services/NinfoServ');
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
3
  var PolyUserServ = require('../services/PolyUserServ');
7a1fe62d   Geoffrey PREUD'HOMME   Consistence des noms
4
  var DecryptServ = require('../services/DecryptServ');
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
5
  var DosssServ = require('../services/DosssServ');
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
6
  var ConvsServ = require('../services/ConvsServ');
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
7
  var MessServ = require('../services/MessServ');
07298877   Geoffrey PREUD'HOMME   Session: secret g...
8
  var fs = require('fs');
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
9
  var async = require('async');
fb8f1174   Geoffrey PREUD'HOMME   Utilisation de mo...
10
  var mongoose = require('mongoose');
0bda071e   Geoffrey PREUD'HOMME   Reroutage
11
  var express = require('express');
07298877   Geoffrey PREUD'HOMME   Session: secret g...
12
13
  var session = require('express-session');
  var MongoStore = require('connect-mongo')(session);
0bda071e   Geoffrey PREUD'HOMME   Reroutage
14
  
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
15
  var api = express();
0bda071e   Geoffrey PREUD'HOMME   Reroutage
16
  
fb8f1174   Geoffrey PREUD'HOMME   Utilisation de mo...
17
18
19
  // Connection à la BDD
  mongoose.connect(require('../../config/db').url);
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
20
21
22
23
24
25
26
27
  // Fonctions diverses
  ensureOkay = function (res, status, cb) {
      // TODO Statut par défaut / optionnel
      // status = 500;
      return function (err, data) {
          // TODO Différencier data non-présent / faux
          if (err) {
              res.status(status).json(err);
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
28
          } else {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
29
              cb(data);
89bc7c99   Geoffrey PREUD'HOMME   Améliorations div...
30
          }
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
31
32
33
      };
  };
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
34
  giveNull = function (res, status) {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
35
36
37
      // TODO Statut par défaut / optionnel
      // status = 200;
      return ensureOkay(res, 404, function (data) {
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
38
          res.status(status).end();
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
      });
  };
  
  ensureExists = function (res, status, cb) {
      // TODO Statut par défaut / optionnel
      // status = 404;
      return ensureOkay(res, 500, function (data) {
          if (data) {
              cb(data);
          } else {
              res.status(status).end();
          }
      });
  };
  
  giveBack = function (res, status) {
      // TODO Statut par défaut / optionnel
      // status = 200;
      return ensureExists(res, 404, function (data) {
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
58
59
  
          res.status(status).json(data);
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
60
61
62
63
      });
  };
  
  // Authentication
7664a626   Geoffrey PREUD'HOMME   Support de la nui...
64
65
66
67
68
  addLogin = function (req, res, next) {
      req.body.login = req.session.data.login;
      next();
  };
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
69
70
71
72
73
74
75
76
  reqAuth = function (req, res, next) {
      if (req.session.data && req.session.data.login) {
          next();
      } else {
          res.status(401).end();
      }
  };
  
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
77
  reqVerified = function (verify) { // Assert mais pour les droits (d'où le 403)
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
78
      return function (req, res, next) {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
79
          reqAuth(req, res, function () {
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
80
81
82
              verify(req, res, ensureExists(res, 403, function () {
                  next(); // Si on passe quoi que ce soit à next(), erreur 500
              }));
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
83
84
85
86
          });
      };
  };
  
a470afda   Geoffrey PREUD'HOMME   Simplification de...
87
  reqOwn = function (objName) {
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
88
      return reqVerified(function (req, res, cb) {
a470afda   Geoffrey PREUD'HOMME   Simplification de...
89
90
91
92
          cb(null, req.session.data.bureau || req[objName].login == req.session.data.login);
      });
  };
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
93
94
95
  reqMembre = reqVerified(function (req, res, cb) {
      cb(null, req.session.data.membre);
  });
a470afda   Geoffrey PREUD'HOMME   Simplification de...
96
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
97
98
99
  reqBureau = reqVerified(function (req, res, cb) {
      cb(null, req.session.data.bureau);
  });
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
100
101
102
  
  assert = function (test) {
      return function (req, res, next) {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
103
104
105
          test(req, res, ensureExists(res, 400, function () {
              next();
          }));
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
106
107
108
      };
  };
  
89bc7c99   Geoffrey PREUD'HOMME   Améliorations div...
109
110
111
112
113
114
115
116
117
118
119
120
  decrypt = function () {
      return function (req, res, next) {
          assert(function (req, res, cb) {
              cb(null, req.body && typeof req.body[0] == 'string' && req.body[0] !== '');
          })(req, res, function () {
              DecryptServ.decrypt(req.body[0], function (data) {
                  req.body = JSON.parse(data);
                  next();
              });
          });
      };
  };
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
121
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
122
  
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
123
  // Sessions
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
124
  sessionData = function (session, cb) {
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
125
126
127
128
129
130
131
132
133
134
135
136
137
138
      async.parallel([
          function (cba) {
              PolyUserServ.get(session.login, cba);
          },
          function (cba) {
              MembresServ.estMembre(session.login, cba);
          },
          function (cba) {
              MembresServ.estBureau(session.login, cba);
          }
      ], function (err, res) {
          if (err) {
              cb(err);
          } else {
d0649a9e   Geoffrey PREUD'HOMME   Gestion des non é...
139
              for (var attrname in res[0]) { session[attrname] = res[0][attrname]; }
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
140
141
              session.membre = res[1];
              session.bureau = res[2];
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
142
143
              cb(null, session);
          }
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
144
145
146
147
      });
  };
  
  api.use(session({
fb8f1174   Geoffrey PREUD'HOMME   Utilisation de mo...
148
149
150
      store: new MongoStore({
          mongooseConnection: mongoose.connection
      }),
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
151
152
      name: 'membreCool',
      resave: false,
6ac9921a   Geoffrey PREUD'HOMME   Message cookies
153
      saveUninitialized: false,
07298877   Geoffrey PREUD'HOMME   Session: secret g...
154
155
156
      secret: fs.readFileSync('config/session_secret', {
          encoding: 'UTF8'
      })
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
157
158
159
160
  }));
  
  api.get('/session', function (req, res) { // Informations sur la session
      res.send(req.session.data);
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
161
162
  });
  
89bc7c99   Geoffrey PREUD'HOMME   Améliorations div...
163
164
165
  api.post('/session', decrypt(), assert(function (req, res, cb) {
      cb(null, req.body && typeof req.body.login == 'string' && req.body.login !== '' && typeof req.body.pass == 'string' && req.body.pass !== '');
  }), function (req, res) { // Se connecter
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
166
167
168
169
      PolyUserServ.verify(req.body.login, req.body.pass, ensureOkay(res, 500, function (verified) {
          if (verified) {
              sessionData({
                  login: req.body.login
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
170
              }, ensureOkay(res, 500, function (session) {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
171
                  req.session.data = session;
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
172
173
174
175
                  req.session.save(ensureOkay(res, 500, function () {
                      res.status(201).json(session);
                  }));
              }));
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
176
177
178
179
          } else {
              req.session.destroy(ensureOkay(res, 500, function () {
                  res.status(401).end();
              }));
89bc7c99   Geoffrey PREUD'HOMME   Améliorations div...
180
          }
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
181
      }));
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
182
  });
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
183
184
  
  api.delete('/session', function (req, res) { // Se déconnecter
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
185
      req.session.destroy();
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
186
      res.status(205).end();
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
187
  });
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
188
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
189
190
191
192
193
194
195
196
  getSubject = function (serv) { // Fonction générique pour récupérer un objet spécifié dans l'URL
      return function (req, res, next) {
          serv.get(req.params._id, ensureExists(res, 404, function (data) {
              req.subject = data;
              next();
          }));
      };
  };
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
197
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
198
199
200
201
202
  assertSubject = function (serv) {
      return assert(function (req, res, cb) {
          serv.assert(req.body, cb);
      });
  };
0bda071e   Geoffrey PREUD'HOMME   Reroutage
203
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
204
205
  addSubject = function (serv) {
      return function (req, res) {
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
206
          serv.add(req.body, ensureExists(res, 404, function (membre) {
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
207
              serv.simpleData(membre, giveBack(res, 201));
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
208
          }));
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
      };
  };
  
  delSubject = function (serv) {
      return function (req, res) {
          serv.remove(req.subject, giveNull(res, 205));
      };
  };
  
  // Membres
  
  // Liste des membres
  api.get('/membres', function (req, res) {
      MembresServ.list(ensureExists(res, 404, function (membres) {
          async.map(membres, MembresServ.simpleData, function (err, data) {
              giveBack(res, 200)(err, data);
          });
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
226
      }));
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
227
  });
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
228
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
229
230
  // Ajout d'un membre
  api.post('/membres', reqBureau, assertSubject(MembresServ), function (req, res) {
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
231
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
232
233
234
235
      MembresServ.add(req.body, ensureExists(res, 404, function (membre) {
  
          MembresServ.simpleData(membre, giveBack(res, 201));
      }));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
236
237
  });
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
238
239
  // Supression d'un membre
  api.delete('/membres/:_id', reqBureau, getSubject(MembresServ), delSubject(MembresServ));
a470afda   Geoffrey PREUD'HOMME   Simplification de...
240
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
241
  
7664a626   Geoffrey PREUD'HOMME   Support de la nui...
242
243
244
245
246
  // Nuit de l'Info
  
  // Obtenir les préférences
  api.get('/profile/ninfo', reqAuth, addLogin, function(req, res) {
      NinfoServ.getLogin(req.body.login, function(err, ninfo) {
7664a626   Geoffrey PREUD'HOMME   Support de la nui...
247
248
249
250
251
252
253
          NinfoServ.simpleData(ninfo, giveBack(res, 200));
      });
  });
  
  // Mettre à jour les préférences
  api.put('/profile/ninfo', reqAuth, addLogin, assertSubject(NinfoServ), addSubject(NinfoServ));
  
446e0b33   Geoffrey PREUD'HOMME   Affichage des par...
254
255
256
257
258
  // Lister les participants
  api.get('/ninfo', reqAuth, function(req, res) {
      NinfoServ.list(function (err, participants) {
          async.reduce(NinfoServ.equipes, {}, function(memo, nomEquipe, cb) {
              async.filter(participants, function concerne(participant, cbf) {
446e0b33   Geoffrey PREUD'HOMME   Affichage des par...
259
260
                  cbf(participant.equipe == nomEquipe);
              }, function addInfos(membres) {
446e0b33   Geoffrey PREUD'HOMME   Affichage des par...
261
                  async.map(membres, function (membre, cba) {
446e0b33   Geoffrey PREUD'HOMME   Affichage des par...
262
                      async.parallel([function(cbp) {
d0649a9e   Geoffrey PREUD'HOMME   Gestion des non é...
263
                          PolyUserServ.get(membre.login, cbp);
446e0b33   Geoffrey PREUD'HOMME   Affichage des par...
264
265
266
267
268
269
                      }, function(cbp) {
                          NinfoServ.simpleData(membre, cbp);
                      }], function(err, results) {
                          var membreFinal = results[0];
                          membreFinal.equipe = results[1].equipe;
                          membreFinal.comment = results[1].comment;
446e0b33   Geoffrey PREUD'HOMME   Affichage des par...
270
271
272
273
                          cba(null, membreFinal);
                      });
                  }, function (err, membres) {
                      memo[nomEquipe] = membres;
446e0b33   Geoffrey PREUD'HOMME   Affichage des par...
274
275
276
277
278
279
280
281
                      cb(null, memo);
                  });
              });
          }, function gb(err, data) {
              res.status(200).json(data);
          });
      });
  });
7664a626   Geoffrey PREUD'HOMME   Support de la nui...
282
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
283
284
285
286
287
  // Dossiers
  
  parentId = function (req, res, next) {
      DosssServ.get(req.body.parent, ensureExists(res, 404, function (parent) {
          req.body.parent = parent._id;
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
288
289
          next();
      }));
a470afda   Geoffrey PREUD'HOMME   Simplification de...
290
291
  };
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
292
293
294
  // Un doss
  api.get('/dosss/:_id', reqAuth, getSubject(DosssServ), function (req, res) {
      DosssServ.detailedData(req.subject, giveBack(res, 200));
9378de0d   Geoffrey PREUD'HOMME   Affichage d'une c...
295
296
  });
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
297
298
  // Ajout d'un doss
  api.post('/dosss', reqMembre, parentId, assertSubject(DosssServ), addSubject(DosssServ));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
299
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
300
301
302
303
304
305
306
307
  // Supression d'un doss
  api.delete('/dosss/:_id', reqBureau, getSubject(DosssServ), delSubject(DosssServ));
  
  // Conversations
  
  // Infos sur une conversation
  api.get('/convs/:_id', reqAuth, getSubject(ConvsServ), function (req, res) {
      ConvsServ.detailedData(req.subject, giveBack(res, 200));
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
308
309
  });
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
310
311
312
313
314
315
  // Ajout d'une conversation
  api.post('/convs', reqMembre, parentId, assertSubject(ConvsServ), addSubject(ConvsServ));
  
  // Supression d'une conversation
  api.delete('/convs/:_id', reqBureau, getSubject(ConvsServ), delSubject(ConvsServ));
  
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
316
  // Messages
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
317
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
318
319
320
321
322
323
  // Liste des messs
  // api.get('/messs/:conv_id', reqAuth, function (req, res) {
  //     MessServ.list(req.params.conv_id, ensureExists(res, 404, function (messs) {
  //         async.map(messs, MessServ.simpleData, giveBack(res, 200));
  //     }));
  // });
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
324
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
325
326
  // Ajout d'un mess
  api.post('/messs', reqMembre, addLogin, assertSubject(MessServ), addSubject(MessServ));
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
327
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
328
  // Édition d'un mess
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
329
330
331
332
333
334
335
  api.put('/messs/:_id', reqMembre, addLogin, assertSubject(MessServ), getSubject(MessServ), reqOwn('mess'),
      function (req, res) {
  
          MessServ.edit(req.subject, req.body, ensureExists(res, 404, function (mess) {
              MessServ.simpleData(mess, giveBack(res, 201));
          }));
      });
ba3a9e89   Geoffrey PREUD'HOMME   Ajout de l'éditio...
336
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
337
  // Supression d'un mess
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
338
  api.delete('/messs/:_id', reqMembre, getSubject(MessServ), reqOwn('mess'), delSubject(MessServ));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
339
  
d0a827b6   Geoffrey PREUD'HOMME   404, 405, 406, 41...
340
341
342
343
344
345
346
  api.all('/coffee', function (req, res) {
      res.status(418).end();
  });
  
  api.all('*', function (req, res) {
      res.status(405).end();
  });
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
347
  
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
348
  module.exports = api;