#Already defined role field as 'user' in Schema but not working

7 messages · Page 1 of 1 (latest)

stable quarry
#

I am using MongoDB and clerk to save new user, and for new user default role is 'user' which I already created in schema but new field role is not created in model.

import mongoose, { model, models, Schema } from "mongoose";
const UserSchema = new Schema({
    clerkId: {
        type: String,
        required: true,
        unique: true,
    },
    email: {
        type: String,
        required: true,
        unique: true,
    },
    username: {
        type: String,
        required: true,
        unique: true,
    },
    photo: {
        type: String,
        required: true,
    },
    firstName: {
        type: String,
    },
    lastName: {
        type: String,
    },
    role:{
        type: String,
        enum: ['user', 'admin'],
        default: 'user',
    }
});

const User = models?.User || model("User", UserSchema)

export default User;

clerk webhook logic inside route file

if (eventType === "user.created") {
    const { id, email_addresses, image_url, first_name, last_name, username } =
      evt.data;

      console.log(evt.data, 'evt data')

    const user = {
      clerkId: id,
      email: email_addresses[0].email_address,
      username: username!,
      firstName: first_name,
      lastName: last_name,
      photo: image_url,
    };

    const newUser = await createUser(user);

    if (newUser) {
      await clerkClient.users.updateUserMetadata(id, {
        publicMetadata: {
          userId: newUser._id,
        },
      });
    }

    return NextResponse.json({ message: "New User Created", user: newUser });
  }
wicked treeBOT
#

🔎 This post has been indexed in our web forum and will be seen by search engines so other users can find it outside Discord

🕵️ Your user profile is private by default and won't be visible to users outside Discord, if you want to be visible in the web forum you can add the "Public Profile" role in id:customize

✅ You can mark a message as the answer for your post with Right click -> Apps -> Mark Solution
(if you don't see the option, try refreshing Discord with Ctrl + R)

stable quarry
#

I tried this approach

in route file (clerk webhook):
add role as user in user object

f (eventType === "user.created") {
    const { id, email_addresses, image_url, first_name, last_name, username } =
      evt.data;

      console.log(evt.data, 'evt data')

    const user = {
      clerkId: id,
      email: email_addresses[0].email_address,
      username: username!,
      firstName: first_name,
      lastName: last_name,
      photo: image_url,
      role: 'user'
    };


    const newUser = await createUser(user);

    if (newUser) {
      await clerkClient.users.updateUserMetadata(id, {
        publicMetadata: {
          userId: newUser._id,
        },
      });
    }

    return NextResponse.json({ message: "New User Created", user: newUser });
  }

in server action file:
add role as 'user'

export async function createUser(user: CreateUserParams) {
  try {
    await connectDB();

    const newUser = await User.create({...user, role: 'user'});

    console.log("newUser:", newUser);

    return JSON.parse(JSON.stringify(newUser));
  } catch (error) {
    console.log("error:", error);
    handleError(error);
  }
}
coarse stirrup
#

Did you restart your dev server after changing the schema?

stable quarry
#

yes

coarse stirrup
#

Try removing the enum stuff from the schema, just have the role field be a string, like last name. I assume last name is getting set. If you can set role the same way you're setting last name then you know it's an enum problem

stable quarry