Blame view

app/routes/ApiRtes.js 8.9 KB
7a1fe62d   Geoffrey PREUD'HOMME   Consistence des noms
1
  var MembresServ = require('../services/MembresServ');
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
2
  var PolyUserServ = require('../services/PolyUserServ');
7a1fe62d   Geoffrey PREUD'HOMME   Consistence des noms
3
  var DecryptServ = require('../services/DecryptServ');
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
4
  var DosssServ = require('../services/DosssServ');
a470afda   Geoffrey PREUD'HOMME   Simplification de...
5
  var DossModl = require('../models/DossModl');
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
6
  var ConvsServ = require('../services/ConvsServ');
a470afda   Geoffrey PREUD'HOMME   Simplification de...
7
  var ConvModl = require('../models/ConvModl');
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
8
  var MessServ = require('../services/MessServ');
a470afda   Geoffrey PREUD'HOMME   Simplification de...
9
  var MessModl = require('../models/MessModl'); // TODO Unfier ce bazar / supprimer Serv
07298877   Geoffrey PREUD'HOMME   Session: secret g...
10
  var fs = require('fs');
fb8f1174   Geoffrey PREUD'HOMME   Utilisation de mo...
11
  var mongoose = require('mongoose');
0bda071e   Geoffrey PREUD'HOMME   Reroutage
12
  var express = require('express');
07298877   Geoffrey PREUD'HOMME   Session: secret g...
13
14
  var session = require('express-session');
  var MongoStore = require('connect-mongo')(session);
0bda071e   Geoffrey PREUD'HOMME   Reroutage
15
  
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
16
  var api = express();
0bda071e   Geoffrey PREUD'HOMME   Reroutage
17
  
fb8f1174   Geoffrey PREUD'HOMME   Utilisation de mo...
18
19
20
  // Connection à la BDD
  mongoose.connect(require('../../config/db').url);
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
21
22
23
24
25
26
27
28
  // 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 ...
29
          } else {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
30
              cb(data);
89bc7c99   Geoffrey PREUD'HOMME   Améliorations div...
31
          }
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
32
33
34
      };
  };
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
  giveBackNull = function (res, status) {
      // TODO Statut par défaut / optionnel
      // status = 200;
      return ensureOkay(res, 404, function (data) {
          res.status(status);
          if (status != 204 && status != 205) {
              res.json(data);
          } else {
              res.end();
          }
      });
  };
  
  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) {
          res.status(status);
          if (status != 204 && status != 205) {
              res.json(data);
          } else {
              res.end();
          }
      });
  };
  
  // Authentication
  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 ...
82
  reqVerified = function (verify) { // Assert mais pour les droits (d'où le 403)
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
83
      return function (req, res, next) {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
84
85
86
87
88
89
          reqAuth(req, res, function () {
              verify(req, res, function (err, data) {
                  cb = ensureExists(res, 403, function () {
                      next(); // Si on passe quoi que ce soit à next(), erreur 500
                  });
                  cb(err, data);
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
90
91
92
93
94
              });
          });
      };
  };
  
a470afda   Geoffrey PREUD'HOMME   Simplification de...
95
  reqOwn = function (objName) {
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
96
      return reqVerified(function (req, res, cb) {
a470afda   Geoffrey PREUD'HOMME   Simplification de...
97
98
99
100
          cb(null, req.session.data.bureau || req[objName].login == req.session.data.login);
      });
  };
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
101
102
103
  reqMembre = reqVerified(function (req, res, cb) {
      cb(null, req.session.data.membre);
  });
a470afda   Geoffrey PREUD'HOMME   Simplification de...
104
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
105
106
107
  reqBureau = reqVerified(function (req, res, cb) {
      cb(null, req.session.data.bureau);
  });
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
108
109
110
  
  assert = function (test) {
      return function (req, res, next) {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
111
112
113
          test(req, res, ensureExists(res, 400, function () {
              next();
          }));
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
114
115
116
      };
  };
  
89bc7c99   Geoffrey PREUD'HOMME   Améliorations div...
117
118
119
120
121
122
123
124
125
126
127
128
  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...
129
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
130
  
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
131
  // Sessions
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
132
133
134
135
136
137
  
  sessionData = function (session, cb) {
      PolyUserServ.get(session.login, function (err, nom) {
          // Nom
          session.nom = nom.nom;
          session.section = nom.section;
a470afda   Geoffrey PREUD'HOMME   Simplification de...
138
139
140
141
142
143
          MembresServ.estMembre(session.login, function (membre) { // TODO Asyc
              session.membre = membre;
              MembresServ.estBureau(session.login, function (bureau) {
                  session.bureau = bureau;
                  cb(session);
              });
2f593328   Geoffrey PREUD'HOMME   Linting
144
          });
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
145
146
147
148
      });
  };
  
  api.use(session({
fb8f1174   Geoffrey PREUD'HOMME   Utilisation de mo...
149
150
151
      store: new MongoStore({
          mongooseConnection: mongoose.connection
      }),
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
152
153
      name: 'membreCool',
      resave: false,
6ac9921a   Geoffrey PREUD'HOMME   Message cookies
154
      saveUninitialized: false,
07298877   Geoffrey PREUD'HOMME   Session: secret g...
155
156
157
      secret: fs.readFileSync('config/session_secret', {
          encoding: 'UTF8'
      })
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
158
159
160
161
  }));
  
  api.get('/session', function (req, res) { // Informations sur la session
      res.send(req.session.data);
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
162
163
  });
  
89bc7c99   Geoffrey PREUD'HOMME   Améliorations div...
164
165
166
  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...
167
168
169
170
171
172
173
      PolyUserServ.verify(req.body.login, req.body.pass, ensureOkay(res, 500, function (verified) {
          if (verified) {
              sessionData({
                  login: req.body.login
              }, function (session) {
                  req.session.data = session;
                  req.session.save(function (err) {
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
174
                      if (err) {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
175
                          res.status(500).json(err);
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
176
                      } else {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
177
                          res.status(201).json(session);
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
178
179
                      }
                  });
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
180
181
182
183
184
              });
          } else {
              req.session.destroy(ensureOkay(res, 500, function () {
                  res.status(401).end();
              }));
89bc7c99   Geoffrey PREUD'HOMME   Améliorations div...
185
          }
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
186
      }));
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
187
  });
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
188
189
  
  api.delete('/session', function (req, res) { // Se déconnecter
c726d602   Geoffrey PREUD'HOMME   Utilisation d'un ...
190
      req.session.destroy();
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
191
      res.status(205).end();
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
192
  });
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
193
  
10852373   Geoffrey PREUD'HOMME   Session contrôleu...
194
  
0bda071e   Geoffrey PREUD'HOMME   Reroutage
195
  // Membres
a7189c82   Geoffrey PREUD'HOMME   Membres comme con...
196
  api.get('/membres', function (req, res) { // Liste des membres
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
197
      MembresServ.list(giveBack(res, 200));
0bda071e   Geoffrey PREUD'HOMME   Reroutage
198
199
  });
  
82d5512d   Geoffrey PREUD'HOMME   Vérification logi...
200
  api.post('/membres', assert(function (req, res, cb) {
4a593a85   Geoffrey PREUD'HOMME   Les pages d'erreu...
201
      cb(null, typeof req.body.login == 'string' && req.body.login !== '');
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
202
203
  }), reqBureau, function (req, res) { // Ajout d'un membre
      MembresServ.add(req.body, giveBack(res, 201));
0bda071e   Geoffrey PREUD'HOMME   Reroutage
204
205
  });
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
206
207
  api.delete('/membres/:membre_id', reqBureau, function (req, res) { // Supression d'un membre
      MembresServ.remove(req.params.membre_id, giveBack(res, 205));
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
208
  });
0bda071e   Geoffrey PREUD'HOMME   Reroutage
209
  
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
210
  // Dossiers
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
211
  api.get('/dosss/:doss_id', reqAuth, function (req, res) { // Un doss
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
212
213
      // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
      // TODO Requêtes séparées ?
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
214
215
216
217
218
219
220
221
222
223
      // TODO Async
      DosssServ.get(req.params.doss_id, ensureExists(res, 404, function (doss) {
          DosssServ.children(doss._id, ensureOkay(res, 500, function (dosss) {
              ConvsServ.children(doss._id, ensureOkay(res, 500, function (convs) {
                  doss.dosss = dosss;
                  doss.convs = convs;
                  res.json(doss);
              }));
          }));
      }));
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
224
  });
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
225
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
226
  api.post('/dosss', reqMembre, function (req, res) { // Ajout d'un doss
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
227
228
229
      // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
      DosssServ.getId(req.body.parent, function (parent) { // TODO Async
          req.body.parent = parent;
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
230
          DosssServ.add(req.body, giveBackNull(res, 201));
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
231
232
233
      });
  });
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
234
235
  api.delete('/dosss/:doss_id', reqBureau, function (req, res) { // Supression d'un doss
      DosssServ.remove(req.params.doss_id, giveBackNull(res, 205));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
236
237
  });
  
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
238
  // Conversations
a470afda   Geoffrey PREUD'HOMME   Simplification de...
239
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
240
241
242
243
244
245
246
247
248
249
  getSubject = function (modl) {
      // TODO Gérer les dossiers
      return function (req, res, next) {
          modl.findById(req.params._id, ensureExists(res, 404, function (data) {
              req.subject = data;
              next();
          }));
      };
  };
  
a470afda   Geoffrey PREUD'HOMME   Simplification de...
250
  getConv = function (req, res, next) {
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
251
252
253
254
      ConvModl.findById(req.params.conv_id, ensureExists(res, 404, function (data) {
          req.conv = conv;
          next();
      }));
a470afda   Geoffrey PREUD'HOMME   Simplification de...
255
256
  };
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
257
258
  api.get('/convs/:_id', reqAuth, getSubject(ConvModl), function (req, res) { // Une conv
      res.json(req.subject);
9378de0d   Geoffrey PREUD'HOMME   Affichage d'une c...
259
260
  });
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
261
262
  // Ajout d'un conv
  api.post('/convs', reqMembre, function (req, res) {
61d4f326   Geoffrey PREUD'HOMME   Gestion des dossiers
263
264
265
      // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
      DosssServ.getId(req.body.parent, function (parent) { // TODO Async
          req.body.parent = parent;
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
266
          ConvsServ.add(req.body, giveBack(res, 201));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
267
268
269
      });
  });
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
270
271
272
  // Supression d'un conv
  api.delete('/convs/:_id', reqBureau, getSubject(ConvModl), function (req, res) {
      req.subject.remove(giveBack(res, 205));
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
273
274
275
  });
  
  // Messages
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
276
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
277
278
279
  api.get('/messs/:conv_id', reqAuth, function (req, res) { // Liste des messs
      MessServ.list(req.params.conv_id, giveBackNull(res, 200));
  });
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
280
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
281
  api.post('/messs', reqMembre, function (req, res) { // Ajout d'un mess
f22cd7f3   Geoffrey PREUD'HOMME   Système de messag...
282
      data = req.body;
74d33075   Geoffrey PREUD'HOMME   Sauvegarde du nom...
283
      data.login = req.session.data.login;
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
284
      MessServ.add(data, giveBack(res, 201));
79edca45   Geoffrey PREUD'HOMME   Nouvelle façon de...
285
286
  });
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
287
288
289
  // Édition d'un mess
  api.put('/messs/:_id', reqMembre, getSubject(MessModl), reqOwn('mess'), function (req, res) {
      req.subject.content = req.body.content;
a470afda   Geoffrey PREUD'HOMME   Simplification de...
290
      // TODO Edit date
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
291
      req.subject.save(giveBack(res, 201));
ba3a9e89   Geoffrey PREUD'HOMME   Ajout de l'éditio...
292
293
  });
  
d51337d0   Geoffrey PREUD'HOMME   Améliorations div...
294
295
296
  // Supression d'un mess
  api.delete('/messs/:_id', reqMembre, getSubject(MessModl), reqOwn('mess'), function (req, res) {
      req.subject.remove(giveBack(res, 205));
12162cc1   Geoffrey PREUD'HOMME   Liste de conversa...
297
298
  });
  
d0a827b6   Geoffrey PREUD'HOMME   404, 405, 406, 41...
299
300
301
302
303
304
305
  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...
306
  
2201e360   Geoffrey PREUD'HOMME   Le login se fait ...
307
  module.exports = api;