Модели Mon goose, на которые ссылаются семена - PullRequest
0 голосов
/ 30 марта 2020

Какой самый элегантный способ написания начального сценария для моделей Mon goose, на которые есть ссылки? Я предпочитаю async/await синтаксис. Я сделал рабочий пример 1:N, но я считаю, что он может быть написан более элегантно. Например, у меня есть несколько произвольных логик c для ссылки на 3 пользователей с 9 сообщениями, что не хорошо. Я хотел бы видеть лучшее решение и учиться на нем.

Модель пользователя

const userSchema = new Schema(
  {
    username: {
      type: String,
      lowercase: true,
      unique: true,
      required: [true, "can't be blank"],
      match: [/^[a-zA-Z0-9]+$/, 'is invalid'],
      index: true,
    },
    email: {
      type: String,
      lowercase: true,
      unique: true,
      required: [true, "can't be blank"],
      match: [/\S+@\S+\.\S+/, 'is invalid'],
      index: true,
    },
    password: {
      type: String,
      trim: true,
      minlength: 6,
      maxlength: 60,
    },
    name: String,
    avatar: String,
    messages: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Message' }],
  },
  { timestamps: true },
);

Модель сообщения

const messageSchema = new Schema(
  {
    text: {
      type: String,
      required: true,
    },
    user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
  },
  { timestamps: true },
);

Функция семян


export const seedDb = async () => {
  console.log('seeding database...');

  await User.deleteMany({});
  await Message.deleteMany({});

  // create 3 users
  const usersPromises = [...Array(3).keys()].map((index, i) => {
    const user = new User({
      provider: 'email',
      username: `user${index}`,
      email: `email${index}@email.com`,
      password: '123456789',
      name: faker.name.findName(),
      avatar: faker.image.avatar(),
      bio: faker.lorem.sentences(3),
    });

    if (index === 0) {
      user.role = 'ADMIN';
    }

    return user;
  });

  await Promise.all(
    usersPromises.map(async user => {
      await user.save();
    }),
  );

  // create 9 messages
  const messagePromises = [...Array(9).keys()].map((index, i) => {
    const message = new Message({
      text: faker.lorem.sentences(3),
    });
    return message;
  });

  await Promise.all(
    messagePromises.map(async message => {
      await message.save();
    }),
  );

  const users = await User.find();
  const messages = await Message.find();

  // every user 3 messages
  users.map(async (user, index) => {
    const threeMessagesIds = messages.slice(index * 3, index * 3 + 3).map(m => m.id);
    await User.updateOne({ _id: user.id }, { $push: { messages: threeMessagesIds } });
  });

  // 0,1,2 message belong to user 0 ...
  messages.map(async (message, index) => {
    const j = Math.floor(index / 3);
    const user = users[j];
    await Message.updateOne(
      { _id: message.id },
      {
        $set: {
          user: user.id,
        },
      },
    );
  });
};
...