diff --git a/README.md b/README.md index a36d533..daf584c 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,10 @@ mongodump -h localhost --port 3001 -d meteor mongorestore -h localhost --port 3001 -d meteor dump/meteor ```` +## FAQ +### Set user as admin +```` +$ meteor shell +Roles.addUsersToRoles(Meteor.users.findOne({username: "myusername"}),"admin") +```` + diff --git a/client/templates/header.html b/client/templates/header.html index 43a5ccd..d5576f4 100644 --- a/client/templates/header.html +++ b/client/templates/header.html @@ -29,9 +29,6 @@
  • Transport
  • -
  • - Teams -
  • Map
  • @@ -71,3 +68,12 @@ + + diff --git a/client/templates/helpers/contains.js b/client/templates/helpers/contains.js new file mode 100644 index 0000000..2e3d287 --- /dev/null +++ b/client/templates/helpers/contains.js @@ -0,0 +1,7 @@ +UI.registerHelper('contains', function(value,list,options) { + if(_.contains(list, value)) { + return this; + } else { + return null; + } +}); diff --git a/client/templates/pages/settings/index.html b/client/templates/pages/settings/index.html new file mode 100644 index 0000000..b69a8a1 --- /dev/null +++ b/client/templates/pages/settings/index.html @@ -0,0 +1,30 @@ + + + diff --git a/client/templates/pages/settings/index.js b/client/templates/pages/settings/index.js new file mode 100644 index 0000000..07ffe04 --- /dev/null +++ b/client/templates/pages/settings/index.js @@ -0,0 +1,27 @@ +Template.settingsPage.helpers({ + "roles": function () { + return Roles.getAllRoles(); + }, + "users": function() { + return Meteor.users.find({}, {fields: {_id: 1, username: 1, roles:1}}); + } +}) +Template.settingsPage.events({ + "change .permission-toggle": function (event, template) { + if(event.target.checked) { + Meteor.call("addUserToRole", $(event.target).attr("userId"), $(event.target).attr("role"), function(error,data) { + if(error) { + Flash.danger(error); + event.target.checked = !event.target.checked; + } + }); + } else { + Meteor.call("remUserFromRole", $(event.target).attr("userId"), $(event.target).attr("role"), function(error,data) { + if(error) { + Flash.danger(error); + event.target.checked = !event.target.checked; + } + }); + } + } +}) diff --git a/lib/collections/roles.js b/lib/collections/roles.js new file mode 100644 index 0000000..cafe47f --- /dev/null +++ b/lib/collections/roles.js @@ -0,0 +1,23 @@ +if(Meteor.isServer && (Roles.getAllRoles().fetch().length !== Meteor.settings.roles.length)) { + Meteor.startup(function () { + Meteor.roles.remove({}); + _.each(Meteor.settings.roles, + function(role) { + Roles.createRole(role); + } + ); + }); +} + +Meteor.methods({ + "addUserToRole": function (user_id, role) { + validate.authorized(Meteor.user(), "admin"); + var user = Meteor.users.findOne(user_id); + Roles.addUsersToRoles(user, role) + }, + "remUserFromRole": function (user_id, role) { + validate.authorized(Meteor.user(), "admin"); + var user = Meteor.users.findOne(user_id); + Roles.removeUsersFromRoles(user,role) + } +}) diff --git a/lib/helpers/validate.js b/lib/helpers/validate.js index aa0e257..e875b67 100644 --- a/lib/helpers/validate.js +++ b/lib/helpers/validate.js @@ -66,5 +66,11 @@ validate = { if ( Object.prototype.toString.call(d) !== "[object Date]" ) return false; return !isNaN(d.getTime()); + }, + authorized: function(user,required_permission) { + if (Roles.userIsInRole(user, required_permission)) { + return true; + } + throw new Meteor.Error(403, "Not authorized!"); } } diff --git a/lib/router.js b/lib/router.js index 8ab5a1e..6b5c908 100644 --- a/lib/router.js +++ b/lib/router.js @@ -27,19 +27,11 @@ Router.route('/scan/bulk', {name: 'bulkPage'}); Router.route('/scan', {name: 'scanPage'}); Router.route('/transports/add', {name: 'addTransportPage'}) -Router.route('/transports', { - name: 'transportsPage', - waitOn: function () { - return Meteor.subscribe('transports'); - } -}); +Router.route('/transports', {name: 'transportsPage'}); Router.route('/map', {name: 'mapPage'}); Router.route('/generate', {name: 'generatePage'}); Router.route('/teams/add', {name: 'addTeamPage'}) -Router.route('/teams', { - name: 'teamsPage', - waitOn: function () { - return Meteor.subscribe('teams'); - } -}); +Router.route('/teams', {name: 'teamsPage'}); + +Router.route('/settings', {name: 'settingsPage'}); diff --git a/private/settings.json b/private/settings.json index 3289fa3..c829ad4 100644 --- a/private/settings.json +++ b/private/settings.json @@ -4,6 +4,7 @@ "map_file": "lagerplan.png", "ean_prefix": "202" }, + "roles": ["admin","item-add","item-remove","item-relocate","transport-add","transport-remove","team-add","team-remove"], "preseed": { "items": { "amount": 0 diff --git a/server/publications.js b/server/publications.js index 9a93a8e..e7cf10e 100644 --- a/server/publications.js +++ b/server/publications.js @@ -11,10 +11,12 @@ Meteor.publish('teams', function() { return Teams.find(); }); Meteor.publish("userData", function () { - if (this.userId) { - return Meteor.users.find({_id: this.userId}, - {fields: {'scans': 1}}); + if (Roles.userIsInRole(this.userId, "admin")) { + return Meteor.users.find({},{fields: {_id:1, username: 1, roles: 1}}); } else { this.ready(); } }); +Meteor.publish(null, function (){ + return Meteor.roles.find({}) +});