Как создать другой аккаунт для пользователей в mongoDB - PullRequest
0 голосов
/ 22 апреля 2020

Я работаю над личным проектом, в котором пользователь сможет зарегистрироваться со своей электронной почтой / google / или facebook, и этот пользователь будет называться "basi c account".

В то же время я хочу этот пользователь сможет создать интернет-магазин. На данный момент это легко для меня, потому что все, что я могу сделать, это проверить, вошел ли пользователь в систему или нет, если он вошел, я позволю ему создать схему бизнес / магазина, и она будет ссылаться в соответствии с этим. user.

Но, представьте себе, кто-то никогда ранее не регистрировался в системе, и он хочет создать учетную запись в магазине / магазине, где, где я нахожу это немного трудным для понимания.

Что я сделал пока что я создаю пользовательскую схему, такую ​​как:

const UserSchema = Schema({
  name: { type: String},
  googleId: { type: String },
  email: { type: String},
  password: { type: String},
  phone: { type: String},
  avatar: { type: String },
  method: {type: String},

  // role: {type: String},
  roles: [String],
  id: {type: String},
  resetPasswordToken: { type: String },
  resetPasswordExpires: { type: Date },
  usedPasswords: [
    {
      type: String
    }
  ],
  joined: { type: Date, default: new Date() }
});

Когда я регистрирую этого пользователя, я назначаю ему роль, а pu sh роль этому массиву, потому что у этого пользователя может быть две роли. Чтобы иметь возможность публиковать sh магазин и войти в его магазин или использовать обычный сервис.

Другой вариант заключается в том, что я мог бы просто создать новую отдельную схему и назвать ее "BussinesShema", например как:

const ShopSchema = new Schema({
  user: { type: mongoose.Schema.Types.ObjectId, ref: "User" },

  shopName: { type: String },
  accountType: { type: String },
  shopOwner: { type: String },
  email: { type: String, required: true, unique: true },
  shopPhone: { type: String },
  addressOne: { type: String },
  addressTwo: { type: String },
  town: { type: String },
  password: { type: String, required:true },
  services: [{ serviceName: { type: String }}],
  shopDrescription: { type: String },
  reviewed: { type: Boolean, default: false },
  date_created: { type: Date, default: Date.now },
});

, где новый пользователь может просто создать новую учетную запись. но когда я попробовал это, я обнаружил, что должен исправить обработку моего паспорта jwt, потому что я использую модель, отличную от модели пользователя. В основном, когда дело доходит до аутентификации с использованием паспорта, я должен был создать новую стратегию, потому что эта стратегия проверяет только UserSchema.

Я знаю, что это немного долго, и надеюсь, что кто-то понял мои пункты. Итак, в двух словах, как спроектировать базу данных, которая позволит новому пользователю создавать новый бизнес-аккаунт и позволит существующему пользователю создать аккаунт магазина.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Я заставил его работать, однако, я не совсем уверен, является ли это лучшим способом сделать это, но насколько функциональность довольно близка к тому, что я хочу. Однако с точки зрения чистых или хороших решений я понятия не имею.

Итак, вот код, если кто-то хочет его использовать или модифицировать.

Опять же, я не совсем уверен, нормально это или нет, но в отношении функциональности я доволен им. я думаю, что это вполне соответствует моему сценарию

 //  Check if there is a record before we register
    let checkDublicates = await Shop.findOne({ email });
    if(checkDublicates){
      return res
          .status(401)
          .send({ error: "This user already registered his shop" });
    }
    // else, we check the user Model and we check for an email that matches the email form req.body
    let userEmail = await User.findOne({ email });

    if (userEmail) {
      // the result from that email will be tested against the Shop email
      let checkShop = await Shop.findOne({ email: userEmail.email });
      // if there is an email, then we say, this user already registed
      if (checkShop) {
        return res
          .status(401)
          .send({ error: "This user already registered his shop" });
      } else {
        //selse we create a new record with that user email and his password.
        const newShop = new Shop({
          // local: {
            shopName,
            email:userEmail.email,
            password:userEmail.password,
            accountType: "shop",

        });
        await newShop.save();
        return res.send({ newShop }); 
      }
    } else {
      // if there is no email in the shop and there no emmail matches the User then we create a bran new Shop
      const newShop = new Shop({
        // local: {
          shopName,
          email,
          password,
          accountType: "shop",

      });

      await newShop.save();
      return res.send({ newShop }); 

    }

  } catch (e) {
    next(e);
  }
};
0 голосов
/ 22 апреля 2020

Я думаю, что это немного сложно, но не невозможная задача. Вы сказали, что используете Passport JWT Authentication. Поэтому, пожалуйста, создайте новую стратегию, в которой вам нужно проверить в коллекции users, является ли пользователь, который хочет создать магазин, зарегистрированным пользователем или нет. И в то же время вы должны разрешить ему независимо от регистрации в вашей системе и создать токен JWT.

Короче говоря, создайте стратегию, которая позволит пользователю создавать магазин, независимо от того, зарегистрированы вы в вашей системе или нет.

Надеюсь, мои комментарии вас не смущают. Пожалуйста, прокомментируйте, если у вас есть какие-либо сомнения. Всего наилучшего.

...