diff --git a/api/controllers/ParamUserController.js b/api/controllers/ParamUserController.js new file mode 100644 index 0000000000..d7de105c5c --- /dev/null +++ b/api/controllers/ParamUserController.js @@ -0,0 +1,41 @@ + +module.exports = { + + index: function(req, res, next){ + gladys.paramUser.get(req.session.User) + .then(function(paramUsers){ + return res.json(paramUsers); + }) + .catch(next); + }, + + create: function(req, res, next){ + req.body.user = req.session.User.id; + gladys.paramUser.setValue(req.body) + .then(function(paramUser){ + return res.status(201).json(paramUser); + }) + .catch(next); + }, + + update: function(req, res, next){ + req.body.user = req.session.User.id; + req.body.name = req.params.name; + gladys.paramUser.setValue(req.body) + .then(function(paramUser){ + return res.json(paramUser); + }) + .catch(next); + }, + + delete: function(req, res, next){ + req.body.user = req.session.User.id; + req.body.name = req.params.name; + gladys.paramUser.delete(req.body) + .then(function(){ + return res.json({success: true}); + }) + .catch(next); + } + +}; \ No newline at end of file diff --git a/api/core/index.js b/api/core/index.js index d3fe6a4ef6..8a96ee70a7 100644 --- a/api/core/index.js +++ b/api/core/index.js @@ -32,6 +32,7 @@ gladys.load = function load() { gladys.notificationType = require('./notificationtype/index.js'); gladys.notificationUser = require('./notificationuser/index.js'); gladys.param = require('./param/index.js'); + gladys.paramUser = require('./paramuser/index.js'); gladys.room = require('./room/index.js'); gladys.sentence = require('./sentence/index.js'); gladys.scenario = require('./scenario/index.js'); diff --git a/api/core/paramuser/index.js b/api/core/paramuser/index.js new file mode 100644 index 0000000000..44b246c4a8 --- /dev/null +++ b/api/core/paramuser/index.js @@ -0,0 +1,5 @@ +module.exports.clearCache = require('./paramUser.clearCache.js'); +module.exports.delete = require('./paramUser.delete.js'); +module.exports.getValue = require('./paramUser.getValue.js'); +module.exports.get = require('./paramUser.get.js'); +module.exports.setValue = require('./paramUser.setValue.js'); \ No newline at end of file diff --git a/api/core/paramuser/paramUser.clearCache.js b/api/core/paramuser/paramUser.clearCache.js new file mode 100644 index 0000000000..213916c471 --- /dev/null +++ b/api/core/paramuser/paramUser.clearCache.js @@ -0,0 +1,6 @@ +var shared = require('./paramUser.shared.js'); + +module.exports = function(){ + shared.cache = {}; + return Promise.resolve(); +}; \ No newline at end of file diff --git a/api/core/paramuser/paramUser.delete.js b/api/core/paramuser/paramUser.delete.js new file mode 100644 index 0000000000..3348717b88 --- /dev/null +++ b/api/core/paramuser/paramUser.delete.js @@ -0,0 +1,15 @@ +var queries = require('./paramUser.queries.js'); +var shared = require('./paramUser.shared.js'); + +module.exports = function(paramUser){ + + // delete in database + return gladys.utils.sql(queries.delete, [paramUser.name, paramUser.user]) + .then(function(){ + + // then delete in cache + if(shared.cache[paramUser.user] && shared.cache[paramUser.user][paramUser.name]){ + delete shared.cache[paramUser.user][paramUser.name]; + } + }); +}; \ No newline at end of file diff --git a/api/core/paramuser/paramUser.get.js b/api/core/paramuser/paramUser.get.js new file mode 100644 index 0000000000..aa25e8c918 --- /dev/null +++ b/api/core/paramuser/paramUser.get.js @@ -0,0 +1,5 @@ +var queries = require('./paramUser.queries.js'); + +module.exports = function(user){ + return gladys.utils.sql(queries.get, [user.id]); +}; \ No newline at end of file diff --git a/api/core/paramuser/paramUser.getValue.js b/api/core/paramuser/paramUser.getValue.js new file mode 100644 index 0000000000..8c954888af --- /dev/null +++ b/api/core/paramuser/paramUser.getValue.js @@ -0,0 +1,24 @@ +var queries = require('./paramUser.queries.js'); +var shared = require('./paramUser.shared.js'); +var setCacheValue = require('./paramUser.setCacheValue.js'); +var Promise = require('bluebird'); + + +module.exports = function(name, userId){ + + // get from cache + if(shared.cache[userId] && shared.cache[userId][name]){ + return shared.cache[userId][name]; + } + + // if not in cache, get in DB + return gladys.utils.sql(queries.getValue, [name, userId]) + .then(function(rows){ + if(rows.length){ + setCacheValue(name, userId, rows[0].value); + return rows[0].value; + } else { + return Promise.reject(new Error('NotFound')); + } + }); +}; diff --git a/api/core/paramuser/paramUser.queries.js b/api/core/paramuser/paramUser.queries.js new file mode 100644 index 0000000000..49c8b6a716 --- /dev/null +++ b/api/core/paramuser/paramUser.queries.js @@ -0,0 +1,6 @@ + +module.exports = { + getValue: 'SELECT * FROM paramuser WHERE name = ? AND user = ?;', + deleteValue: 'DELETE FROM paramuser WHERE name = ? AND user = ?;', + get: 'SELECT * FROM paramuser WHERE user = ?;' +}; \ No newline at end of file diff --git a/api/core/paramuser/paramUser.setCacheValue.js b/api/core/paramuser/paramUser.setCacheValue.js new file mode 100644 index 0000000000..c133b95940 --- /dev/null +++ b/api/core/paramuser/paramUser.setCacheValue.js @@ -0,0 +1,10 @@ +var shared = require('./paramUser.shared.js'); + +module.exports = function(name, userId, value){ + if(!shared.cache.hasOwnProperty(userId)){ + shared.cache[userId] = {}; + shared.cache[userId][name] = value; + } else { + shared.cache[userId][name] = value; + } +}; \ No newline at end of file diff --git a/api/core/paramuser/paramUser.setValue.js b/api/core/paramuser/paramUser.setValue.js new file mode 100644 index 0000000000..57221d21f2 --- /dev/null +++ b/api/core/paramuser/paramUser.setValue.js @@ -0,0 +1,31 @@ +var queries = require('./paramUser.queries.js'); +var shared = require('./paramUser.shared.js'); +var setCacheValue = require('./paramUser.setCacheValue.js'); +var Promise = require('bluebird'); + +module.exports = function(paramUser){ + + // we test if the param already exist + return gladys.utils.sql(queries.getValue, [paramUser.name, paramUser.user]) + .then(function(rows){ + + // if value exist, we update it + if(rows.length){ + + return ParamUser.update({id: rows[0].id}, paramUser) + .then(function(paramUsers){ + return paramUsers[0]; + }); + } else { + + // if the value does not exist, we create it + return ParamUser.create(paramUser); + } + }) + .then(function(paramUser){ + + // we set the value of the cache + setCacheValue(paramUser.name, paramUser.user, paramUser.value); + return paramUser; + }); +}; \ No newline at end of file diff --git a/api/core/paramuser/paramUser.shared.js b/api/core/paramuser/paramUser.shared.js new file mode 100644 index 0000000000..d7046ad4af --- /dev/null +++ b/api/core/paramuser/paramUser.shared.js @@ -0,0 +1,4 @@ + +module.exports = { + cache: {} +}; \ No newline at end of file diff --git a/api/models/Param.js b/api/models/Param.js index 0b70a1b054..373f5e9daa 100644 --- a/api/models/Param.js +++ b/api/models/Param.js @@ -27,10 +27,6 @@ module.exports = { value: { type:'string', required: true - }, - - user: { - model: 'User' } } diff --git a/api/models/ParamUser.js b/api/models/ParamUser.js new file mode 100644 index 0000000000..4e7c071492 --- /dev/null +++ b/api/models/ParamUser.js @@ -0,0 +1,31 @@ +/** + * Gladys Project + * http://gladysproject.com + * Software under licence Creative Commons 3.0 France + * http://creativecommons.org/licenses/by-nc-sa/3.0/fr/ + * You may not use this software for commercial purposes. + * @author :: Pierre-Gilles Leymarie + */ + + +module.exports = { + + attributes: { + + name: { + type:'string', + required: true + }, + + value: { + type:'string', + required: true + }, + + user: { + model: 'User', + required: true + } + + } +}; diff --git a/config/policies.js b/config/policies.js index ce29b99bd9..856a2e7335 100755 --- a/config/policies.js +++ b/config/policies.js @@ -62,6 +62,7 @@ module.exports.policies = { NotificationType : ['checkToken'], NotificationUser : ['checkToken'], Param : ['checkToken'], + ParamUser : ['checkToken'], Parametre : ['checkToken'], PhenixElectricDevice : ['checkToken'], ProfilePicture : ['checkToken'], diff --git a/config/routes.js b/config/routes.js index a610803b5e..52639bfbcf 100755 --- a/config/routes.js +++ b/config/routes.js @@ -155,6 +155,12 @@ module.exports.routes = { 'patch /param/:name': 'ParamController.update', 'delete /param/:name': 'ParamController.delete', + // ParamUser + 'get /paramuser': 'ParamUserController.index', + 'post /paramuser': 'ParamUserController.create', + 'patch /paramuser/:name': 'ParamUserController.update', + 'delete /paramuser/:name': 'ParamUserController.delete', + // Script 'get /script': 'ScriptController.index', 'post /script': 'ScriptController.create', diff --git a/test/bootstrap.test.js b/test/bootstrap.test.js index 83e22885a0..67f6307624 100644 --- a/test/bootstrap.test.js +++ b/test/bootstrap.test.js @@ -40,6 +40,9 @@ beforeEach(function(done){ if(err) return done(err); gladys.param.clearCache() + .then(function(){ + return gladys.paramUser.clearCache(); + }) .then(done) .catch(done); }); @@ -102,7 +105,8 @@ function loadFixtures(barrels){ 'box', 'module', 'sentence', - 'param' + 'param', + 'paramuser' ]; return Promise.mapSeries(order, function(tableName){ diff --git a/test/fixtures/paramuser.json b/test/fixtures/paramuser.json new file mode 100644 index 0000000000..161c4b6fa8 --- /dev/null +++ b/test/fixtures/paramuser.json @@ -0,0 +1,8 @@ +[ + { + "id": 1, + "name": "test", + "value": "test", + "user": 1 + } +] \ No newline at end of file diff --git a/test/unit/api/controllers/ParamUser/paramuser.create.test.js b/test/unit/api/controllers/ParamUser/paramuser.create.test.js new file mode 100644 index 0000000000..94e3ae4eb7 --- /dev/null +++ b/test/unit/api/controllers/ParamUser/paramuser.create.test.js @@ -0,0 +1,31 @@ +var request = require('supertest'); +var validateParamUser = require('../../validator/paramUserValidator.js'); + +describe('ParamUser', function() { + + describe('create', function() { + + it('should create a paramUser', function (done) { + + var param = { + name:'THIS_IS_A_TEST', + value: 'value' + }; + + request(sails.hooks.http.app) + .post('/paramuser?token=test') + .send(param) + .expect(201) + .end(function(err, res) { + if(err) return done(err); + + validateParamUser(res.body); + done(); + }); + + }); + + }); + + +}); \ No newline at end of file diff --git a/test/unit/api/controllers/ParamUser/paramuser.delete.test.js b/test/unit/api/controllers/ParamUser/paramuser.delete.test.js new file mode 100644 index 0000000000..44205b6436 --- /dev/null +++ b/test/unit/api/controllers/ParamUser/paramuser.delete.test.js @@ -0,0 +1,25 @@ +var request = require('supertest'); +var validateParamUser = require('../../validator/paramUserValidator.js'); + +describe('ParamUser', function() { + + describe('delete', function() { + + it('should delete a paramUser', function (done) { + + request(sails.hooks.http.app) + .delete('/param/test?token=test') + .expect(200) + .end(function(err, res) { + if(err) return done(err); + + + done(); + }); + + }); + + }); + + +}); \ No newline at end of file diff --git a/test/unit/api/controllers/ParamUser/paramuser.get.test.js b/test/unit/api/controllers/ParamUser/paramuser.get.test.js new file mode 100644 index 0000000000..77e84e462c --- /dev/null +++ b/test/unit/api/controllers/ParamUser/paramuser.get.test.js @@ -0,0 +1,26 @@ +var request = require('supertest'); +var validateParamUser = require('../../validator/paramUserValidator.js'); + +describe('ParamUser', function() { + + describe('get', function() { + + it('should get all paramUsers', function (done) { + + request(sails.hooks.http.app) + .get('/paramuser?token=test') + .expect(200) + .end(function(err, res) { + if(err) return done(err); + + res.body.should.be.instanceOf(Array); + validateParamUser(res.body); + done(); + }); + + }); + + }); + + +}); \ No newline at end of file diff --git a/test/unit/api/controllers/ParamUser/paramuser.update.test.js b/test/unit/api/controllers/ParamUser/paramuser.update.test.js new file mode 100644 index 0000000000..4b001e5e55 --- /dev/null +++ b/test/unit/api/controllers/ParamUser/paramuser.update.test.js @@ -0,0 +1,31 @@ +var request = require('supertest'); +var validateParamUser = require('../../validator/paramUserValidator.js'); + +describe('ParamUser', function() { + + describe('update', function() { + + it('should update a param', function (done) { + + var param = { + value: 'value' + }; + + request(sails.hooks.http.app) + .patch('/paramuser/test?token=test') + .send(param) + .expect(200) + .end(function(err, res) { + if(err) return done(err); + + validateParamUser(res.body); + res.body.value.should.equal(param.value); + done(); + }); + + }); + + }); + + +}); \ No newline at end of file diff --git a/test/unit/api/core/paramuser/paramUser.delete.test.js b/test/unit/api/core/paramuser/paramUser.delete.test.js new file mode 100644 index 0000000000..9e237e01f2 --- /dev/null +++ b/test/unit/api/core/paramuser/paramUser.delete.test.js @@ -0,0 +1,19 @@ +var should = require('should'); +var validateParam = require('../../validator/paramValidator.js'); + +describe('ParamUser', function() { + + describe('delete', function() { + + it('should delete value', function (done) { + + gladys.param.delete({name: 'test', user: 1}) + .then(function(){ + + done(); + }); + }); + + }); + +}); \ No newline at end of file diff --git a/test/unit/api/core/paramuser/paramUser.get.test.js b/test/unit/api/core/paramuser/paramUser.get.test.js new file mode 100644 index 0000000000..369bdab052 --- /dev/null +++ b/test/unit/api/core/paramuser/paramUser.get.test.js @@ -0,0 +1,21 @@ +var should = require('should'); +var validateParamUser = require('../../validator/paramUserValidator.js'); + +describe('ParamUser', function() { + + describe('get', function() { + + it('should return paramUsers', function (done) { + + var user = {id: 1}; + gladys.paramUser.get(user) + .then(function(paramUsers){ + validateParamUser(paramUsers); + done(); + }) + .catch(done); + }); + + }); + +}); \ No newline at end of file diff --git a/test/unit/api/core/paramuser/paramuser.getValue.test.js b/test/unit/api/core/paramuser/paramuser.getValue.test.js new file mode 100644 index 0000000000..0bde652335 --- /dev/null +++ b/test/unit/api/core/paramuser/paramuser.getValue.test.js @@ -0,0 +1,20 @@ +var should = require('should'); +var validateParamUser = require('../../validator/paramUserValidator.js'); + +describe('ParamUser', function() { + + describe('getValue', function() { + + it('should return value', function (done) { + + gladys.paramUser.getValue('test', 1) + .then(function(value){ + value.should.equal('test'); + done(); + }) + .catch(done); + }); + + }); + +}); \ No newline at end of file diff --git a/test/unit/api/core/paramuser/paramuser.setValue.test.js b/test/unit/api/core/paramuser/paramuser.setValue.test.js new file mode 100644 index 0000000000..a0f62c2e16 --- /dev/null +++ b/test/unit/api/core/paramuser/paramuser.setValue.test.js @@ -0,0 +1,42 @@ +var should = require('should'); +var validateParamUser = require('../../validator/paramUserValidator.js'); + +describe('ParamUser', function() { + + describe('setValue', function() { + + it('should return new paramUser created', function (done) { + + var param = { + name: 'dsfsdf', + value: 'Awesome value', + user: 1 + }; + + gladys.paramUser.setValue(param) + .then(function(newParam){ + validateParamUser(newParam); + newParam.value.should.equal(param.value); + done(); + }); + }); + + it('should return new paramUser updated', function (done) { + + var param = { + name: 'test', + value: 'Awesome value', + user: 1 + }; + + gladys.paramUser.setValue(param) + .then(function(newParam){ + validateParamUser(newParam); + newParam.value.should.equal(param.value); + done(); + }); + }); + + }); + +}); \ No newline at end of file diff --git a/test/unit/api/validator/paramUserValidator.js b/test/unit/api/validator/paramUserValidator.js new file mode 100644 index 0000000000..cc2df1efd8 --- /dev/null +++ b/test/unit/api/validator/paramUserValidator.js @@ -0,0 +1,18 @@ +module.exports = validate; + +var should = require('should'); + +function validate(param) { + if(param instanceof Array) { + param.forEach(validateparam); + } else { + validateparam(param); + } +} + +function validateparam(param) { + param.should.be.instanceOf(Object); + param.should.have.property('name'); + param.should.have.property('value'); + param.should.have.property('user'); +} \ No newline at end of file