Fix error in query for last N channel messages (#3100)
This commit is contained in:
commit
3f66caedfc
2 changed files with 68 additions and 2 deletions
|
@ -89,7 +89,7 @@ impl Database {
|
||||||
|
|
||||||
let mut rows = channel_message::Entity::find()
|
let mut rows = channel_message::Entity::find()
|
||||||
.filter(condition)
|
.filter(condition)
|
||||||
.order_by_asc(channel_message::Column::Id)
|
.order_by_desc(channel_message::Column::Id)
|
||||||
.limit(count as u64)
|
.limit(count as u64)
|
||||||
.stream(&*tx)
|
.stream(&*tx)
|
||||||
.await?;
|
.await?;
|
||||||
|
@ -110,6 +110,7 @@ impl Database {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
drop(rows);
|
drop(rows);
|
||||||
|
messages.reverse();
|
||||||
Ok(messages)
|
Ok(messages)
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
|
|
|
@ -1,10 +1,75 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
db::{Database, NewUserParams},
|
db::{Database, MessageId, NewUserParams},
|
||||||
test_both_dbs,
|
test_both_dbs,
|
||||||
};
|
};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use time::OffsetDateTime;
|
use time::OffsetDateTime;
|
||||||
|
|
||||||
|
test_both_dbs!(
|
||||||
|
test_channel_message_retrieval,
|
||||||
|
test_channel_message_retrieval_postgres,
|
||||||
|
test_channel_message_retrieval_sqlite
|
||||||
|
);
|
||||||
|
|
||||||
|
async fn test_channel_message_retrieval(db: &Arc<Database>) {
|
||||||
|
let user = db
|
||||||
|
.create_user(
|
||||||
|
"user@example.com",
|
||||||
|
false,
|
||||||
|
NewUserParams {
|
||||||
|
github_login: "user".into(),
|
||||||
|
github_user_id: 1,
|
||||||
|
invite_count: 0,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.user_id;
|
||||||
|
let channel = db
|
||||||
|
.create_channel("channel", None, "room", user)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let owner_id = db.create_server("test").await.unwrap().0 as u32;
|
||||||
|
db.join_channel_chat(channel, rpc::ConnectionId { owner_id, id: 0 }, user)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let mut all_messages = Vec::new();
|
||||||
|
for i in 0..10 {
|
||||||
|
all_messages.push(
|
||||||
|
db.create_channel_message(channel, user, &i.to_string(), OffsetDateTime::now_utc(), i)
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.0
|
||||||
|
.to_proto(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let messages = db
|
||||||
|
.get_channel_messages(channel, user, 3, None)
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.into_iter()
|
||||||
|
.map(|message| message.id)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
assert_eq!(messages, &all_messages[7..10]);
|
||||||
|
|
||||||
|
let messages = db
|
||||||
|
.get_channel_messages(
|
||||||
|
channel,
|
||||||
|
user,
|
||||||
|
4,
|
||||||
|
Some(MessageId::from_proto(all_messages[6])),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.into_iter()
|
||||||
|
.map(|message| message.id)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
assert_eq!(messages, &all_messages[2..6]);
|
||||||
|
}
|
||||||
|
|
||||||
test_both_dbs!(
|
test_both_dbs!(
|
||||||
test_channel_message_nonces,
|
test_channel_message_nonces,
|
||||||
test_channel_message_nonces_postgres,
|
test_channel_message_nonces_postgres,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue