Sysrq147
Sysrq147

Reputation: 1367

MeteorJS useraccounts:core and meteor-roles

I am using MeteorJS to develop simple web app. I am new at MeteorJs. I use useraccounts:core package and meteor-roles by alanning. Is it posible to assign role to user while registering a new user ?

EDIT 1

I have tried using onCreateUser hook but something is not working.

Accounts.onCreateUser(function(options, user){
  var role = ['unselected'];
  Roles.addUsersToRoles(user, role);
  return user;
});

Upvotes: 1

Views: 1390

Answers (3)

mstamos
mstamos

Reputation: 111

The below method must run on the server side only. The clue is that you need to create first the user, get the id from creation and then attach a role to it.

Meteor.methods({
rolesCreateUser: function (user) {

    if (_.isObject(user)) {

        if (user.username) {
            var id = Accounts.createUser({
                username: user.username,
                email: user.email,
                password: user.password
            });
            //We add roles to the user
            if (user.roles.length > 0) {                   
                Roles.addUsersToRoles(id, user.roles);
            }
            _.extend(user, {id: id});

            return user;
        }
    }
}   
});

And then on the client side call the method with user's data:

    Meteor.call('rolesCreateUser', newUserData, function (error, newCreatedUser) {

        if (error) {
            //The error code
        } else {
           //Do something with newCreatedUser
       }

    });

Upvotes: 2

Ethaan
Ethaan

Reputation: 11376

I have this way to create users (if i understond you example you alredy have some users, just need some roles, so with the current user just create this), also use some Login buttons customized or something like that

Server.js

Meteor.methods({
     createUsers: function(email,password,roles,name){
       var users = [{name:name,email:email,roles:[roles]},
                   ];
.each(users, function (user) {
   var id;
id = Accounts.createUser({
     email: user.email,
     password: password,
     profile: { name: user.name }
     });
 if (user.roles.length > 0) {
          Roles.addUsersToRoles(id, user.roles);
         }
        });
},
       deleteUser : function(id){       ///Some Delete Method (ignore if dont needed)
      return Meteor.users.remove(id);
      },
    });

Publish Methods

//publish roles
      Meteor.publish(null, function (){ 
       return Meteor.roles.find({})
       })
Meteor.publish("Super-Admin", function () {
        var user = Meteor.users.findOne({_id:this.userId});

         if (Roles.userIsInRole(user, ["Super-Admin"])) {
        return Meteor.users.find({}, {fields: {emails: 1, profile: 1, roles: 1}});
         } 
   this.stop();
          return;
       });

          Meteor.publish("Admin", function () {
       var user = Meteor.users.findOne({_id:this.userId});

        if (Roles.userIsInRole(user, ["Admin"])) {
        return Meteor.users.find({}, {fields: {emails: 1, profile: 1, roles: 1}});
       } 
this.stop();
     return;
      });
      Meteor.publish(null, function (){ 
     return Meteor.roles.find({})
     })

So on the Client side client/register.html

<template name="register">
      <form id="register-form" action="action" >
        <input type="email" id="register-email" placeholder="Nombre Nuevo Usuario">
        <input type="password" id="register-password" placeholder="Password">        
          <select id="register-rol" class="form-control">
             <option value="Admin" selected>Admin</option>
            <option value="Super-Admin" selected>Super Admin</option>
            <option value="Normal" selected>Normal</option>
         </select>
       <input type="submit" value="Register">
      </form>
    </tempalate>

and on register.js call the server methods

 Template.registrar.events({
  'submit #register-form' : function(e, t) {
    e.preventDefault();    
     var email = t.find('#register-email').value,
     password = t.find('#register-password').value,
      roles = $( "#register-rol" ).val();
    Meteor.call("createUsers", email, password,roles);
     return false;
      },
    'click #deleteUser' : function(event,template){
     var idUsuario= this._id;
     Meteor.call('deleteUser',{_id:idUsuario})
     }
    });

Delete Part(html) this is optional just too look if accounts are creating correctly

{{#each users}}
      <li id="user"><h6>{{email}}</h6><h6>{{roles}}</h6></li>
        <button id="deleteUser" class="btn btn-danger btn-xs" > Borrar Usuario        {{email}}       </button>
     {{/each}}

client/registerList.js

   Template.registrar.helpers({
         users: function () {
         return Meteor.users.find();
       },
        email: function () {
        return this.emails[0].address;
        },
       roles: function () {
       if (!this.roles) return '<none>';
    return this.roles.join(',');
      }
      });

Remember Subscribe

  Meteor.subscribe('Admin');
  Meteor.subscribe('Super-Admin');

Hope this help sorry for the messy code

Upvotes: 1

juliancwirko
juliancwirko

Reputation: 1282

You may want to use OnCreateUser hook: http://docs.meteor.com/#/full/accounts_oncreateuser

Upvotes: 0

Related Questions