Blame view

app/routes/ApiRtes.js 9.15 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
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
  // 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) {
          console.log(err);
          if (err) { // TODO Tester si on peut pas créer un objet directement et
                     // récupérer les valeurs par défaut de la BDD
              ninfo = {
                  equipe: 'nope',
                  comment: ''
              };
          }
          console.log(ninfo);
          NinfoServ.simpleData(ninfo, giveBack(res, 200));
      });
  });
  
  // Mettre à jour les préférences
  api.put('/profile/ninfo', reqAuth, addLogin, assertSubject(NinfoServ), addSubject(NinfoServ));
  
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
266
267
268
269
270
  // 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...
271
272
          next();
      }));
a470afda   Geoffrey PREUD'HOMME   Simplification de...
273
274
  };
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
275
276
277
  // 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...
278
279
  });
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
280
281
  // Ajout d'un doss
  api.post('/dosss', reqMembre, parentId, assertSubject(DosssServ), addSubject(DosssServ));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
282
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
283
284
285
286
287
288
289
290
  // 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...
291
292
  });
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
293
294
295
296
297
298
  // 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...
299
  // Messages
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
300
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
301
302
303
304
305
306
  // 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...
307
  
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
308
309
  // Ajout d'un mess
  api.post('/messs', reqMembre, addLogin, assertSubject(MessServ), addSubject(MessServ));
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
310
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
311
  // Édition d'un mess
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
312
313
314
315
316
317
318
  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...
319
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
320
  // Supression d'un mess
278868c0   Geoffrey PREUD'HOMME   Refactorisation d...
321
  api.delete('/messs/:_id', reqMembre, getSubject(MessServ), reqOwn('mess'), delSubject(MessServ));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
322
  
d0a827b6   Geoffrey PREUD'HOMME   404, 405, 406, 41...
323
324
325
326
327
328
329
  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...
330
  
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
331
  module.exports = api;