ORM: Sequelize: проверяйте отношения многие ко многим, прежде чем вставлять запись в таблицу сообщений. - PullRequest
0 голосов
/ 30 марта 2020

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

Это схема базы данных.

  • Пользователь имеет много чатов.
  • Комната чата Имеет много пользователей.
  • Пользователь имеет много сообщений.
  • Чат имеет много сообщений.

db schema

Позвольте мне объяснить на примере, чего я пытаюсь достичь.

    // creates user1
    User.create({})
    // creates user2
    User.create({})
​
    // creates the chat room with id 1
    ChatRoom.create({isGroupChat: false});
​
    // add user 1 to chatroom 1
    UserChatRoom.create({userID: 1, chatRoomID: 1});
​
    // this should work because user 1 is in chat room 1
    Message.create({userID: 1, chatRoomID: 1, seen: false, message: 'test'});
​
    // this works but, logically, it shouldn't work because user 2 is not added to chatroom 1
    // How can I prevent user2 to add a message to chat room 1?
	Message.create({userID: 2, chatRoomID: 1, seen: false, message: 'test'});

Как я могу запретить пользователю user2 добавлять сообщение в чат 1?

Я написал эту функцию, и она отлично работает, но мне интересно, можем ли мы сказать, БД, чтобы проверить эту связь перед вставкой сообщения (без записи js logi c).

export async function sendMessage({userID, chatRoomID, message}): Promise<Message>{
    // check if user is in that chat room
    const user = await User.findOne(
        {where: {id: userID},
        include: [
            {
                model: ChatRoom,
                where: {id: chatRoomID},
                required: true
            },
        ]
    });
    // if user is in that chat room, create the message
    if(user?.chatRooms){
        return Message.create({message, seen: false, chatRoomID, userID});
    }
    throw new Error(`User ${userID} is not in chat room ${chatRoomID}`);
 }
...