ertix4248
ertix4248

Reputation: 41

How to add a role profile page to meteor user?

I have 2 roles in my app. Users and doctors. I want that a doctor can edit extra fields like picture and text field on an extra profile page for doctors.

How to add this fields probably not to the profile but to an extra part of the users collection and make it then public availible as a profile page /doctor/_id

I am now experimenting with meteorkitchen, which is great, but when I add a profile.doctor.field1 and show this on an page like user_settings/profile/doctor and update it the other fields of the profile are overwritten with empty values. I assume it assumes that all profile attributes are edited on one form and when one field is empty so it deletes them. But this is not what I want.

(Can someone add a tag meteorkitchen please. I have not enough reputation. thanks)

Edit: this are the settings for the router

var roleMap = [
        ...
    { route: "user_settings.doctor",    roles: ["doctor","admin"] }
];

and attached this part for the form

"name": "edit_form",
"type": "form",
"mode": "update",
"title": "Edit your doctor profile",
"submit_route": "user_settings.profile.doctor",
"query": {
    "name": "current_user_data",
    "collection": "users",
    "filter": {
       "_id": "Meteor.userId()"
     },
     "find_one": true,
     "options": {},
     "params": []
     },
"fields": [
    {
       "name": "profile.doctor.quote",
       "title": "Favorite quote",
       "type": "string",
       "required": true
   }
]

the problem is that on update some of the profile values the others are deleted.

Upvotes: 1

Views: 372

Answers (1)

Billybobbonnet
Billybobbonnet

Reputation: 3226

If you want to stick with Meteor Kitchen, here is how I would proceed.

  • First, you need to create a "doctor" role. See your application page on kitchen designer, you can add it here.
  • Second, you need to add your new "doctor" role to the page roles. You can do it directly in the role map located in client/views/router.js or using the designer.

EDIT Following the discussion in the comments here is an update:

You can change the collection name directly in the section "Edit source" of the designer. You go to your page, in the query, you set

"query": {
                "name": "doctor_user",
                "collection": "users",
                "filter": {
                     "_id": ":userId"
                            },
                "find_one": false,
                "options": {},
                "params": []
        },

The thing is that even if you do that, only admins can update the users collection. So you need to download the user-roles package from perak, put it inside your project (only put the folders) and remove the user-roles pre-installed package (meteor remove perak:user-roles).

Once you have done that, go to server/collections and replace the update part of users.js with that:

    update: function (userId, doc, fieldNames, modifier) {
    return Users.isInRole ("admin")||  (Users.isInRole ("doctor") && 
    !_.contains(fieldNames,'roles')));

It will allow users with the doctor role to update any user field except for the "roles" field.

Last step, you edit the server\publications\users.js file and add this in it:

Meteor.publish("doctor_user", function(_id){
   return  Users.isInRoles ({"doctor", "admin"}) ? Users.find({_id: _id}) : this.ready();
});

Upvotes: 1

Related Questions