fix: send pin system messages

This commit is contained in:
Zomatree
2024-07-22 00:09:27 +01:00
parent 87a9fb79f2
commit 96bf73cb57
5 changed files with 89 additions and 16 deletions

View File

@@ -1,6 +1,7 @@
use revolt_database::{
util::{permissions::DatabasePermissionQuery, reference::Reference}, Database, PartialMessage, User
util::{permissions::DatabasePermissionQuery, reference::Reference}, Database, PartialMessage, SystemMessage, User
};
use revolt_models::v0::MessageAuthor;
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
use revolt_result::{create_error, Result};
use rocket::State;
@@ -35,6 +36,23 @@ pub async fn message_pin(
..Default::default()
}, vec![]).await?;
SystemMessage::MessagePinned {
id: message.id.clone(),
by: user.id.clone()
}
.into_message(channel.id())
.send(
db,
MessageAuthor::System {
username: &user.username,
avatar: user.avatar.as_ref().map(|file| file.id.as_ref())
},
None,
None,
&channel,
false
).await?;
Ok(EmptyResponse)
}
@@ -42,7 +60,7 @@ pub async fn message_pin(
mod test {
use crate::{rocket, util::test::TestHarness};
use revolt_database::{events::client::EventV1, util::{idempotency::IdempotencyKey, reference::Reference}, Member, Message, Server};
use revolt_models::v0;
use revolt_models::v0::{self, SystemMessage};
use rocket::http::{Header, Status};
#[rocket::async_test]
@@ -97,6 +115,22 @@ mod test {
assert_eq!(response.status(), Status::NoContent);
drop(response);
harness.wait_for_event(&channel.id(), |event| {
match event {
EventV1::Message(message) => {
match &message.system {
Some(SystemMessage::MessagePinned { by, .. }) => {
assert_eq!(by, &user.id);
true
},
_ => false
}
},
_ => false
}
}).await;
harness.wait_for_event(&channel.id(), |event| {
match event {
EventV1::MessageUpdate { id, channel: channel_id, data, .. } => {

View File

@@ -1,6 +1,7 @@
use revolt_database::{
util::{permissions::DatabasePermissionQuery, reference::Reference}, Database, FieldsMessage, PartialMessage, User
util::{permissions::DatabasePermissionQuery, reference::Reference}, Database, FieldsMessage, PartialMessage, SystemMessage, User
};
use revolt_models::v0::MessageAuthor;
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
use revolt_result::{create_error, Result};
use rocket::State;
@@ -30,10 +31,24 @@ pub async fn message_unpin(
return Err(create_error!(NotPinned))
}
message.update(db, PartialMessage {
pinned: Some(false),
..Default::default()
}, vec![FieldsMessage::Pinned]).await?;
message.update(db, PartialMessage::default(), vec![FieldsMessage::Pinned]).await?;
SystemMessage::MessageUnpinned {
id: message.id.clone(),
by: user.id.clone()
}
.into_message(channel.id())
.send(
db,
MessageAuthor::System {
username: &user.username,
avatar: user.avatar.as_ref().map(|file| file.id.as_ref())
},
None,
None,
&channel,
false
).await?;
Ok(EmptyResponse)
}
@@ -42,7 +57,7 @@ pub async fn message_unpin(
mod test {
use crate::{rocket, util::test::TestHarness};
use revolt_database::{events::client::EventV1, util::{idempotency::IdempotencyKey, reference::Reference}, Member, Message, PartialMessage, Server};
use revolt_models::v0;
use revolt_models::v0::{self, FieldsMessage, SystemMessage};
use rocket::http::{Header, Status};
#[rocket::async_test]
@@ -65,7 +80,7 @@ mod test {
Member::create(&harness.db, &server, &user, Some(channels.clone())).await.expect("Failed to create member");
let member = Reference::from_unchecked(user.id.clone()).as_member(&harness.db, &server.id).await.expect("Failed to get member");
let mut message = Message::create_from_api(
let message = Message::create_from_api(
&harness.db,
channel.clone(),
v0::DataMessageSend {
@@ -110,12 +125,25 @@ mod test {
harness.wait_for_event(&channel.id(), |event| {
match event {
EventV1::MessageUpdate { id, data, .. } => {
if id != &message.id {
return false
};
EventV1::Message(message) => {
match &message.system {
Some(SystemMessage::MessageUnpinned { by, .. }) => {
assert_eq!(by, &user.id);
assert_eq!(data.pinned, Some(false));
true
},
_ => false
}
},
_ => false
}
}).await;
harness.wait_for_event(&channel.id(), |event| {
match event {
EventV1::MessageUpdate { id, clear, .. } => {
assert_eq!(&message.id, id);
assert_eq!(clear, &[FieldsMessage::Pinned]);
true
},