Я занимаюсь разработкой простого приложения для чата. Все работает нормально, но у меня есть вопрос, связанный с целостностью данных.
Это схема базы данных.
- Пользователь имеет много чатов.
- Комната чата Имеет много пользователей.
- Пользователь имеет много сообщений.
- Чат имеет много сообщений.
Позвольте мне объяснить на примере, чего я пытаюсь достичь.
// 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}`);
}