Commit f22cd7f33a7d884a38dc27af7a3d070768a3b9c6

Authored by Geoffrey PREUD'HOMME
1 parent 79edca45

Système de messages basique

Messs...
app/models/ConvModl.js
@@ -4,9 +4,7 @@ module.exports = mongoose.model('Conv', { @@ -4,9 +4,7 @@ module.exports = mongoose.model('Conv', {
4 titre: { 4 titre: {
5 type: String, 5 type: String,
6 default: "Conversation" 6 default: "Conversation"
7 - },  
8 - started: {  
9 - type: Date,  
10 - default: Date.now  
11 } 7 }
  8 + // TODO Visibilité (brouillon)
  9 + // TODO Répertoire
12 }); 10 });
app/models/MembreModl.js
@@ -5,7 +5,7 @@ module.exports = mongoose.model('Membre', { @@ -5,7 +5,7 @@ module.exports = mongoose.model('Membre', {
5 type: String, 5 type: String,
6 default: 'login' 6 default: 'login'
7 }, 7 },
8 - section: { 8 + section: { // TODO From /etc/groups
9 type: String, 9 type: String,
10 default: 'IMA' 10 default: 'IMA'
11 }, 11 },
app/models/MessModl.js 0 → 100644
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +var mongoose = require('mongoose');
  2 +
  3 +module.exports = mongoose.model('Mess', {
  4 + content: {
  5 + type: String,
  6 + default: "Contenu du message"
  7 + },
  8 + login: {
  9 + type: String,
  10 + default: 'login'
  11 + },
  12 + conv: {
  13 + type: String,
  14 + },
  15 + date: {
  16 + type: Date,
  17 + default: Date.now
  18 + }
  19 +});
app/routes/ApiRtes.js
@@ -2,12 +2,13 @@ var MembresServ = require('../services/MembresServ'); @@ -2,12 +2,13 @@ var MembresServ = require('../services/MembresServ');
2 var SessionsServ = require('../services/SessionsServ'); 2 var SessionsServ = require('../services/SessionsServ');
3 var DecryptServ = require('../services/DecryptServ'); 3 var DecryptServ = require('../services/DecryptServ');
4 var ConvsServ = require('../services/ConvsServ'); 4 var ConvsServ = require('../services/ConvsServ');
  5 +var MessServ = require('../services/MessServ');
5 var express = require('express'); 6 var express = require('express');
6 7
7 var api = express(); 8 var api = express();
8 9
9 // Authentication 10 // Authentication
10 -requireAuth = function () { 11 +reqAuth = function () {
11 return function (req, res, next) { 12 return function (req, res, next) {
12 SessionsServ.use(req.cookies.session, function (err) { 13 SessionsServ.use(req.cookies.session, function (err) {
13 if (err) { 14 if (err) {
@@ -24,18 +25,49 @@ requireAuth = function () { @@ -24,18 +25,49 @@ requireAuth = function () {
24 }; 25 };
25 }; 26 };
26 27
27 -requirePerm = function (perm) { 28 +reqVerified = function (verify) {
28 return function (req, res, next) { 29 return function (req, res, next) {
29 - requireAuth()(req, res, function () {  
30 - if (req.session[perm]) {  
31 - next();  
32 - } else {  
33 - res.status(403).end();  
34 - } 30 + reqAuth()(req, res, function () {
  31 + verify(req, res, function (err, verified) {
  32 + if (err) {
  33 + res.status(500).send(err);
  34 + } else {
  35 + if (verified) {
  36 + next();
  37 + } else {
  38 + res.status(403);
  39 + }
  40 + }
  41 + });
  42 + });
  43 + };
  44 +};
  45 +
  46 +reqPerm = function (perm) {
  47 + return reqVerified(function (req, res, cb) {
  48 + cb(null, req.session[perm]);
  49 + });
  50 +};
  51 +
  52 +assert = function (test) {
  53 + return function (req, res, next) {
  54 + reqAuth()(req, res, function () {
  55 + test(req, res, function (err, verified) {
  56 + if (err) {
  57 + res.status(500).send(err);
  58 + } else {
  59 + if (verified) {
  60 + next();
  61 + } else {
  62 + res.status(400);
  63 + }
  64 + }
  65 + });
35 }); 66 });
36 }; 67 };
37 }; 68 };
38 69
  70 +
39 // Sessions 71 // Sessions
40 api.get('/session', function (req, res) { // Informations sur la session 72 api.get('/session', function (req, res) { // Informations sur la session
41 if (req.cookies && req.cookies.session) { 73 if (req.cookies && req.cookies.session) {
@@ -87,7 +119,7 @@ api.get('/membres', function (req, res) { // Liste des membres @@ -87,7 +119,7 @@ api.get('/membres', function (req, res) { // Liste des membres
87 }); 119 });
88 }); 120 });
89 121
90 -api.post('/membres', requirePerm('canAddMembre'), function (req, res) { // Ajout d'un membre 122 +api.post('/membres', reqPerm('canAddMembre'), function (req, res) { // Ajout d'un membre
91 MembresServ.add(req.body, function (err, membre) { 123 MembresServ.add(req.body, function (err, membre) {
92 if (err) 124 if (err)
93 res.send(err); 125 res.send(err);
@@ -96,7 +128,7 @@ api.post('/membres', requirePerm('canAddMembre'), function (req, res) { // Ajout @@ -96,7 +128,7 @@ api.post('/membres', requirePerm('canAddMembre'), function (req, res) { // Ajout
96 }); 128 });
97 }); 129 });
98 130
99 -api.delete('/membres/:membre_id', requirePerm('canDelMembre'), function (req, res) { // Supression d'un membre 131 +api.delete('/membres/:membre_id', reqPerm('canDelMembre'), function (req, res) { // Supression d'un membre
100 MembresServ.remove(req.params.membre_id, function (err, membre) { 132 MembresServ.remove(req.params.membre_id, function (err, membre) {
101 if (err) 133 if (err)
102 res.send(err); 134 res.send(err);
@@ -125,7 +157,7 @@ api.get('/convs/:conv_id', function (req, res) { // Une conv @@ -125,7 +157,7 @@ api.get('/convs/:conv_id', function (req, res) { // Une conv
125 }); 157 });
126 }); 158 });
127 159
128 -api.post('/convs', requirePerm('canAddConv'), function (req, res) { // Ajout d'un conv 160 +api.post('/convs', reqPerm('canAddConv'), function (req, res) { // Ajout d'un conv
129 ConvsServ.add(req.body, function (err, conv) { 161 ConvsServ.add(req.body, function (err, conv) {
130 if (err) 162 if (err)
131 res.send(err); 163 res.send(err);
@@ -134,7 +166,7 @@ api.post('/convs', requirePerm('canAddConv'), function (req, res) { // Ajout d'u @@ -134,7 +166,7 @@ api.post('/convs', requirePerm('canAddConv'), function (req, res) { // Ajout d'u
134 }); 166 });
135 }); 167 });
136 168
137 -api.delete('/convs/:conv_id', requirePerm('canDelConv'), function (req, res) { // Supression d'un conv 169 +api.delete('/convs/:conv_id', reqPerm('canDelConv'), function (req, res) { // Supression d'un conv
138 ConvsServ.remove(req.params.conv_id, function (err, conv) { 170 ConvsServ.remove(req.params.conv_id, function (err, conv) {
139 if (err) 171 if (err)
140 res.send(err); 172 res.send(err);
@@ -144,8 +176,8 @@ api.delete('/convs/:conv_id', requirePerm('canDelConv'), function (req, res) { / @@ -144,8 +176,8 @@ api.delete('/convs/:conv_id', requirePerm('canDelConv'), function (req, res) { /
144 }); 176 });
145 177
146 // Messages 178 // Messages
147 -api.get('/messs', function (req, res) { // Liste des messs  
148 - MessServ.list(function (err, messs) { 179 +api.get('/messs/:conv_id', function (req, res) { // Liste des messs
  180 + MessServ.list(req.params.conv_id, function (err, messs) {
149 if (err) 181 if (err)
150 res.send(err); 182 res.send(err);
151 else 183 else
@@ -162,8 +194,10 @@ api.get('/messs/:mess_id', function (req, res) { // Une mess @@ -162,8 +194,10 @@ api.get('/messs/:mess_id', function (req, res) { // Une mess
162 }); 194 });
163 }); 195 });
164 196
165 -api.post('/messs', requireAuth(), function (req, res) { // Ajout d'un mess  
166 - MessServ.add(req.body, function (err, mess) { 197 +api.post('/messs', reqAuth(), function (req, res) { // Ajout d'un mess
  198 + data = req.body;
  199 + data.login = req.session.login;
  200 + MessServ.add(data, function (err, mess) {
167 if (err) 201 if (err)
168 res.send(err); 202 res.send(err);
169 else 203 else
@@ -171,7 +205,7 @@ api.post('/messs', requireAuth(), function (req, res) { // Ajout d'un mess @@ -171,7 +205,7 @@ api.post('/messs', requireAuth(), function (req, res) { // Ajout d'un mess
171 }); 205 });
172 }); 206 });
173 207
174 -api.delete('/messs/:mess_id', requireAuth(), function (req, res) { // Supression d'un mess 208 +api.delete('/messs/:mess_id', reqAuth(), function (req, res) { // Supression d'un mess
175 MessServ.remove(req.params.mess_id, function (err, mess) { 209 MessServ.remove(req.params.mess_id, function (err, mess) {
176 if (err) 210 if (err)
177 res.send(err); 211 res.send(err);
@@ -180,4 +214,7 @@ api.delete('/messs/:mess_id', requireAuth(), function (req, res) { // Supression @@ -180,4 +214,7 @@ api.delete('/messs/:mess_id', requireAuth(), function (req, res) { // Supression
180 }); 214 });
181 }); 215 });
182 216
  217 +// TODO 404
  218 +// TODO 418
  219 +
183 module.exports = api; 220 module.exports = api;
app/services/ConvsServ.js
@@ -18,7 +18,16 @@ ConvsServ.addData = function (conv, cb) { @@ -18,7 +18,16 @@ ConvsServ.addData = function (conv, cb) {
18 cb(null, conv); 18 cb(null, conv);
19 }; 19 };
20 20
21 -ConvsServ.get = function(id, cb) { 21 +ConvsServ.exists = function (id, cb) {
  22 + ConvModl.findById(id).exec(function (err, conv) {
  23 + if (err)
  24 + cb(err);
  25 + else
  26 + cb(null, true);
  27 + });
  28 +};
  29 +
  30 +ConvsServ.get = function (id, cb) {
22 ConvModl.findById(id).lean().exec(function (err, conv) { 31 ConvModl.findById(id).lean().exec(function (err, conv) {
23 if (err) 32 if (err)
24 cb(err); 33 cb(err);
@@ -27,7 +36,7 @@ ConvsServ.get = function(id, cb) { @@ -27,7 +36,7 @@ ConvsServ.get = function(id, cb) {
27 }); 36 });
28 }; 37 };
29 38
30 -ConvsServ.list = function (cb) { 39 +ConvsServ.list = function (cb) { // TODO Visibilité
31 ConvModl.find({}).lean().exec(function (err, Convs) { 40 ConvModl.find({}).lean().exec(function (err, Convs) {
32 async.mapSeries(Convs, ConvsServ.addData, cb); 41 async.mapSeries(Convs, ConvsServ.addData, cb);
33 }); 42 });
@@ -36,11 +45,15 @@ ConvsServ.list = function (cb) { @@ -36,11 +45,15 @@ ConvsServ.list = function (cb) {
36 ConvsServ.add = function (data, cb) { 45 ConvsServ.add = function (data, cb) {
37 ConvModl.create({ 46 ConvModl.create({
38 titre: data.titre 47 titre: data.titre
39 - }, function(err, Conv) { 48 + }, function (err, Conv) {
40 ConvsServ.get(Conv._id, cb); 49 ConvsServ.get(Conv._id, cb);
41 }); 50 });
42 }; 51 };
43 52
  53 +ConvsServ.canWriteIn = function (id, login, cb) {
  54 + ConvsServ.exists(id, cb);
  55 +};
  56 +
44 ConvsServ.remove = function (id, cb) { 57 ConvsServ.remove = function (id, cb) {
45 // TODO Trash 58 // TODO Trash
46 ConvModl.remove({ 59 ConvModl.remove({
app/services/MessServ.js 0 → 100644
@@ -0,0 +1,64 @@ @@ -0,0 +1,64 @@
  1 +var MessModl = require('../models/MessModl');
  2 +// var NomsServ = require('../services/NomsServ');
  3 +var ConvsServ = require('../services/ConvsServ');
  4 +var async = require('async');
  5 +
  6 +var MesssServ = {};
  7 +
  8 +MesssServ.addData = function (mess, cb) {
  9 + // NomsServ.get(Mess.login, function (nom) {
  10 + // if (nom) {
  11 + // Mess.nom = nom;
  12 + // } else {
  13 + // Mess.nom = Mess.login;
  14 + // }
  15 + // cb(null, Mess);
  16 + // });
  17 + cb(null, mess);
  18 +};
  19 +
  20 +MesssServ.get = function (id, cb) {
  21 + MessModl.findById(id).lean().exec(function (err, mess) {
  22 + if (err)
  23 + cb(err);
  24 + else
  25 + MesssServ.addData(mess, cb);
  26 + });
  27 +};
  28 +
  29 +MesssServ.list = function (conv, cb) {
  30 + MessModl.find({
  31 + conv: conv
  32 + }).lean().exec(function (err, Messs) {
  33 + async.mapSeries(Messs, MesssServ.addData, cb);
  34 + });
  35 +};
  36 +
  37 +MesssServ.add = function (data, cb) {
  38 + ConvsServ.canWriteIn(data.conv, data.login, function (err, canWriteIn) {
  39 + if (err)
  40 + cb(err);
  41 + else {
  42 + if (canWriteIn) {
  43 + MessModl.create({
  44 + content: data.content,
  45 + login: data.login,
  46 + conv: data.conv
  47 + }, function (err, Mess) {
  48 + MesssServ.get(Mess._id, cb);
  49 + });
  50 + } else {
  51 + cb('unauthorized');
  52 + }
  53 + }
  54 + });
  55 +};
  56 +
  57 +MesssServ.remove = function (id, cb) {
  58 + // TODO Trash
  59 + MessModl.remove({
  60 + _id: id
  61 + }, cb);
  62 +};
  63 +
  64 +module.exports = MesssServ;
app/services/SessionsServ.js
@@ -15,8 +15,10 @@ sessions.addData = function (session, cb) { @@ -15,8 +15,10 @@ sessions.addData = function (session, cb) {
15 } 15 }
16 session.canAddMembre = session.login == 'gbontoux'; 16 session.canAddMembre = session.login == 'gbontoux';
17 session.canDelMembre = session.login == 'gbontoux'; 17 session.canDelMembre = session.login == 'gbontoux';
18 - session.canAddConv = session.login == 'gbontoux'; 18 + session.canAddConv = true;
19 session.canDelConv = session.login == 'gbontoux'; 19 session.canDelConv = session.login == 'gbontoux';
  20 + session.canAddMess = true;
  21 + session.canDelMess = session.login == 'gbontoux';
20 cb(session); 22 cb(session);
21 }); 23 });
22 }; 24 };
@@ -70,7 +72,7 @@ sessions.use = function (id, cb) { @@ -70,7 +72,7 @@ sessions.use = function (id, cb) {
70 if (err) { 72 if (err) {
71 cb(err); 73 cb(err);
72 } else { 74 } else {
73 - _this.cur = session; 75 + _this.cur = session; // TODO Get rid of _this.cur
74 cb(null); 76 cb(null);
75 } 77 }
76 }); 78 });
public/js/controllers/ForumConvCtrl.js
1 angular.module('ForumConvCtrl', ['SessionsServ', 'ForumServ', 'NotifyServ']).controller('ForumConvCtrl', ['$scope', '$routeParams', 'SessionServ', 'ForumServ', 'NotifyServ', 1 angular.module('ForumConvCtrl', ['SessionsServ', 'ForumServ', 'NotifyServ']).controller('ForumConvCtrl', ['$scope', '$routeParams', 'SessionServ', 'ForumServ', 'NotifyServ',
2 function ($scope, $routeParams, SessionServ, ForumServ, NotifyServ) { 2 function ($scope, $routeParams, SessionServ, ForumServ, NotifyServ) {
  3 + $scope.messs = [];
3 $scope.conv = {}; 4 $scope.conv = {};
4 - // $scope.formData = {}; 5 + $scope.formData = {};
5 6
6 $scope.session = SessionServ.cur; 7 $scope.session = SessionServ.cur;
7 SessionServ.onChange(function () { 8 SessionServ.onChange(function () {
8 $scope.session = SessionServ.cur; 9 $scope.session = SessionServ.cur;
9 }); 10 });
10 - ForumServ.getConv($routeParams.conv_id, function(err, conv) { 11 + ForumServ.getConv($routeParams.conv_id, function (err, conv) {
11 if (!err) 12 if (!err)
12 $scope.conv = conv; 13 $scope.conv = conv;
  14 + ForumServ.getMesss(conv._id, function (err, messs) {
  15 + if (!err)
  16 + $scope.messs = messs;
  17 + });
13 }); 18 });
14 - //  
15 - // $scope.createConv = function () {  
16 - // ForumServ.createConv($scope.formData, function(err, conv) {  
17 - // if (!err)  
18 - // $scope.formData = {};  
19 - // $scope.convs.push(conv);  
20 - // });  
21 - // };  
22 - //  
23 - // $scope.deleteConv = function (index) {  
24 - // ForumServ.deleteConv($scope.convs[index]._id, function(err) {  
25 - // if (!err)  
26 - // $scope.convs.splice(index, 1);  
27 - // });  
28 - // }; 19 +
  20 + $scope.createMess = function () {
  21 + data = $scope.formData;
  22 + data.conv = $scope.conv._id;
  23 + ForumServ.createMess(data, function (err, mess) {
  24 + console.log(mess);
  25 + if (!err)
  26 + $scope.formData = {};
  27 + $scope.messs.push(mess);
  28 + });
  29 + };
  30 +
  31 + $scope.deleteMess = function (index) {
  32 + ForumServ.deleteMess($scope.messs[index]._id, function (err) {
  33 + if (!err)
  34 + $scope.messs.splice(index, 1);
  35 + });
  36 + };
29 37
30 } 38 }
31 ]); 39 ]);
public/js/services/ForumServ.js
@@ -44,6 +44,42 @@ angular.module('ForumServ', ['NotifyServ']).service('ForumServ', ['$http', 'Noti @@ -44,6 +44,42 @@ angular.module('ForumServ', ['NotifyServ']).service('ForumServ', ['$http', 'Noti
44 .error(function (data) { 44 .error(function (data) {
45 not.error("Impossible de supprimer le conv", data); 45 not.error("Impossible de supprimer le conv", data);
46 }); 46 });
  47 + },
  48 +
  49 + // Message
  50 + getMesss: function (conv, cb) {
  51 + // TODO Dirs
  52 + $http.get('/api/messs/' + conv)
  53 + .success(function (data) {
  54 + cb(null, data);
  55 + })
  56 + .error(function (data) { // TODO CBs
  57 + NotifyServ.error("Impossible d'obtenir la liste des messs", data);
  58 + });
  59 + },
  60 +
  61 + createMess: function (data, cb) {
  62 + var not = NotifyServ.promise("Ajout du mess...");
  63 + $http.post('/api/messs', data)
  64 + .success(function (mess) {
  65 + not.success("Mess ajouté");
  66 + cb(null, mess);
  67 + })
  68 + .error(function (data) {
  69 + not.error("Impossible d'ajouter le mess");
  70 + });
  71 + },
  72 +
  73 + deleteMess: function (id, cb) {
  74 + var not = NotifyServ.promise("Suppression du mess...");
  75 + $http.delete('/api/messs/' + id)
  76 + .success(function (mess) {
  77 + not.success("Mess supprimé");
  78 + cb(null);
  79 + })
  80 + .error(function (data) {
  81 + not.error("Impossible de supprimer le mess", data);
  82 + });
47 } 83 }
48 }; 84 };
49 return a; 85 return a;
public/views/forumConv.html
1 <div class="container"> 1 <div class="container">
2 <ol class="breadcrumb"> 2 <ol class="breadcrumb">
3 - <li><a href="#">Home</a></li>  
4 - <li><a href="#">Library</a></li>  
5 - <li class="active">Conv</li> 3 + <li><a href="#">Forum</a></li>
  4 + <li><a href="#">Conversations</a></li>
  5 + <li class="active">{{ conv.titre }}</li>
6 </ol> 6 </ol>
7 <h1>{{ conv.titre }}</h1> 7 <h1>{{ conv.titre }}</h1>
  8 + <div class="panel panel-default" ng-repeat="mess in messs">
  9 + <div class="panel-heading">
  10 + {{ mess.login }}
  11 + <button ng-if="session.canDelMess" type="button" class="btn btn-danger" ng-click="deleteMess($index)">
  12 + <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Supprimer
  13 + </button>
  14 + </div>
  15 + <div class="panel-body">
  16 + {{ mess.content }}
  17 + </div>
  18 + </div>
  19 + <div class="form-group" ng-if="session.canAddMess">
  20 + <div class="panel panel-default">
  21 + <div class="panel-heading">
  22 + <h4 class="panel-title">
  23 + Nouveau message
  24 + </h4>
  25 + </div>
  26 + <div class="panel-body">
  27 + <textarea class="form-control" rows="3" ng-model="formData.content"></textarea>
  28 + <button type="submit" class="btn btn-primary" aria-label="Ajouter" ng-click="createMess()">
  29 + <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Ajouter
  30 + </button>
  31 + </div>
  32 + </div>
  33 + </div>
8 <nav> 34 <nav>
9 <ul class="pagination"> 35 <ul class="pagination">
10 <li> 36 <li>
@@ -24,4 +50,4 @@ @@ -24,4 +50,4 @@
24 </li> 50 </li>
25 </ul> 51 </ul>
26 </nav> 52 </nav>
27 -</div> 53 -</div>
  54 +</div>
28 \ No newline at end of file 55 \ No newline at end of file
public/views/forumDir.html
1 <div class="container"> 1 <div class="container">
2 <ol class="breadcrumb"> 2 <ol class="breadcrumb">
3 - <li><a href="#">Home</a></li>  
4 - <li><a href="#">Library</a></li>  
5 - <li class="active">Data</li> 3 + <li><a href="#">Forum</a></li>
  4 + <li><a href="#">Dossiers</a></li>
  5 + <li class="active">{{ dossier.name }}</li>
6 </ol> 6 </ol>
7 <div class="panel panel-default" ng-repeat="conv in convs"> 7 <div class="panel panel-default" ng-repeat="conv in convs">
8 <div class="panel-heading"> 8 <div class="panel-heading">
@@ -11,8 +11,7 @@ @@ -11,8 +11,7 @@
11 </a> 11 </a>
12 </div> 12 </div>
13 <div class="panel-body"> 13 <div class="panel-body">
14 - <strong>Date : </strong>{{ conv.date }}  
15 - <br/> 14 + <!-- <strong>Date : </strong>{{ conv.date }}<br/> -->
16 <button ng-if="session.canDelConv" type="button" class="btn btn-danger" ng-click="deleteConv($index)"> 15 <button ng-if="session.canDelConv" type="button" class="btn btn-danger" ng-click="deleteConv($index)">
17 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Supprimer 16 <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Supprimer
18 </button> 17 </button>
@@ -52,4 +51,4 @@ @@ -52,4 +51,4 @@
52 </li> 51 </li>
53 </ul> 52 </ul>
54 </nav> 53 </nav>
55 -</div> 54 -</div>
  55 +</div>
56 \ No newline at end of file 56 \ No newline at end of file