From 61d4f32694a7eea32f66bf3c37ecf7da5b506010 Mon Sep 17 00:00:00 2001 From: Geoffrey Frogeye Date: Tue, 14 Apr 2015 22:46:10 +0200 Subject: [PATCH] Gestion des dossiers --- app/models/ConvModl.js | 4 ++++ app/models/DossModl.js | 17 +++++++++++++++++ app/routes/ApiRtes.js | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- app/services/ConvsServ.js | 11 ++++++++++- app/services/DosssServ.js | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ public/js/app.js | 4 ++-- public/js/controllers/ForumDirCtrl.js | 44 ++++++++++++++++++++++++++++++++++++-------- public/js/services/ApiServ.js | 1 + public/views/forumConv.html | 6 +++--- public/views/forumDir.html | 52 +++++++++++++++++++++++++++++++++++++++++++--------- 10 files changed, 284 insertions(+), 32 deletions(-) create mode 100644 app/models/DossModl.js create mode 100644 app/services/DosssServ.js diff --git a/app/models/ConvModl.js b/app/models/ConvModl.js index 1346be9..630e0b3 100644 --- a/app/models/ConvModl.js +++ b/app/models/ConvModl.js @@ -4,6 +4,10 @@ module.exports = mongoose.model('Conv', { titre: { type: String, default: "Conversation" + }, + parent: { + type: String, + default: 'lost' } // TODO Visibilité (brouillon) // TODO Répertoire diff --git a/app/models/DossModl.js b/app/models/DossModl.js new file mode 100644 index 0000000..2d3b8f2 --- /dev/null +++ b/app/models/DossModl.js @@ -0,0 +1,17 @@ +var mongoose = require('mongoose'); + +module.exports = mongoose.model('Doss', { + titre: { + type: String, + default: "Dossier" + }, + parent: { + type: String, + default: 'lost' + }, + special: { + type: String, + default: '' + } + // TODO Visibilité (brouillon) +}); diff --git a/app/routes/ApiRtes.js b/app/routes/ApiRtes.js index 723359c..f9cb8db 100644 --- a/app/routes/ApiRtes.js +++ b/app/routes/ApiRtes.js @@ -1,6 +1,7 @@ var MembresServ = require('../services/MembresServ'); var PolyUserServ = require('../services/PolyUserServ'); var DecryptServ = require('../services/DecryptServ'); +var DosssServ = require('../services/DosssServ'); var ConvsServ = require('../services/ConvsServ'); var MessServ = require('../services/MessServ'); var fs = require('fs'); @@ -94,6 +95,8 @@ sessionData = function (session, cb) { session.canDelConv = session.bureau; session.canAddMess = true; session.canDelMess = session.bureau; + session.canAddDoss = session.bureau; + session.canDelDoss = session.bureau; cb(session); }); }); @@ -184,17 +187,58 @@ api.delete('/membres/:membre_id', reqPerm('canDelMembre'), function (req, res) { }); }); +// Dossiers +api.get('/dosss/:doss_id', function (req, res) { // Un doss + // TODO Assertion 404 existe, transformer req.body.id avec la vraie id (ou redirect) + // TODO Requêtes séparées ? + DosssServ.get(req.params.doss_id, function (err, doss) { // TODO Async + if (err) { + res.status(500).send(err); + } else if (!doss) { + res.status(404); + } else { + DosssServ.children(doss._id, function (err, dosss) { + if (err) { + res.status(500).send(err); + } else { + doss.dosss = dosss; + ConvsServ.children(doss._id, function (err, convs) { + if (err) { + res.status(500).send(err); + } else { + doss.convs = convs; + res.json(doss); + } + }); + } + }); + } + }); +}); -// Conversations -api.get('/convs', function (req, res) { // Liste des convs - ConvsServ.list(function (err, convs) { +api.post('/dosss', reqPerm('canAddDoss'), function (req, res) { // Ajout d'un doss + // 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; + DosssServ.add(req.body, function (err, doss) { + if (err) + res.status(500).send(err); + else + res.json(doss); + }); + }); +}); + +api.delete('/dosss/:doss_id', reqPerm('canDelDoss'), function (req, res) { // Supression d'un doss + DosssServ.remove(req.params.doss_id, function (err, doss) { if (err) res.status(500).send(err); else - res.json(convs); + res.json(null); }); }); +// Conversations api.get('/convs/:conv_id', function (req, res) { // Une conv ConvsServ.get(req.params.conv_id, function (err, conv) { if (err) @@ -205,11 +249,15 @@ api.get('/convs/:conv_id', function (req, res) { // Une conv }); api.post('/convs', reqPerm('canAddConv'), function (req, res) { // Ajout d'un conv - ConvsServ.add(req.body, function (err, conv) { - if (err) - res.status(500).send(err); - else - res.json(conv); + // 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; + ConvsServ.add(req.body, function (err, conv) { + if (err) + res.status(500).send(err); + else + res.json(conv); + }); }); }); diff --git a/app/services/ConvsServ.js b/app/services/ConvsServ.js index 813b71d..f4f32ee 100644 --- a/app/services/ConvsServ.js +++ b/app/services/ConvsServ.js @@ -42,9 +42,18 @@ ConvsServ.list = function (cb) { // TODO Visibilité }); }; +ConvsServ.children = function (id, cb) { + ConvModl.find({ + parent: id + }).lean().exec(function (err, Conv) { + async.mapSeries(Conv, ConvsServ.addData, cb); + }); +}; + ConvsServ.add = function (data, cb) { ConvModl.create({ - titre: data.titre + titre: data.titre, + parent: data.parent }, function (err, Conv) { ConvsServ.get(Conv._id, cb); }); diff --git a/app/services/DosssServ.js b/app/services/DosssServ.js new file mode 100644 index 0000000..eb13b17 --- /dev/null +++ b/app/services/DosssServ.js @@ -0,0 +1,111 @@ +var DossModl = require('../models/DossModl'); +// var PolyUserServ = require('../services/PolyUserServ'); +var async = require('async'); + +var DosssServ = {}; + +(function init() { + DossModl.find({ + special: 'root' + }).exec(function (err, data) { + if (data.length < 1) { + DossModl.create({ + special: 'root', + titre: 'Racine' + }); + } + }); +})(); + +DosssServ.addData = function (doss, cb) { + // PolyUserServ.get(Doss.login, function (err, nom) { + // if (nom) { + // Doss.nom = nom; + // } else { + // Doss.nom = Doss.login; + // } + // cb(null, Doss); + // }); + // TODO Dernier message + cb(null, doss); +}; + +DosssServ.exists = function (id, cb) { + DossModl.findById(id).exec(function (err, doss) { + if (err) + cb(err); + else + cb(null, true); + }); +}; + +DosssServ.getId = function (special, cb) { + DossModl.findById(special).exec(function (err, doss) { + if (!err && doss) { + cb(doss._id); // Équivalent à cb(special) + } else { + + DossModl.findOne({ + special: special + }).exec(function (err2, doss) { + if (!err2 && doss) { + cb(doss._id); + } else { + cb(null); + } + }); + } + }); +}; + +DosssServ.get = function (special, cb) { + DosssServ.getId(special, function (id) { // TODO À enlever avec api.get('/dosss/:doss_id') + DossModl.findById(id).lean().exec(function (err, doss) { + if (err) { + cb(err); + } else { + DosssServ.addData(doss, cb); + } + }); + }); +}; + +DosssServ.list = function (cb) { + DossModl.find({}).lean().exec(function (err, Dosss) { + async.mapSeries(Dosss, DosssServ.addData, cb); + }); +}; + +DosssServ.children = function (id, cb) { + DossModl.find({ + parent: id + }).lean().exec(function (err, Dosss) { + async.mapSeries(Dosss, DosssServ.addData, cb); + }); +}; + +DosssServ.add = function (data, cb) { + DossModl.create({ + titre: data.titre, + parent: data.parent + }, function (err, Doss) { + if (err) { + cb(err); + } else { + DosssServ.get(Doss._id, cb); + } + }); +}; + +DosssServ.canWriteIn = function (id, login, cb) { + DosssServ.exists(id, cb); +}; + +DosssServ.remove = function (id, cb) { + // TODO Trash + DossModl.remove({ + _id: id + }, cb); +}; + +module.exports = DosssServ; diff --git a/public/js/app.js b/public/js/app.js index 5921cc7..54f05be 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -8,9 +8,9 @@ angular.module('ciApp', ['ngAnimate', 'ngRoute', 'ConnectCtrl', 'MembreCtrl', 'F controller: 'MembreCtrl' }) .when('/forum', { - redirectTo: 'forum/dir/0' + redirectTo: 'forum/dir/root' }) - .when('/forum/dir/:dir_id', { + .when('/forum/dir/:doss_id', { templateUrl: 'views/forumDir.html', controller: 'ForumDirCtrl' }) diff --git a/public/js/controllers/ForumDirCtrl.js b/public/js/controllers/ForumDirCtrl.js index ad3ba68..2e949c5 100644 --- a/public/js/controllers/ForumDirCtrl.js +++ b/public/js/controllers/ForumDirCtrl.js @@ -1,29 +1,57 @@ angular.module('ForumDirCtrl', ['SessionsServ', 'ApiServ']) - .controller('ForumDirCtrl', function ($scope, SessionServ, ApiServ) { + .controller('ForumDirCtrl', function ($scope, $routeParams, SessionServ, ApiServ) { $scope.convs = []; - $scope.formData = {}; + $scope.dosss = []; + $scope.formDoss = {}; + $scope.formConv = {}; $scope.session = SessionServ.cur; SessionServ.onChange(function () { $scope.session = SessionServ.cur; }); - ApiServ("récupération des conversations", 'get', 'convs', function (err, convs) { - if (!err) - $scope.convs = convs; + ApiServ("récupération du dossier", 'get', 'dosss', $routeParams.doss_id, function (err, doss) { + if (err) { + console.error(err); + } else { + if (doss) { + $scope.dosss = doss.dosss; + $scope.convs = doss.convs; + } + } }); + // Dossiers + $scope.createDoss = function () { + $scope.formDoss.parent = $routeParams.doss_id; + ApiServ("création du dossier", 'post', 'dosss', $scope.formDoss, function (err, doss) { + if (!err) { + $scope.formDoss = {}; + $scope.dosss.push(doss); + } + }); + }; + + $scope.deleteDoss = function (index) { + ApiServ("suppression du dossier", 'delete', 'dosss', $scope.dosss[index]._id, function (err) { + if (!err) + $scope.dosss.splice(index, 1); + }); + }; + + // Conversations $scope.createConv = function () { - ApiServ("création de la conversation", 'post', 'convs', $scope.formData, function (err, conv) { + $scope.formConv.parent = $routeParams.doss_id; + ApiServ("création de la conversation", 'post', 'convs', $scope.formConv, function (err, conv) { if (!err) { - $scope.formData = {}; + $scope.formConv = {}; $scope.convs.push(conv); } }); }; $scope.deleteConv = function (index) { - ApiServ("création de la conversation", 'delete', 'convs', $scope.convs[index]._id, function (err) { + ApiServ("suppression de la conversation", 'delete', 'convs', $scope.convs[index]._id, function (err) { if (!err) $scope.convs.splice(index, 1); }); diff --git a/public/js/services/ApiServ.js b/public/js/services/ApiServ.js index ea354b4..c50009c 100644 --- a/public/js/services/ApiServ.js +++ b/public/js/services/ApiServ.js @@ -1,6 +1,7 @@ angular.module('ApiServ', ['NotifyServ']) .service('ApiServ', function ($http, NotifyServ) { return function (name, method, href) { + var cb; link = '/api/' + href; arglen = arguments.length; if (typeof arguments[arglen - 1] == 'function') { diff --git a/public/views/forumConv.html b/public/views/forumConv.html index 0443768..19ed623 100644 --- a/public/views/forumConv.html +++ b/public/views/forumConv.html @@ -1,6 +1,6 @@
@@ -31,7 +31,7 @@
-