PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Sequelize como estruturar a parte de chat do app?


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 ).