Todos os modelos parecem bons. Os problemas são com as associações.
Se você definir mais de uma associação entre os mesmos dois modelos, deverá indicar diferentes aliases para distingui-los nas consultas.
User.hasMany(Messages, {
foreignKey: 'senderId',
as: 'OutgoingMessages'
});
User.hasMany(Messages, {
foreignKey: 'receiverId',
as: 'IncomingMessages'
});
Messages.belongsTo(models.User, {
foreignKey: "senderId",
as: 'Sender'
});
Messages.belongsTo(models.User, {
foreignKey: "receiverId",
as: 'Receiver'
});
Também é melhor definir associações da mesma maneira diretamente após a definição do modelo ou em um método estático como
associate
. A última abordagem é preferível porque permite definir cada modelo em seu próprio módulo sem referências cruzadas usando os models
parâmetro em associate
método para acessar outros modelos que devem ser associados a um determinado modelo. Última nota:tente definir associações onde um modelo no lado esquerdo de uma definição de associação em seu próprio
associate
método. Significa que models.Message.belongsTo(Conversations);
deve estar em
Message
modelo associate
método:Message.belongsTo(models.Conversations);
Dessa forma, você sempre sabe onde encontrar todas as associações que definem links de um determinado modelo para outros modelos.
ATUALIZAÇÃO
Você deve armazenar uma conversa encontrada ou criada em uma variável para usá-la ao criar uma mensagem:
let conversation = await Conversations.findOne({
where:{
user1:{[Op.or]:[req.user.id,post.userId]},
user2:{[Op.or]:[req.user.id,post.userId]},
PostId:req.body.postId,
}
})
if (!conversation){
conversation = await Conversations.create({
user1: req.user.id,
user2: post.userId,
PostId:req.body.postId,
})
}
const newMessage = await Messages.create({
senderId: req.user.id,
receiverId: post.userId,
message: req.body.message,
conversationId:conversation.id
})
res.status(201).send({
msg: "upload successful",
});
Não tente misturar
then/catch
e await
. Se você usar await
você já terá um resultado ou uma exceção (que você pode manipular usando try/catch
).