Sequelize Postgres - найдите строки, в которых выполняются два условия

106
7

У меня есть программа обмена чатами, есть пользователи и каналы (канал = частный чат между двумя или более пользователями).

У меня две проблемы с моим текущим кодом:

В настоящее время я пока не просматриваю, чтобы найти "канал", который используется исключительно для двух пользователей (например, пользователь A и пользователь B могут иметь частный чат, а пользователь A и пользователь B также могут находиться в групповом чате с пользователем C) Я думаю, что мой код в настоящее время написан, вероятно, неэффективен и может быть сконденсирован в один запрос.

Вот мой код. Обратите внимание, что в интерфейсе этот вызов API запускается, когда Пользователь (Пользователь A) нажимает на другого пользователя (Пользователь B) и выбирает "Отправить личное сообщение". После создания личного сообщения есть еще одна функция для добавления дополнительных пользователей.

router.post('/find_or_create_privatechat', function(req, res, next) {
m.user_channel.findAll({
where: {user_id: req.user.id}, // this is User A, the originating user
include: [
{
model: m.channel,
where: {
type: 'privatechat'
},
required: true
}
]
}).then(results => {
return m.user_channel.findAll({
where: {
channel_id: {$in: _.map(results, userchannel => usercchannel.channel.id)},
user_id: req.body.user_id, // this is User B, the guy User A clicked on
},
include: [
{
model: m.channel,
where: {
type: 'privatechat'
},
required: true
}
]
})
}).then(results2 => {
if(results2.length > 0){
res.json({success: true, channel: results2[0].channel, user_channel: results2[0]})
return false
} else {
console.log("Create private chat record");
return m.channel.create({
type: 'privatechat',
visible: false,
name: 'Private Message',
url: 'pm-' + rs.generate(8)
}).then(c => {
m.user_channel.create({
user_id: req.user.id,
channel_id: c.id,
admin: true
}).then(uc1 => {
m.user_channel.create({
user_id: req.body.user_id,
channel_id: c.id,
admin: false
}).then(uc2 => {
res.json({ success: true, channel: c, user_channel: uc1 })
})
})
})
}
}).catch(err => {

res.status(422).json({success: false, err: err})

})
});

Я думаю, что первые два findAlls могут быть сконденсированы в один, а затем мне нужно добавить условие к EXCLUDE результатам, где в user_channel содержится более двух user_id (т.е. Исключить групповые сообщения).

спросил(а) 2018-04-18T18:49:00+03:00 2 года, 12 месяцев назад
0
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема