forked from jmug/stoatchat
fix: send pin system messages
This commit is contained in:
@@ -101,6 +101,10 @@ auto_derived!(
|
|||||||
ChannelIconChanged { by: String },
|
ChannelIconChanged { by: String },
|
||||||
#[serde(rename = "channel_ownership_changed")]
|
#[serde(rename = "channel_ownership_changed")]
|
||||||
ChannelOwnershipChanged { from: String, to: String },
|
ChannelOwnershipChanged { from: String, to: String },
|
||||||
|
#[serde(rename = "message_pinned")]
|
||||||
|
MessagePinned { id: String, by: String },
|
||||||
|
#[serde(rename = "message_unpinned")]
|
||||||
|
MessageUnpinned { id: String, by: String },
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Name and / or avatar override information
|
/// Name and / or avatar override information
|
||||||
@@ -525,6 +529,11 @@ impl Message {
|
|||||||
/// Update message data
|
/// Update message data
|
||||||
pub async fn update(&mut self, db: &Database, partial: PartialMessage, remove: Vec<FieldsMessage>) -> Result<()> {
|
pub async fn update(&mut self, db: &Database, partial: PartialMessage, remove: Vec<FieldsMessage>) -> Result<()> {
|
||||||
self.apply_options(partial.clone());
|
self.apply_options(partial.clone());
|
||||||
|
|
||||||
|
for field in &remove {
|
||||||
|
self.remove_field(field);
|
||||||
|
}
|
||||||
|
|
||||||
db.update_message(&self.id, &partial, remove.clone()).await?;
|
db.update_message(&self.id, &partial, remove.clone()).await?;
|
||||||
|
|
||||||
EventV1::MessageUpdate {
|
EventV1::MessageUpdate {
|
||||||
|
|||||||
@@ -533,6 +533,8 @@ impl From<crate::SystemMessage> for SystemMessage {
|
|||||||
crate::SystemMessage::UserKicked { id } => Self::UserKicked { id },
|
crate::SystemMessage::UserKicked { id } => Self::UserKicked { id },
|
||||||
crate::SystemMessage::UserLeft { id } => Self::UserLeft { id },
|
crate::SystemMessage::UserLeft { id } => Self::UserLeft { id },
|
||||||
crate::SystemMessage::UserRemove { id, by } => Self::UserRemove { id, by },
|
crate::SystemMessage::UserRemove { id, by } => Self::UserRemove { id, by },
|
||||||
|
crate::SystemMessage::MessagePinned { id, by } => Self::MessagePinned { id, by },
|
||||||
|
crate::SystemMessage::MessageUnpinned { id, by } => Self::MessageUnpinned { id, by },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,9 +131,9 @@ auto_derived!(
|
|||||||
#[serde(rename = "channel_ownership_changed")]
|
#[serde(rename = "channel_ownership_changed")]
|
||||||
ChannelOwnershipChanged { from: String, to: String },
|
ChannelOwnershipChanged { from: String, to: String },
|
||||||
#[serde(rename = "message_pinned")]
|
#[serde(rename = "message_pinned")]
|
||||||
MessagePinned { id: String },
|
MessagePinned { id: String, by: String },
|
||||||
#[serde(rename = "message_unpinned")]
|
#[serde(rename = "message_unpinned")]
|
||||||
MessageUnpinned { id: String },
|
MessageUnpinned { id: String, by: String },
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Name and / or avatar override information
|
/// Name and / or avatar override information
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
use revolt_database::{
|
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_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
@@ -35,6 +36,23 @@ pub async fn message_pin(
|
|||||||
..Default::default()
|
..Default::default()
|
||||||
}, vec![]).await?;
|
}, 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)
|
Ok(EmptyResponse)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,7 +60,7 @@ pub async fn message_pin(
|
|||||||
mod test {
|
mod test {
|
||||||
use crate::{rocket, util::test::TestHarness};
|
use crate::{rocket, util::test::TestHarness};
|
||||||
use revolt_database::{events::client::EventV1, util::{idempotency::IdempotencyKey, reference::Reference}, Member, Message, Server};
|
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};
|
use rocket::http::{Header, Status};
|
||||||
|
|
||||||
#[rocket::async_test]
|
#[rocket::async_test]
|
||||||
@@ -97,6 +115,22 @@ mod test {
|
|||||||
assert_eq!(response.status(), Status::NoContent);
|
assert_eq!(response.status(), Status::NoContent);
|
||||||
drop(response);
|
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| {
|
harness.wait_for_event(&channel.id(), |event| {
|
||||||
match event {
|
match event {
|
||||||
EventV1::MessageUpdate { id, channel: channel_id, data, .. } => {
|
EventV1::MessageUpdate { id, channel: channel_id, data, .. } => {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
use revolt_database::{
|
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_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
use revolt_result::{create_error, Result};
|
use revolt_result::{create_error, Result};
|
||||||
use rocket::State;
|
use rocket::State;
|
||||||
@@ -30,10 +31,24 @@ pub async fn message_unpin(
|
|||||||
return Err(create_error!(NotPinned))
|
return Err(create_error!(NotPinned))
|
||||||
}
|
}
|
||||||
|
|
||||||
message.update(db, PartialMessage {
|
message.update(db, PartialMessage::default(), vec![FieldsMessage::Pinned]).await?;
|
||||||
pinned: Some(false),
|
|
||||||
..Default::default()
|
SystemMessage::MessageUnpinned {
|
||||||
}, vec![FieldsMessage::Pinned]).await?;
|
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)
|
Ok(EmptyResponse)
|
||||||
}
|
}
|
||||||
@@ -42,7 +57,7 @@ pub async fn message_unpin(
|
|||||||
mod test {
|
mod test {
|
||||||
use crate::{rocket, util::test::TestHarness};
|
use crate::{rocket, util::test::TestHarness};
|
||||||
use revolt_database::{events::client::EventV1, util::{idempotency::IdempotencyKey, reference::Reference}, Member, Message, PartialMessage, Server};
|
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};
|
use rocket::http::{Header, Status};
|
||||||
|
|
||||||
#[rocket::async_test]
|
#[rocket::async_test]
|
||||||
@@ -65,7 +80,7 @@ mod test {
|
|||||||
Member::create(&harness.db, &server, &user, Some(channels.clone())).await.expect("Failed to create member");
|
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 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,
|
&harness.db,
|
||||||
channel.clone(),
|
channel.clone(),
|
||||||
v0::DataMessageSend {
|
v0::DataMessageSend {
|
||||||
@@ -110,12 +125,25 @@ mod test {
|
|||||||
|
|
||||||
harness.wait_for_event(&channel.id(), |event| {
|
harness.wait_for_event(&channel.id(), |event| {
|
||||||
match event {
|
match event {
|
||||||
EventV1::MessageUpdate { id, data, .. } => {
|
EventV1::Message(message) => {
|
||||||
if id != &message.id {
|
match &message.system {
|
||||||
return false
|
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
|
true
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user