var Response = require("./Response"); var R= Response; var E = require("./Errors"); var fs = require("fs"); var UserManager = require("./users"); var AUTH_USER="auth_user" var AUTH_PASSWORD="auth_password" var USER = "user"; var PASSWORD = "password"; var PROJECT = "project"; var DATA = "data"; var RESOURCE = "res"; function send(res, err, data, log) { if(err!=0) { var stack = new Error().stack; console.log(stack); } if(log != undefined) { console.log(log); } Response.writeResponse(res, err, data) } function sendSuccess(res, data) { return send(res, E.SUCCESS, data); } function getQueryParam(req, param) { if (req.method == "POST") { return req.body[param]; } else { return req.query[param]; } } module.exports = class Server { constructor() { this.users=new UserManager(); } /* ** Utils */ getUserQuery(req, res) { var name = getQueryParam(req, AUTH_USER); if(typeof name != 'string' || name.length<1 ) return send(res, E.AUTH_FAILED, AUTH_USER); var user = this.users.getUser(name); if(user==null) return null; return user; } getUser(req, res) { var name = req.params[USER]; if(typeof name != 'string' || name.length<1 ) return send(res, E.EINVAL, USER); var user = this.users.getUser(name); if(user==null) return null; return user; } getProject(req, res) { var user = this.getUser(req); if(user.code != undefined) return user; var pro = req.params[PROJECT]; if(typeof pro != 'string' || pro.length<1 ) return send(res, E.EINVAL, PROJECT); var projet = user.getProject(pro); if(!E.check(projet)) return send(res, projet, pro); return projet; } getResource(req, res) { var projet = this.getProject(req, res); if(projet.code != undefined) return user; var pro = req.params[RESOURCE]; if(typeof pro != 'string' || pro.length<1 ) return send(res, E.EINVAL, RESOURCE); var ress = projet.getResource(req.params[USER], req.params[PROJECT], pro); if(!E.check(ress)) return send(res, ress, pro); return ress; } authentification(req, res) { return E.SUCCESS; var password = getQueryParam(req, AUTH_PASSWORD); var urlUser = this.getUserQuery(req, res); if(urlUser.password==password) return E.SUCCESS; return send(res, E.AUTH_FAILED, "Login ou mot de passe incorrect"); } /* ** Users */ serveUser(req, res) { //if(this.authentification(req, res)==null) return null; var user = this.getUser(req, res); if(user==null) return; return sendSuccess(res, user); } listUsers(req, res) { //if(this.authentification(req, res)==null) return null; sendSuccess(res, this.users.getUserList()); } createUser(req, res) { if(this.authentification(req, res)==null) return null; var u = getQueryParam(req, USER); var p =getQueryParam(req, PASSWORD); if(u==undefined) return send(res, E.BAD_USER, USER); if(p==undefined) return send(res, E.EINVAL, PASSWORD); var ret = this.users.createUser(u, p); if(E.check(ret)) return sendSuccess(res); return send(res, E.USER_EXISTS, u); } renameUser(req, res) { if(this.authentification(req, res)==null) return null; var oldName = req.params[USER]; var newName = getQueryParam(req, "newName"); var ret = this.users.renameUser(oldName, newName); if(E.check(ret)) return sendSuccess(res); return send(res, ret, newName); } removeUser(req, res) { if(this.authentification(req, res)==null) return null; var name = req.params[USER]; var ret = this.users.removeUser(name); if(E.check(ret)) return sendSuccess(res); return send(res, ret, name); } /* POST: { user: "ptitcois", password:"xxxx", data: { [contenu] }} */ editUser(req, res) { if(this.authentification(req)==null) return null; var name = req.params[USER]; var data = getQueryParam(req, DATA); if(name==undefined) return send(res, E.EINVAL, USER); if(data==undefined) return send(res, E.EINVAL, DATA); var ret = this.users.editUser(name, data); if(E.check(ret)) return sendSuccess(res); return send(res, ret); } /* ** Projects */ serveProject(req, res) { //if(this.authentification(req, res)==null) return null; var project = this.getProject(req, res); if(project==null) return; return sendSuccess(res, project); } listProjects(req, res) { //if(this.authentification(req, res)==null) return null; var user = this.getUser(req, res); if(user==null) return; sendSuccess(res, user.projects); } createProject(req, res) { if(this.authentification(req, res)==null) return null; var user = this.getUser(req, res); if(user==null) return; var proName = getQueryParam(req, PROJECT); if(proName==undefined) return send(res, E.BAD_USER, PROJECT); var ret = user.createProject(proName); if(E.check(ret)) return sendSuccess(res); return send(res, E.PROJECT_EXISTS, u); } renameProject(req, res) { if(this.authentification(req, res)==null) return null; var user = this.getUser(req, res); if(user==null) return; var oldName = req.params[PROJECT]; var newName = getQueryParam(req, "newName"); var ret = user.renameProject(oldName, newName); if(E.check(ret)) return sendSuccess(res); return send(res, ret, newName); } removeProject(req, res) { if(this.authentification(req, res)==null) return null; var user = this.getUser(req, res); if(user==null) return; var name = req.params[PROJECT]; var ret = user.removeProject(name); if(E.check(ret)) return sendSuccess(res); return send(res, ret, name); } /* POST: { user: "ptitcois", password:"xxxx", data: { [contenu] }} */ editProject(req, res) { if(this.authentification(req)==null) return null; var user = this.getUser(req, res); if(user==null) return; var name = req.params[PROJECT]; var data = getQueryParam(req, DATA); if(name==undefined) return send(res, E.EINVAL, PROJECT); if(data==undefined) return send(res, E.EINVAL, DATA); var ret = user.editProject(name, data); if(E.check(ret)) return sendSuccess(res); return send(res, ret); } // // Resources // serveResource(req, res) { //if(this.authentification(req, res)==null) return null; var r = this.getResource(req, res); if(r==null) return; return sendSuccess(r, project); } listResources(req, res) { //if(this.authentification(req, res)==null) return null; var pro = this.getProject(req, res); if(pro==null) return; sendSuccess(res, user.resources); } createResource(req, res) { console.log("A"); if(this.authentification(req, res)==null) return null; var pro = this.getProject(req, res); if(pro==null) return; console.log("B"); var resName = getQueryParam(req, RESOURCE); console.log("C"); if(resName==undefined) return send(res, E.BAD_USER, RESOURCE); console.log("D"); var ret = pro.createResource(req.params[USER], req.params[PROJECT], resName); if(E.check(ret)) return sendSuccess(res); return send(res, E.PROJECT_EXISTS, resName); } renameResource(req, res) { if(this.authentification(req, res)==null) return null; var pro = this.getProject(req, res); if(pro==null) return; var oldName = req.params[RESOURCE]; var newName = getQueryParam(req, "newName"); var ret = pro.renameResource(req.params[USER], req.params[PROJECT], oldName, newName); if(E.check(ret)) return sendSuccess(res); return send(res, ret, newName); } removeResource(req, res) { if(this.authentification(req, res)==null) return null; var pro = this.getProject(req, res); if(pro==null) return; var name = req.params[RESOURCE]; var ret = pro.removeResource(req.params[USER], req.params[PROJECT], name); console.log("string : "+JSON.stringify(ret)); if(E.check(ret)) return sendSuccess(res); return send(res, ret, name); } /* POST: { user: "ptitcois", password:"xxxx", data: { [contenu] }} */ editRescource(req, res) { console.log("ICIIIIIIIIIIIIIIII") if(this.authentification(req, res)==null) return null; var pro = this.getProject(req, res); if(pro==null) return; var name = req.params[RESOURCE]; var data = getQueryParam(req, DATA); console.log(JSON.stringify(req.body)) if(name==undefined) return send(res, E.EINVAL, RESOURCE); if(data==undefined) return send(res, E.EINVAL, DATA, "Parametre 'data' no présent"); var ret = pro.editResource(req.params[USER], req.params[PROJECT], name, data); if(E.check(ret)) return sendSuccess(res); return send(res, ret); } }