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,7 +8,9 @@ module.exports = mongoose.model('Conv', {
8 parent: { 8 parent: {
9 type: String, 9 type: String,
10 default: 'lost' 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,6 +12,9 @@ module.exports = mongoose.model('Doss', {
12 special: { 12 special: {
13 type: String, 13 type: String,
14 default: '' 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,5 +8,9 @@ module.exports = mongoose.model('Membre', {
8 role: { 8 role: {
9 type: String, 9 type: String,
10 default: 'Membre' 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,5 +15,9 @@ module.exports = mongoose.model('Mess', {
15 date: { 15 date: {
16 type: Date, 16 type: Date,
17 default: Date.now 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,12 +2,10 @@ var MembresServ = require('../services/MembresServ');
2 var PolyUserServ = require('../services/PolyUserServ'); 2 var PolyUserServ = require('../services/PolyUserServ');
3 var DecryptServ = require('../services/DecryptServ'); 3 var DecryptServ = require('../services/DecryptServ');
4 var DosssServ = require('../services/DosssServ'); 4 var DosssServ = require('../services/DosssServ');
5 -var DossModl = require('../models/DossModl');  
6 var ConvsServ = require('../services/ConvsServ'); 5 var ConvsServ = require('../services/ConvsServ');
7 -var ConvModl = require('../models/ConvModl');  
8 var MessServ = require('../services/MessServ'); 6 var MessServ = require('../services/MessServ');
9 -var MessModl = require('../models/MessModl'); // TODO Unfier ce bazar / supprimer Serv  
10 var fs = require('fs'); 7 var fs = require('fs');
  8 +var async = require('async');
11 var mongoose = require('mongoose'); 9 var mongoose = require('mongoose');
12 var express = require('express'); 10 var express = require('express');
13 var session = require('express-session'); 11 var session = require('express-session');
@@ -32,16 +30,11 @@ ensureOkay = function (res, status, cb) { @@ -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 // TODO Statut par défaut / optionnel 34 // TODO Statut par défaut / optionnel
37 // status = 200; 35 // status = 200;
38 return ensureOkay(res, 404, function (data) { 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,12 +54,8 @@ giveBack = function (res, status) {
61 // TODO Statut par défaut / optionnel 54 // TODO Statut par défaut / optionnel
62 // status = 200; 55 // status = 200;
63 return ensureExists(res, 404, function (data) { 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,12 +71,9 @@ reqAuth = function (req, res, next) {
82 reqVerified = function (verify) { // Assert mais pour les droits (d'où le 403) 71 reqVerified = function (verify) { // Assert mais pour les droits (d'où le 403)
83 return function (req, res, next) { 72 return function (req, res, next) {
84 reqAuth(req, res, function () { 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,19 +115,27 @@ decrypt = function () {
129 115
130 116
131 // Sessions 117 // Sessions
132 -  
133 sessionData = function (session, cb) { 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,16 +162,12 @@ api.post('/session', decrypt(), assert(function (req, res, cb) {
168 if (verified) { 162 if (verified) {
169 sessionData({ 163 sessionData({
170 login: req.body.login 164 login: req.body.login
171 - }, function (session) { 165 + }, ensureOkay(res, 500, function (session) {
172 req.session.data = session; 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 } else { 171 } else {
182 req.session.destroy(ensureOkay(res, 500, function () { 172 req.session.destroy(ensureOkay(res, 500, function () {
183 res.status(401).end(); 173 res.status(401).end();
@@ -191,110 +181,122 @@ api.delete('/session', function (req, res) { // Se déconnecter @@ -191,110 +181,122 @@ api.delete('/session', function (req, res) { // Se déconnecter
191 res.status(205).end(); 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 next(); 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 // Messages 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 // Édition d'un mess 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 // Supression d'un mess 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 api.all('/coffee', function (req, res) { 301 api.all('/coffee', function (req, res) {
300 res.status(418).end(); 302 res.status(418).end();
app/services/ConvsServ.js
1 var ConvModl = require('../models/ConvModl'); 1 var ConvModl = require('../models/ConvModl');
2 -// var PolyUserServ = require('../services/PolyUserServ'); 2 +var MessServ = require('../services/MessServ');
3 var async = require('async'); 3 var async = require('async');
4 4
5 var ConvsServ = {}; 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 // TODO Démarré par 10 // TODO Démarré par
17 // TODO Dernier message 11 // TODO Dernier message
  12 + var conv = {};
  13 + for (var prop of ConvsServ.simple) {
  14 + conv[prop] = convD[prop];
  15 + }
18 cb(null, conv); 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 cb(err); 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 ConvsServ.get = function (id, cb) { 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 ConvsServ.add = function (data, cb) { 69 ConvsServ.add = function (data, cb) {
54 ConvModl.create({ 70 ConvModl.create({
55 titre: data.titre, 71 titre: data.titre,
56 parent: data.parent 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 ConvsServ.remove = function (id, cb) { 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 module.exports = ConvsServ; 87 module.exports = ConvsServ;
app/services/DosssServ.js
1 var DossModl = require('../models/DossModl'); 1 var DossModl = require('../models/DossModl');
2 -// var PolyUserServ = require('../services/PolyUserServ'); 2 +var ConvsServ = require('../services/ConvsServ');
3 var async = require('async'); 3 var async = require('async');
4 4
5 var DosssServ = {}; 5 var DosssServ = {};
@@ -15,97 +15,119 @@ 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 // TODO Dernier message 37 // TODO Dernier message
30 cb(null, doss); 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 cb(err); 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 DossModl.findById(special).exec(function (err, doss) { 83 DossModl.findById(special).exec(function (err, doss) {
44 if (!err && doss) { 84 if (!err && doss) {
45 - cb(doss._id); // Équivalent à cb(special) 85 + cb(null, doss);
46 } else { 86 } else {
47 -  
48 DossModl.findOne({ 87 DossModl.findOne({
49 special: special 88 special: special
50 }).exec(function (err2, doss) { 89 }).exec(function (err2, doss) {
51 - if (!err2 && doss) {  
52 - cb(doss._id); 90 + if (err2) {
  91 + cb(err);
53 } else { 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 DosssServ.children = function (id, cb) { 100 DosssServ.children = function (id, cb) {
80 DossModl.find({ 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 DosssServ.add = function (data, cb) { 115 DosssServ.add = function (data, cb) {
88 DossModl.create({ 116 DossModl.create({
89 titre: data.titre, 117 titre: data.titre,
90 parent: data.parent 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 DosssServ.remove = function (id, cb) { 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 module.exports = DosssServ; 133 module.exports = DosssServ;
app/services/MembresServ.js
@@ -4,40 +4,73 @@ var async = require(&#39;async&#39;); @@ -4,40 +4,73 @@ var async = require(&#39;async&#39;);
4 4
5 var MembresServ = {}; 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 MembresServ.get = function (id, cb) { 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 MembresServ.list = function (cb) { 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 MembresServ.add = function (data, cb) { 68 MembresServ.add = function (data, cb) {
  69 +
34 MembreModl.create({ 70 MembreModl.create({
35 login: data.login, 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 MembresServ.remove = function (id, cb) { 76 MembresServ.remove = function (id, cb) {
@@ -51,9 +84,9 @@ MembresServ.estMembre = function (login, cb) { @@ -51,9 +84,9 @@ MembresServ.estMembre = function (login, cb) {
51 login: login 84 login: login
52 }, function (err, data) { 85 }, function (err, data) {
53 if (!err && data) { 86 if (!err && data) {
54 - cb(true); 87 + cb(null, true);
55 } else { 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,9 +96,9 @@ MembresServ.estBureau = function (login, cb) {
63 login: login 96 login: login
64 }, function (err, data) { 97 }, function (err, data) {
65 if (!err && data && ['Président', 'Vice-président', 'Trésorier', 'Secrétaire'].indexOf(data.role) > -1) { 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 } else { 100 } else {
68 - cb(false); 101 + cb(null, false);
69 } 102 }
70 }); 103 });
71 }; 104 };
app/services/MessServ.js
1 var MessModl = require('../models/MessModl'); 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 var async = require('async'); 3 var async = require('async');
5 4
6 var MesssServ = {}; 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 cb(err); 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 MessModl.find({ 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 MesssServ.add = function (data, cb) { 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 MesssServ.remove = function (id, cb) { 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 module.exports = MesssServ; 85 module.exports = MesssServ;
public/js/controllers/ForumConvCtrl.js
1 angular.module('ForumConvCtrl', ['SessionsServ', 'ApiServ', 'MessEditDrct']) 1 angular.module('ForumConvCtrl', ['SessionsServ', 'ApiServ', 'MessEditDrct'])
2 .controller('ForumConvCtrl', function ($scope, $routeParams, SessionServ, ApiServ) { 2 .controller('ForumConvCtrl', function ($scope, $routeParams, SessionServ, ApiServ) {
3 - $scope.messs = [];  
4 $scope.conv = {}; 3 $scope.conv = {};
5 $scope.formData = {}; 4 $scope.formData = {};
6 5
@@ -11,11 +10,6 @@ angular.module(&#39;ForumConvCtrl&#39;, [&#39;SessionsServ&#39;, &#39;ApiServ&#39;, &#39;MessEditDrct&#39;]) @@ -11,11 +10,6 @@ angular.module(&#39;ForumConvCtrl&#39;, [&#39;SessionsServ&#39;, &#39;ApiServ&#39;, &#39;MessEditDrct&#39;])
11 ApiServ("récupération de la conversation", 'get', ['convs', $routeParams.conv_id], null, function (err, conv) { 10 ApiServ("récupération de la conversation", 'get', ['convs', $routeParams.conv_id], null, function (err, conv) {
12 if (!err) { 11 if (!err) {
13 $scope.conv = conv; 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,23 +21,24 @@ angular.module(&#39;ForumConvCtrl&#39;, [&#39;SessionsServ&#39;, &#39;ApiServ&#39;, &#39;MessEditDrct&#39;])
27 ApiServ("envoi du message", 'post', 'messs', data, function (err, mess) { 21 ApiServ("envoi du message", 'post', 'messs', data, function (err, mess) {
28 if (!err) { 22 if (!err) {
29 $scope.formData = {}; 23 $scope.formData = {};
30 - $scope.messs.push(mess); 24 + $scope.conv.messs.push(mess);
31 } 25 }
32 }); 26 });
33 }; 27 };
34 28
35 $scope.delMess = function (index) { 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 if (!err) 31 if (!err)
38 - $scope.messs.splice(index, 1); 32 + $scope.conv.messs.splice(index, 1);
39 }); 33 });
40 }; 34 };
41 35
42 $scope.editButton = function (index) { 36 $scope.editButton = function (index) {
43 - mess = $scope.messs[index]; 37 + mess = $scope.conv.messs[index];
44 if (mess.editMode) { 38 if (mess.editMode) {
45 ApiServ("édition du message", 'put', ['messs', mess._id], { 39 ApiServ("édition du message", 'put', ['messs', mess._id], {
46 - content: mess.content 40 + content: mess.content,
  41 + conv: $scope.conv._id
47 }, function (err, data) { 42 }, function (err, data) {
48 if (!err) { 43 if (!err) {
49 mess.content = data.content; 44 mess.content = data.content;
public/views/forumConv.html
@@ -14,17 +14,15 @@ @@ -14,17 +14,15 @@
14 </tr> 14 </tr>
15 </thead> 15 </thead>
16 <tbody> 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 {{ mess.auteur.image }} 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 <br/> {{ mess.auteur.role }} 22 <br/> {{ mess.auteur.role }}
  23 + <span class="hidden-xs"> - {{ mess.auteur.section }}</span>
25 <br/> {{ doss.date }} 24 <br/> {{ doss.date }}
26 </td> 25 </td>
27 - <!-- <td btf-markdown="mess.content"></td> -->  
28 <td mess-edit></td> 26 <td mess-edit></td>
29 <td> 27 <td>
30 <mess-viewsource></mess-viewsource> 28 <mess-viewsource></mess-viewsource>