Commit 278868c0a47b2bc14244b6d81ae384021398ea44

Authored by Geoffrey PREUD'HOMME
1 parent 9bd5849b

Refactorisation du traitement de l'API

Avec un ratio changements visibles / code changé le plus faible au monde.
app/models/ConvModl.js
... ... @@ -8,7 +8,9 @@ module.exports = mongoose.model('Conv', {
8 8 parent: {
9 9 type: String,
10 10 default: 'lost'
  11 + },
  12 + hidden: {
  13 + type: Boolean,
  14 + default: false
11 15 }
12   - // TODO Visibilité (brouillon)
13   - // TODO Répertoire
14 16 });
... ...
app/models/DossModl.js
... ... @@ -12,6 +12,9 @@ module.exports = mongoose.model('Doss', {
12 12 special: {
13 13 type: String,
14 14 default: ''
  15 + },
  16 + hidden: {
  17 + type: Boolean,
  18 + default: false
15 19 }
16   - // TODO Visibilité (brouillon)
17 20 });
... ...
app/models/MembreModl.js
... ... @@ -8,5 +8,9 @@ module.exports = mongoose.model('Membre', {
8 8 role: {
9 9 type: String,
10 10 default: 'Membre'
  11 + },
  12 + hidden: {
  13 + type: Boolean,
  14 + default: false
11 15 }
12 16 });
... ...
app/models/MessModl.js
... ... @@ -15,5 +15,9 @@ module.exports = mongoose.model('Mess', {
15 15 date: {
16 16 type: Date,
17 17 default: Date.now
  18 + },
  19 + hidden: {
  20 + type: Boolean,
  21 + default: false
18 22 }
19 23 });
... ...
app/routes/ApiRtes.js
... ... @@ -2,12 +2,10 @@ var MembresServ = require('../services/MembresServ');
2 2 var PolyUserServ = require('../services/PolyUserServ');
3 3 var DecryptServ = require('../services/DecryptServ');
4 4 var DosssServ = require('../services/DosssServ');
5   -var DossModl = require('../models/DossModl');
6 5 var ConvsServ = require('../services/ConvsServ');
7   -var ConvModl = require('../models/ConvModl');
8 6 var MessServ = require('../services/MessServ');
9   -var MessModl = require('../models/MessModl'); // TODO Unfier ce bazar / supprimer Serv
10 7 var fs = require('fs');
  8 +var async = require('async');
11 9 var mongoose = require('mongoose');
12 10 var express = require('express');
13 11 var session = require('express-session');
... ... @@ -32,16 +30,11 @@ ensureOkay = function (res, status, cb) {
32 30 };
33 31 };
34 32  
35   -giveBackNull = function (res, status) {
  33 +giveNull = function (res, status) {
36 34 // TODO Statut par défaut / optionnel
37 35 // status = 200;
38 36 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   - }
  37 + res.status(status).end();
45 38 });
46 39 };
47 40  
... ... @@ -61,12 +54,8 @@ giveBack = function (res, status) {
61 54 // TODO Statut par défaut / optionnel
62 55 // status = 200;
63 56 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   - }
  57 +
  58 + res.status(status).json(data);
70 59 });
71 60 };
72 61  
... ... @@ -82,12 +71,9 @@ reqAuth = function (req, res, next) {
82 71 reqVerified = function (verify) { // Assert mais pour les droits (d'où le 403)
83 72 return function (req, res, next) {
84 73 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);
90   - });
  74 + verify(req, res, ensureExists(res, 403, function () {
  75 + next(); // Si on passe quoi que ce soit à next(), erreur 500
  76 + }));
91 77 });
92 78 };
93 79 };
... ... @@ -129,19 +115,27 @@ decrypt = function () {
129 115  
130 116  
131 117 // Sessions
132   -
133 118 sessionData = function (session, cb) {
134   - PolyUserServ.get(session.login, function (err, nom) {
135   - // Nom
136   - session.nom = nom.nom;
137   - session.section = nom.section;
138   - MembresServ.estMembre(session.login, function (membre) { // TODO Asyc
139   - session.membre = membre;
140   - MembresServ.estBureau(session.login, function (bureau) {
141   - session.bureau = bureau;
142   - cb(session);
143   - });
144   - });
  119 + async.parallel([
  120 + function (cba) {
  121 + PolyUserServ.get(session.login, cba);
  122 + },
  123 + function (cba) {
  124 + MembresServ.estMembre(session.login, cba);
  125 + },
  126 + function (cba) {
  127 + MembresServ.estBureau(session.login, cba);
  128 + }
  129 + ], function (err, res) {
  130 + if (err) {
  131 + cb(err);
  132 + } else {
  133 + session.nom = res[0].nom;
  134 + session.section = res[0].section;
  135 + session.membre = res[1];
  136 + session.bureau = res[2];
  137 + cb(null, session);
  138 + }
145 139 });
146 140 };
147 141  
... ... @@ -168,16 +162,12 @@ api.post('/session', decrypt(), assert(function (req, res, cb) {
168 162 if (verified) {
169 163 sessionData({
170 164 login: req.body.login
171   - }, function (session) {
  165 + }, ensureOkay(res, 500, function (session) {
172 166 req.session.data = session;
173   - req.session.save(function (err) {
174   - if (err) {
175   - res.status(500).json(err);
176   - } else {
177   - res.status(201).json(session);
178   - }
179   - });
180   - });
  167 + req.session.save(ensureOkay(res, 500, function () {
  168 + res.status(201).json(session);
  169 + }));
  170 + }));
181 171 } else {
182 172 req.session.destroy(ensureOkay(res, 500, function () {
183 173 res.status(401).end();
... ... @@ -191,110 +181,122 @@ api.delete('/session', function (req, res) { // Se déconnecter
191 181 res.status(205).end();
192 182 });
193 183  
  184 +getSubject = function (serv) { // Fonction générique pour récupérer un objet spécifié dans l'URL
  185 + return function (req, res, next) {
  186 + serv.get(req.params._id, ensureExists(res, 404, function (data) {
  187 + req.subject = data;
  188 + next();
  189 + }));
  190 + };
  191 +};
194 192  
195   -// Membres
196   -api.get('/membres', function (req, res) { // Liste des membres
197   - MembresServ.list(giveBack(res, 200));
198   -});
  193 +assertSubject = function (serv) {
  194 + return assert(function (req, res, cb) {
  195 + serv.assert(req.body, cb);
  196 + });
  197 +};
199 198  
200   -api.post('/membres', assert(function (req, res, cb) {
201   - cb(null, typeof req.body.login == 'string' && req.body.login !== '');
202   -}), reqBureau, function (req, res) { // Ajout d'un membre
203   - MembresServ.add(req.body, giveBack(res, 201));
204   -});
  199 +addSubject = function (serv) {
  200 + return function (req, res) {
205 201  
206   -api.delete('/membres/:membre_id', reqBureau, function (req, res) { // Supression d'un membre
207   - MembresServ.remove(req.params.membre_id, giveBack(res, 205));
208   -});
  202 + serv.add(req.body, ensureExists(res, 404, function (membre) {
209 203  
210   -// Dossiers
211   -api.get('/dosss/:doss_id', reqAuth, function (req, res) { // Un doss
212   - // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
213   - // TODO Requêtes séparées ?
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   - }));
  204 + serv.simpleData(membre, giveBack(res, 201));
222 205 }));
  206 + };
  207 +};
  208 +
  209 +delSubject = function (serv) {
  210 + return function (req, res) {
  211 + serv.remove(req.subject, giveNull(res, 205));
  212 + };
  213 +};
  214 +
  215 +// Membres
  216 +
  217 +// Liste des membres
  218 +api.get('/membres', function (req, res) {
  219 + MembresServ.list(ensureExists(res, 404, function (membres) {
  220 + async.map(membres, MembresServ.simpleData, function (err, data) {
  221 + giveBack(res, 200)(err, data);
  222 + });
223 223 }));
224 224 });
225 225  
226   -api.post('/dosss', reqMembre, function (req, res) { // Ajout d'un doss
227   - // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
228   - DosssServ.getId(req.body.parent, function (parent) { // TODO Async
229   - req.body.parent = parent;
230   - DosssServ.add(req.body, giveBackNull(res, 201));
231   - });
232   -});
  226 +// Ajout d'un membre
  227 +api.post('/membres', reqBureau, assertSubject(MembresServ), function (req, res) {
233 228  
234   -api.delete('/dosss/:doss_id', reqBureau, function (req, res) { // Supression d'un doss
235   - DosssServ.remove(req.params.doss_id, giveBackNull(res, 205));
  229 + MembresServ.add(req.body, ensureExists(res, 404, function (membre) {
  230 +
  231 + MembresServ.simpleData(membre, giveBack(res, 201));
  232 + }));
236 233 });
237 234  
238   -// Conversations
  235 +// Supression d'un membre
  236 +api.delete('/membres/:_id', reqBureau, getSubject(MembresServ), delSubject(MembresServ));
239 237  
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 238  
250   -getConv = function (req, res, next) {
251   - ConvModl.findById(req.params.conv_id, ensureExists(res, 404, function (data) {
252   - req.conv = conv;
  239 +// Dossiers
  240 +
  241 +parentId = function (req, res, next) {
  242 + DosssServ.get(req.body.parent, ensureExists(res, 404, function (parent) {
  243 + req.body.parent = parent._id;
253 244 next();
254 245 }));
255 246 };
256 247  
257   -api.get('/convs/:_id', reqAuth, getSubject(ConvModl), function (req, res) { // Une conv
258   - res.json(req.subject);
  248 +// Un doss
  249 +api.get('/dosss/:_id', reqAuth, getSubject(DosssServ), function (req, res) {
  250 + DosssServ.detailedData(req.subject, giveBack(res, 200));
259 251 });
260 252  
261   -// Ajout d'un conv
262   -api.post('/convs', reqMembre, function (req, res) {
263   - // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect)
264   - DosssServ.getId(req.body.parent, function (parent) { // TODO Async
265   - req.body.parent = parent;
266   - ConvsServ.add(req.body, giveBack(res, 201));
267   - });
268   -});
  253 +// Ajout d'un doss
  254 +api.post('/dosss', reqMembre, parentId, assertSubject(DosssServ), addSubject(DosssServ));
269 255  
270   -// Supression d'un conv
271   -api.delete('/convs/:_id', reqBureau, getSubject(ConvModl), function (req, res) {
272   - req.subject.remove(giveBack(res, 205));
  256 +// Supression d'un doss
  257 +api.delete('/dosss/:_id', reqBureau, getSubject(DosssServ), delSubject(DosssServ));
  258 +
  259 +// Conversations
  260 +
  261 +// Infos sur une conversation
  262 +api.get('/convs/:_id', reqAuth, getSubject(ConvsServ), function (req, res) {
  263 + ConvsServ.detailedData(req.subject, giveBack(res, 200));
273 264 });
274 265  
  266 +// Ajout d'une conversation
  267 +api.post('/convs', reqMembre, parentId, assertSubject(ConvsServ), addSubject(ConvsServ));
  268 +
  269 +// Supression d'une conversation
  270 +api.delete('/convs/:_id', reqBureau, getSubject(ConvsServ), delSubject(ConvsServ));
  271 +
  272 +addLogin = function (req, res, next) {
  273 + req.body.login = req.session.data.login;
  274 + next();
  275 +};
  276 +
275 277 // Messages
276 278  
277   -api.get('/messs/:conv_id', reqAuth, function (req, res) { // Liste des messs
278   - MessServ.list(req.params.conv_id, giveBackNull(res, 200));
279   -});
  279 +// Liste des messs
  280 +// api.get('/messs/:conv_id', reqAuth, function (req, res) {
  281 +// MessServ.list(req.params.conv_id, ensureExists(res, 404, function (messs) {
  282 +// async.map(messs, MessServ.simpleData, giveBack(res, 200));
  283 +// }));
  284 +// });
280 285  
281   -api.post('/messs', reqMembre, function (req, res) { // Ajout d'un mess
282   - data = req.body;
283   - data.login = req.session.data.login;
284   - MessServ.add(data, giveBack(res, 201));
285   -});
  286 +// Ajout d'un mess
  287 +api.post('/messs', reqMembre, addLogin, assertSubject(MessServ), addSubject(MessServ));
286 288  
287 289 // Édition d'un mess
288   -api.put('/messs/:_id', reqMembre, getSubject(MessModl), reqOwn('mess'), function (req, res) {
289   - req.subject.content = req.body.content;
290   - // TODO Edit date
291   - req.subject.save(giveBack(res, 201));
292   -});
  290 +api.put('/messs/:_id', reqMembre, addLogin, assertSubject(MessServ), getSubject(MessServ), reqOwn('mess'),
  291 + function (req, res) {
  292 +
  293 + MessServ.edit(req.subject, req.body, ensureExists(res, 404, function (mess) {
  294 + MessServ.simpleData(mess, giveBack(res, 201));
  295 + }));
  296 + });
293 297  
294 298 // Supression d'un mess
295   -api.delete('/messs/:_id', reqMembre, getSubject(MessModl), reqOwn('mess'), function (req, res) {
296   - req.subject.remove(giveBack(res, 205));
297   -});
  299 +api.delete('/messs/:_id', reqMembre, getSubject(MessServ), reqOwn('mess'), delSubject(MessServ));
298 300  
299 301 api.all('/coffee', function (req, res) {
300 302 res.status(418).end();
... ...
app/services/ConvsServ.js
1 1 var ConvModl = require('../models/ConvModl');
2   -// var PolyUserServ = require('../services/PolyUserServ');
  2 +var MessServ = require('../services/MessServ');
3 3 var async = require('async');
4 4  
5 5 var ConvsServ = {};
6 6  
7   -ConvsServ.addData = function (conv, cb) {
8   - // PolyUserServ.get(Conv.login, function (err, nom) {
9   - // if (nom) {
10   - // Conv.nom = nom;
11   - // } else {
12   - // Conv.nom = Conv.login;
13   - // }
14   - // cb(null, Conv);
15   - // });
  7 +ConvsServ.simple = ['_id', 'titre', 'parent', 'hidden'];
  8 +
  9 +ConvsServ.simpleData = function (convD, cb) {
16 10 // TODO Démarré par
17 11 // TODO Dernier message
  12 + var conv = {};
  13 + for (var prop of ConvsServ.simple) {
  14 + conv[prop] = convD[prop];
  15 + }
18 16 cb(null, conv);
19 17 };
20 18  
21   -ConvsServ.exists = function (id, cb) {
22   - ConvModl.findById(id).exec(function (err, conv) {
23   - if (err)
  19 +ConvsServ.detailedData = function (convD, cb) {
  20 + async.parallel([
  21 + function (cba) {
  22 + var conv = {};
  23 + for (var prop of ConvsServ.simple) {
  24 + conv[prop] = convD[prop];
  25 + }
  26 + cba(null, conv);
  27 + },
  28 + function (cba) {
  29 + MessServ.children(convD._id, function (err, children) {
  30 +
  31 + if (err) {
  32 + cba(err);
  33 + } else {
  34 + async.map(children, MessServ.simpleData, cba);
  35 + }
  36 + });
  37 + }
  38 + ], function (err, res) {
  39 + if (err) {
24 40 cb(err);
25   - else
26   - cb(null, true);
  41 + } else {
  42 + conv = res[0];
  43 + conv.messs = res[1];
  44 +
  45 + cb(null, conv);
  46 + }
27 47 });
28 48 };
29 49  
30 50 ConvsServ.get = function (id, cb) {
31   - ConvModl.findById(id).lean().exec(function (err, conv) {
32   - if (err)
33   - cb(err);
34   - else
35   - ConvsServ.addData(conv, cb);
36   - });
  51 + ConvModl.findById(id, cb);
37 52 };
38 53  
39   -ConvsServ.list = function (cb) { // TODO Visibilité
40   - ConvModl.find({}).lean().exec(function (err, Convs) {
41   - async.mapSeries(Convs, ConvsServ.addData, cb);
42   - });
  54 +ConvsServ.children = function (id, cb) { // Conversations filles du dossier en paramètre
  55 + ConvModl.find({
  56 + parent: id,
  57 + $or: [{
  58 + hidden: false
  59 + }, {
  60 + hidden: undefined
  61 + }]
  62 + }, cb);
43 63 };
44 64  
45   -ConvsServ.children = function (id, cb) {
46   - ConvModl.find({
47   - parent: id
48   - }).lean().exec(function (err, Conv) {
49   - async.mapSeries(Conv, ConvsServ.addData, cb);
50   - });
  65 +ConvsServ.assert = function (conv, cb) {
  66 + cb(null, conv.titre, conv.parent);
51 67 };
52 68  
53 69 ConvsServ.add = function (data, cb) {
54 70 ConvModl.create({
55 71 titre: data.titre,
56 72 parent: data.parent
57   - }, function (err, Conv) {
58   - ConvsServ.get(Conv._id, cb);
59   - });
60   -};
61   -
62   -ConvsServ.canWriteIn = function (id, login, cb) {
63   - ConvsServ.exists(id, cb);
  73 + }, cb);
64 74 };
65 75  
66 76 ConvsServ.remove = function (id, cb) {
67   - // TODO Trash
68   - ConvModl.remove({
69   - _id: id
70   - }, cb);
  77 + async.waterfall([function (cba) {
  78 + ConvsServ.get(id, cba);
  79 + }, function (conv, cba) {
  80 + cba(conv ? null : 'notfound', conv);
  81 + }, function (conv, cba) {
  82 + conv.parent = 'trash';
  83 + conv.save(cba);
  84 + }], cb);
71 85 };
72 86  
73 87 module.exports = ConvsServ;
... ...
app/services/DosssServ.js
1 1 var DossModl = require('../models/DossModl');
2   -// var PolyUserServ = require('../services/PolyUserServ');
  2 +var ConvsServ = require('../services/ConvsServ');
3 3 var async = require('async');
4 4  
5 5 var DosssServ = {};
... ... @@ -15,97 +15,119 @@ var DosssServ = {};
15 15 });
16 16 }
17 17 });
  18 + DossModl.find({
  19 + special: 'trash'
  20 + }).exec(function (err, data) {
  21 + if (data.length < 1) {
  22 + DossModl.create({
  23 + special: 'trash',
  24 + titre: 'Corbeille'
  25 + });
  26 + }
  27 + });
18 28 })();
19 29  
20   -DosssServ.addData = function (doss, cb) {
21   - // PolyUserServ.get(Doss.login, function (err, nom) {
22   - // if (nom) {
23   - // Doss.nom = nom;
24   - // } else {
25   - // Doss.nom = Doss.login;
26   - // }
27   - // cb(null, Doss);
28   - // });
  30 +DosssServ.simple = ['_id', 'titre', 'parent', 'special', 'hidden'];
  31 +
  32 +DosssServ.simpleData = function (dossD, cb) {
  33 + var doss = {};
  34 + for (var prop of DosssServ.simple) {
  35 + doss[prop] = dossD[prop];
  36 + }
29 37 // TODO Dernier message
30 38 cb(null, doss);
31 39 };
32 40  
33   -DosssServ.exists = function (id, cb) {
34   - DossModl.findById(id).exec(function (err, doss) {
35   - if (err)
  41 +
  42 +DosssServ.detailedData = function (dossD, cb) {
  43 + async.parallel([
  44 + function (cba) {
  45 + var doss = {};
  46 + for (var prop of DosssServ.simple) {
  47 + doss[prop] = dossD[prop];
  48 + }
  49 + cba(null, doss);
  50 + },
  51 + function (cba) {
  52 + DosssServ.children(dossD._id, function (err, children) {
  53 + if (err) {
  54 + cba(err);
  55 + } else {
  56 + async.map(children, DosssServ.simpleData, cba);
  57 + }
  58 + });
  59 + },
  60 + function (cba) {
  61 + ConvsServ.children(dossD._id, function (err, children) {
  62 + if (err) {
  63 + cba(err);
  64 + } else {
  65 + async.map(children, ConvsServ.simpleData, cba);
  66 + }
  67 + });
  68 + }
  69 + ], function (err, res) {
  70 + if (err) {
36 71 cb(err);
37   - else
38   - cb(null, true);
  72 + } else {
  73 + doss = res[0];
  74 + doss.dosss = res[1];
  75 + doss.convs = res[2];
  76 + cb(null, doss);
  77 + }
39 78 });
40 79 };
41 80  
42   -DosssServ.getId = function (special, cb) {
  81 +DosssServ.get = function (special, cb) {
  82 + console.log(special);
43 83 DossModl.findById(special).exec(function (err, doss) {
44 84 if (!err && doss) {
45   - cb(doss._id); // Équivalent à cb(special)
  85 + cb(null, doss);
46 86 } else {
47   -
48 87 DossModl.findOne({
49 88 special: special
50 89 }).exec(function (err2, doss) {
51   - if (!err2 && doss) {
52   - cb(doss._id);
  90 + if (err2) {
  91 + cb(err);
53 92 } else {
54   - cb(null);
  93 + cb(null, doss ? doss : null);
55 94 }
56 95 });
57 96 }
58 97 });
59 98 };
60 99  
61   -DosssServ.get = function (special, cb) {
62   - DosssServ.getId(special, function (id) { // TODO À enlever avec api.get('/dosss/:doss_id')
63   - DossModl.findById(id).lean().exec(function (err, doss) {
64   - if (err) {
65   - cb(err);
66   - } else {
67   - DosssServ.addData(doss, cb);
68   - }
69   - });
70   - });
71   -};
72   -
73   -DosssServ.list = function (cb) {
74   - DossModl.find({}).lean().exec(function (err, Dosss) {
75   - async.mapSeries(Dosss, DosssServ.addData, cb);
76   - });
77   -};
78   -
79 100 DosssServ.children = function (id, cb) {
80 101 DossModl.find({
81   - parent: id
82   - }).lean().exec(function (err, Dosss) {
83   - async.mapSeries(Dosss, DosssServ.addData, cb);
84   - });
  102 + parent: id,
  103 + $or: [{
  104 + hidden: false
  105 + }, {
  106 + hidden: undefined
  107 + }]
  108 + }, cb);
  109 +};
  110 +
  111 +DosssServ.assert = function (data, cb) {
  112 + cb(data.titre && data.parent);
85 113 };
86 114  
87 115 DosssServ.add = function (data, cb) {
88 116 DossModl.create({
89 117 titre: data.titre,
90 118 parent: data.parent
91   - }, function (err, Doss) {
92   - if (err) {
93   - cb(err);
94   - } else {
95   - DosssServ.get(Doss._id, cb);
96   - }
97   - });
98   -};
99   -
100   -DosssServ.canWriteIn = function (id, login, cb) {
101   - DosssServ.exists(id, cb);
  119 + }, cb);
102 120 };
103 121  
104 122 DosssServ.remove = function (id, cb) {
105   - // TODO Trash
106   - DossModl.remove({
107   - _id: id
108   - }, cb);
  123 + async.waterfall([function (cba) {
  124 + DosssServ.get(id, cba);
  125 + }, function (doss, cba) {
  126 + cba(doss ? null : 'notfound', doss);
  127 + }, function (doss, cba) {
  128 + doss.parent = 'trash';
  129 + doss.save(cba);
  130 + }], cb);
109 131 };
110 132  
111 133 module.exports = DosssServ;
... ...
app/services/MembresServ.js
... ... @@ -4,40 +4,73 @@ var async = require(&#39;async&#39;);
4 4  
5 5 var MembresServ = {};
6 6  
7   -MembresServ.addData = function (membre, cb) {
8   - PolyUserServ.get(membre.login, function (err, nom) {
9   - membre.nom = nom.nom;
10   - membre.section = nom.section;
11   - MembresServ.estBureau(membre.login, function (bureau) {
12   - membre.bureau = bureau;
13   - cb(err, membre);
14   - });
  7 +MembresServ.public = ['_id', 'login', 'role'];
  8 +
  9 +MembresServ.simpleData = function (membreD, cb) {
  10 + async.parallel([
  11 + function (cba) {
  12 + var membre = {};
  13 + for (var prop of MembresServ.public) {
  14 + membre[prop] = membreD[prop];
  15 + }
  16 +
  17 + cba(null, membre);
  18 + },
  19 + function (cba) {
  20 + PolyUserServ.get(membreD.login, cba);
  21 + },
  22 + function (cba) {
  23 + MembresServ.estMembre(membreD.login, cba);
  24 + },
  25 + function (cba) {
  26 + MembresServ.estBureau(membreD.login, cba);
  27 + }
  28 + ], function (err, res) {
  29 + if (err) {
  30 + cb(err);
  31 + } else {
  32 + membre = res[0];
  33 +
  34 + membre.nom = res[1].nom;
  35 + membre.section = res[1].section;
  36 + membre.membre = res[2];
  37 + membre.bureau = res[3];
  38 + cb(null, membre);
  39 + }
15 40 });
16 41 };
17 42  
18 43 MembresServ.get = function (id, cb) {
19   - MembreModl.findById(id).lean().exec(function (err, membre) {
20   - if (err)
21   - cb(err);
22   - else
23   - MembresServ.addData(membre, cb);
24   - });
  44 + MembreModl.findById(id, cb);
  45 +};
  46 +
  47 +MembresServ.getLogin = function (login, cb) {
  48 + MembreModl.findOne({
  49 + login: login
  50 + }, cb);
25 51 };
26 52  
27 53 MembresServ.list = function (cb) {
28   - MembreModl.find({}).lean().exec(function (err, membres) {
29   - async.mapSeries(membres, MembresServ.addData, cb);
30   - });
  54 + MembreModl.find({
  55 + $or: [{
  56 + hidden: false
  57 + }, {
  58 + hidden: undefined
  59 + }]
  60 + }, cb);
  61 +};
  62 +
  63 +MembresServ.assert = function (membre, cb) {
  64 +
  65 + cb(null, membre.login && membre.role);
31 66 };
32 67  
33 68 MembresServ.add = function (data, cb) {
  69 +
34 70 MembreModl.create({
35 71 login: data.login,
36   - role: data.role,
37   - section: data.section,
38   - }, function (err, membre) {
39   - MembresServ.get(membre._id, cb);
40   - });
  72 + role: data.role
  73 + }, cb);
41 74 };
42 75  
43 76 MembresServ.remove = function (id, cb) {
... ... @@ -51,9 +84,9 @@ MembresServ.estMembre = function (login, cb) {
51 84 login: login
52 85 }, function (err, data) {
53 86 if (!err && data) {
54   - cb(true);
  87 + cb(null, true);
55 88 } else {
56   - cb(false);
  89 + cb(null, false);
57 90 }
58 91 });
59 92 };
... ... @@ -63,9 +96,9 @@ MembresServ.estBureau = function (login, cb) {
63 96 login: login
64 97 }, function (err, data) {
65 98 if (!err && data && ['Président', 'Vice-président', 'Trésorier', 'Secrétaire'].indexOf(data.role) > -1) {
66   - cb(true);
  99 + cb(null, true);
67 100 } else {
68   - cb(false);
  101 + cb(null, false);
69 102 }
70 103 });
71 104 };
... ...
app/services/MessServ.js
1 1 var MessModl = require('../models/MessModl');
2   -// var PolyUserServ = require('../services/PolyUserServ');
3   -var ConvsServ = require('../services/ConvsServ');
  2 +var MembresServ = require('../services/MembresServ');
4 3 var async = require('async');
5 4  
6 5 var MesssServ = {};
7 6  
8   -MesssServ.addData = function (mess, cb) {
9   - mess.auteur = {};
10   - mess.auteur.nom = mess.login;
11   - // PolyUserServ.get(Mess.login, function (err, nom) {
12   - // if (nom) {
13   - // Mess.nom = nom;
14   - // } else {
15   - // Mess.nom = Mess.login;
16   - // }
17   - // cb(null, Mess);
18   - // });
19   - cb(null, mess);
20   -};
  7 +MesssServ.simple = ['_id', 'login', 'content', 'conv', 'date', 'hidden'];
21 8  
22   -MesssServ.get = function (id, cb) {
23   - MessModl.findById(id).lean().exec(function (err, mess) {
24   - if (err)
  9 +MesssServ.simpleData = function (messD, cb) {
  10 +
  11 + async.parallel([
  12 + function (cba) {
  13 + var mess = {};
  14 + for (var prop of MesssServ.simple) {
  15 + mess[prop] = messD[prop];
  16 + }
  17 + cba(null, mess);
  18 + },
  19 + function (cba) {
  20 + async.waterfall([
  21 + function (cbaa) {
  22 +
  23 + MembresServ.getLogin(messD.login, cbaa);
  24 + },
  25 + function (membre, cbaa) {
  26 + MembresServ.simpleData(membre, cbaa);
  27 + }
  28 + ], cba);
  29 + }
  30 + ], function (err, res) {
  31 + if (err) {
25 32 cb(err);
26   - else
27   - MesssServ.addData(mess, cb);
  33 + } else {
  34 + mess = res[0];
  35 + mess.auteur = res[1];
  36 + cb(null, mess);
  37 + }
28 38 });
29 39 };
30 40  
31   -MesssServ.list = function (conv, cb) {
  41 +MesssServ.get = function (id, cb) {
  42 + MessModl.findById(id, cb);
  43 +};
  44 +
  45 +MesssServ.children = function (conv, cb) {
32 46 MessModl.find({
33   - conv: conv
34   - }).lean().exec(function (err, Messs) {
35   - async.mapSeries(Messs, MesssServ.addData, cb);
36   - });
  47 + conv: conv,
  48 + $or: [{
  49 + hidden: false
  50 + }, {
  51 + hidden: undefined
  52 + }]
  53 + }, cb);
  54 +};
  55 +
  56 +MesssServ.assert = function (mess, cb) {
  57 + cb(null, mess.login && mess.content && mess.conv);
37 58 };
38 59  
39 60 MesssServ.add = function (data, cb) {
40   - ConvsServ.canWriteIn(data.conv, data.login, function (err, canWriteIn) {
41   - if (err)
42   - cb(err);
43   - else {
44   - if (canWriteIn) {
45   - MessModl.create({
46   - content: data.content,
47   - login: data.login,
48   - conv: data.conv
49   - }, function (err, Mess) {
50   - MesssServ.get(Mess._id, cb);
51   - });
52   - } else {
53   - cb('unauthorized');
54   - }
55   - }
56   - });
  61 + MessModl.create({
  62 + content: data.content,
  63 + login: data.login,
  64 + conv: data.conv
  65 + }, cb);
57 66 };
58 67  
59   -MesssServ.edit = function (data, cb) {
60   - MessModl.findById(data._id, function (err, mess) {
61   - if (err) {
62   - cb(err);
63   - } else {
64   - if (mess) {
65   - mess.content = data.content;
66   - // TODO Edit date
67   - mess.save(cb);
68   - } else {
69   - cb('notfound');
70   - }
71   - }
72   - });
  68 +MesssServ.edit = function (mess, data, cb) {
  69 + mess.content = data.content;
  70 + // TODO Edit date
  71 + mess.save(cb);
73 72 };
74 73  
75 74 MesssServ.remove = function (id, cb) {
76   - // TODO Trash
77   - MessModl.remove({
78   - _id: id
79   - }, cb);
  75 + async.waterfall([function (cba) {
  76 + MesssServ.get(id, cba);
  77 + }, function (mess, cba) {
  78 + cba(mess ? null : 'notfound', mess);
  79 + }, function (mess, cba) {
  80 + mess.hidden = true;
  81 + mess.save(cba);
  82 + }], cb);
80 83 };
81 84  
82 85 module.exports = MesssServ;
... ...
public/js/controllers/ForumConvCtrl.js
1 1 angular.module('ForumConvCtrl', ['SessionsServ', 'ApiServ', 'MessEditDrct'])
2 2 .controller('ForumConvCtrl', function ($scope, $routeParams, SessionServ, ApiServ) {
3   - $scope.messs = [];
4 3 $scope.conv = {};
5 4 $scope.formData = {};
6 5  
... ... @@ -11,11 +10,6 @@ angular.module(&#39;ForumConvCtrl&#39;, [&#39;SessionsServ&#39;, &#39;ApiServ&#39;, &#39;MessEditDrct&#39;])
11 10 ApiServ("récupération de la conversation", 'get', ['convs', $routeParams.conv_id], null, function (err, conv) {
12 11 if (!err) {
13 12 $scope.conv = conv;
14   - ApiServ("récupération des messages", 'get', ['messs', conv._id], null, function (err, messs) {
15   - if (!err) {
16   - $scope.messs = messs;
17   - }
18   - });
19 13 }
20 14 });
21 15  
... ... @@ -27,23 +21,24 @@ angular.module(&#39;ForumConvCtrl&#39;, [&#39;SessionsServ&#39;, &#39;ApiServ&#39;, &#39;MessEditDrct&#39;])
27 21 ApiServ("envoi du message", 'post', 'messs', data, function (err, mess) {
28 22 if (!err) {
29 23 $scope.formData = {};
30   - $scope.messs.push(mess);
  24 + $scope.conv.messs.push(mess);
31 25 }
32 26 });
33 27 };
34 28  
35 29 $scope.delMess = function (index) {
36   - ApiServ("suppression du message", 'delete', ['messs', $scope.messs[index]._id], null, function (err) {
  30 + ApiServ("suppression du message", 'delete', ['messs', $scope.conv.messs[index]._id], null, function (err) {
37 31 if (!err)
38   - $scope.messs.splice(index, 1);
  32 + $scope.conv.messs.splice(index, 1);
39 33 });
40 34 };
41 35  
42 36 $scope.editButton = function (index) {
43   - mess = $scope.messs[index];
  37 + mess = $scope.conv.messs[index];
44 38 if (mess.editMode) {
45 39 ApiServ("édition du message", 'put', ['messs', mess._id], {
46   - content: mess.content
  40 + content: mess.content,
  41 + conv: $scope.conv._id
47 42 }, function (err, data) {
48 43 if (!err) {
49 44 mess.content = data.content;
... ...
public/views/forumConv.html
... ... @@ -14,17 +14,15 @@
14 14 </tr>
15 15 </thead>
16 16 <tbody>
17   - <tr ng-repeat="mess in messs">
18   - <td>
  17 + <tr ng-repeat="mess in conv.messs">
  18 + <td ng-class="{bureau: mess.auteur.bureau}">
19 19 {{ mess.auteur.image }}
20   - <br />
21   - <span class=".visible-xs">{{ mess.auteur.login }}</span>
22   - <span class=".hidden-xs">{{ mess.auteur.nom }}</span>
23   - <br/> {{ mess.auteur.section }}
  20 + <span class="visible-xs">{{ mess.auteur.login }}</span>
  21 + <span class="hidden-xs">{{ mess.auteur.nom }}</span>
24 22 <br/> {{ mess.auteur.role }}
  23 + <span class="hidden-xs"> - {{ mess.auteur.section }}</span>
25 24 <br/> {{ doss.date }}
26 25 </td>
27   - <!-- <td btf-markdown="mess.content"></td> -->
28 26 <td mess-edit></td>
29 27 <td>
30 28 <mess-viewsource></mess-viewsource>
... ...