Blame view

app/routes/ApiRtes.js 10.3 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
139
140
141
142
      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 {
              session.nom = res[0].nom;
              session.section = res[0].section;
              session.membre = res[1];
              session.bureau = res[2];
7664a626   Geoffrey PREUD'HOMME   Support de la nui...
143
              // TODO session.personnel
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
144
145
              cb(null, session);
          }
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
146
147
148
149
      });
  };
  
  api.use(session({
fb8f1174   Geoffrey PREUD'HOMME   Utilisation de mo...
150
151
152
      store: new MongoStore({
          mongooseConnection: mongoose.connection
      }),
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
153
154
      name: 'membreCool',
      resave: false,
6ac9921a   Geoffrey PREUD'HOMME   Message cookies
155
      saveUninitialized: false,
07298877   Geoffrey PREUD'HOMME   Session: secret g...
156
157
158
      secret: fs.readFileSync('config/session_secret', {
          encoding: 'UTF8'
      })
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
159
160
161
162
  }));
  
  api.get('/session', function (req, res) { // Informations sur la session
      res.send(req.session.data);
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
163
164
  });
  
89bc7c99   Geoffrey PREUD'HOMME   Améliorations div...
165
166
167
  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...
168
169
170
171
      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...
172
              }, ensureOkay(res, 500, function (session) {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
173
                  req.session.data = session;
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
174
175
176
177
                  req.session.save(ensureOkay(res, 500, function () {
                      res.status(201).json(session);
                  }));
              }));
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
178
179
180
181
          } else {
              req.session.destroy(ensureOkay(res, 500, function () {
                  res.status(401).end();
              }));
89bc7c99   Geoffrey PREUD'HOMME   Améliorations div...
182
          }
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
183
      }));
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
184
  });
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
185
186
  
  api.delete('/session', function (req, res) { // Se déconnecter
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
187
      req.session.destroy();
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
188
      res.status(205).end();
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
189
  });
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
190
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
191
192
193
194
195
196
197
198
  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...
199
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
200
201
202
203
204
  assertSubject = function (serv) {
      return assert(function (req, res, cb) {
          serv.assert(req.body, cb);
      });
  };
0bda071e   Geoffrey PREUD'HOMME   Reroutage
205
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
206
207
  addSubject = function (serv) {
      return function (req, res) {
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
208
          serv.add(req.body, ensureExists(res, 404, function (membre) {
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
209
              serv.simpleData(membre, giveBack(res, 201));
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
210
          }));
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
      };
  };
  
  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...
228
      }));
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
229
  });
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
230
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
231
232
  // Ajout d'un membre
  api.post('/membres', reqBureau, assertSubject(MembresServ), function (req, res) {
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
233
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
234
235
236
237
      MembresServ.add(req.body, ensureExists(res, 404, function (membre) {
  
          MembresServ.simpleData(membre, giveBack(res, 201));
      }));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
238
239
  });
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
240
241
  // Supression d'un membre
  api.delete('/membres/:_id', reqBureau, getSubject(MembresServ), delSubject(MembresServ));
a470afda   Geoffrey PREUD'HOMME   Simplification de...
242
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
243
  
7664a626   Geoffrey PREUD'HOMME   Support de la nui...
244
245
246
247
248
  // 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...
249
250
251
252
253
254
255
          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...
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
  // 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) {
                  console.log(270);
                  cbf(participant.equipe == nomEquipe);
              }, function addInfos(membres) {
                  console.log(272, membres);
                  async.map(membres, function (membre, cba) {
                      console.log(274, membre);
                      async.parallel([function(cbp) {
                          PolyUserServ.grabInfos(membre.login, cbp);
                      }, function(cbp) {
                          NinfoServ.simpleData(membre, cbp);
                      }], function(err, results) {
                          var membreFinal = results[0];
                          membreFinal.equipe = results[1].equipe;
                          membreFinal.comment = results[1].comment;
                          console.log(276, membreFinal);
                          cba(null, membreFinal);
                      });
                  }, function (err, membres) {
                      memo[nomEquipe] = membres;
                      console.log(278, memo);
                      cb(null, memo);
                  });
              });
          }, function gb(err, data) {
              res.status(200).json(data);
          });
      });
  });
7664a626   Geoffrey PREUD'HOMME   Support de la nui...
289
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
290
291
292
293
294
  // 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...
295
296
          next();
      }));
a470afda   Geoffrey PREUD'HOMME   Simplification de...
297
298
  };
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
299
300
301
  // 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...
302
303
  });
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
304
305
  // Ajout d'un doss
  api.post('/dosss', reqMembre, parentId, assertSubject(DosssServ), addSubject(DosssServ));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
306
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
307
308
309
310
311
312
313
314
  // 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...
315
316
  });
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
317
318
319
320
321
322
  // 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...
323
  // Messages
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
324
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
325
326
327
328
329
330
  // 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...
331
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
332
333
  // Ajout d'un mess
  api.post('/messs', reqMembre, addLogin, assertSubject(MessServ), addSubject(MessServ));
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
334
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
335
  // Édition d'un mess
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
336
337
338
339
340
341
342
  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...
343
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
344
  // Supression d'un mess
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
345
  api.delete('/messs/:_id', reqMembre, getSubject(MessServ), reqOwn('mess'), delSubject(MessServ));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
346
  
d0a827b6   Geoffrey PREUD'HOMME   404, 405, 406, 41...
347
348
349
350
351
352
353
  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...
354
  
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
355
  module.exports = api;