mirror of
https://github.com/stoatchat/stoatchat.git
synced 2026-07-14 13:36:59 +00:00
feat: search by message components
Signed-off-by: Zomatree <me@zomatree.live>
This commit is contained in:
@@ -79,12 +79,12 @@ pub struct AckPayload {
|
||||
pub message_id: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct MessageDeletePayload {
|
||||
pub message_id: String
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct ChannelDeletePayload {
|
||||
pub channel_id: String
|
||||
}
|
||||
@@ -890,19 +890,27 @@ impl Message {
|
||||
/// Append content to message
|
||||
pub async fn append(
|
||||
db: &Database,
|
||||
amqp: Option<&AMQP>,
|
||||
id: String,
|
||||
channel: String,
|
||||
append: AppendMessage,
|
||||
) -> Result<()> {
|
||||
db.append_message(&id, &append).await?;
|
||||
if let Some(message) = db.append_message(&id, &append).await? {
|
||||
if let Some(amqp) = amqp {
|
||||
if let Err(e) = amqp.edit_message_search(message).await {
|
||||
log::error!("Error pushing message to RabbitMQ: {e}");
|
||||
capture_error(&e);
|
||||
}
|
||||
}
|
||||
|
||||
EventV1::MessageAppend {
|
||||
id,
|
||||
channel: channel.to_string(),
|
||||
append: append.into(),
|
||||
EventV1::MessageAppend {
|
||||
id,
|
||||
channel: channel.to_string(),
|
||||
append: append.into(),
|
||||
}
|
||||
.p(channel)
|
||||
.await;
|
||||
}
|
||||
.p(channel)
|
||||
.await;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ pub trait AbstractMessages: Sync + Send {
|
||||
async fn update_message(&self, id: &str, message: &PartialMessage, remove: Vec<FieldsMessage>) -> Result<()>;
|
||||
|
||||
/// Append information to a given message
|
||||
async fn append_message(&self, id: &str, append: &AppendMessage) -> Result<()>;
|
||||
async fn append_message(&self, id: &str, append: &AppendMessage) -> Result<Option<Message>>;
|
||||
|
||||
/// Add a new reaction to a message
|
||||
async fn add_reaction(&self, id: &str, emoji: &str, user: &str) -> Result<()>;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use bson::{to_bson, Document};
|
||||
use futures::try_join;
|
||||
use mongodb::options::{FindOptions, ReadConcern};
|
||||
use mongodb::options::{FindOptions, ReadConcern, ReturnDocument};
|
||||
use revolt_models::v0::MessageSort;
|
||||
use revolt_result::Result;
|
||||
|
||||
@@ -201,7 +201,7 @@ impl AbstractMessages for MongoDb {
|
||||
}
|
||||
|
||||
/// Append information to a given message
|
||||
async fn append_message(&self, id: &str, append: &AppendMessage) -> Result<()> {
|
||||
async fn append_message(&self, id: &str, append: &AppendMessage) -> Result<Option<Message>> {
|
||||
let mut query = doc! {};
|
||||
|
||||
if let Some(embeds) = &append.embeds {
|
||||
@@ -219,18 +219,18 @@ impl AbstractMessages for MongoDb {
|
||||
}
|
||||
|
||||
if query.is_empty() {
|
||||
return Ok(());
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
self.col::<Document>(COL)
|
||||
.update_one(
|
||||
self.col::<Message>(COL)
|
||||
.find_one_and_update(
|
||||
doc! {
|
||||
"_id": id
|
||||
},
|
||||
query,
|
||||
)
|
||||
.return_document(ReturnDocument::After)
|
||||
.await
|
||||
.map(|_| ())
|
||||
.map_err(|_| create_database_error!("update_one", COL))
|
||||
}
|
||||
|
||||
|
||||
@@ -208,7 +208,7 @@ impl AbstractMessages for ReferenceDb {
|
||||
}
|
||||
|
||||
/// Append information to a given message
|
||||
async fn append_message(&self, id: &str, append: &AppendMessage) -> Result<()> {
|
||||
async fn append_message(&self, id: &str, append: &AppendMessage) -> Result<Option<Message>> {
|
||||
let mut messages = self.messages.lock().await;
|
||||
if let Some(message_data) = messages.get_mut(id) {
|
||||
if let Some(embeds) = &append.embeds {
|
||||
@@ -219,9 +219,11 @@ impl AbstractMessages for ReferenceDb {
|
||||
message_data.embeds = Some(embeds.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
Ok(Some(message_data.clone()))
|
||||
} else {
|
||||
Ok(None)
|
||||
}
|
||||
} else {
|
||||
Err(create_error!(NotFound))
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ pub fn start_workers(db: Database, amqp: AMQP) {
|
||||
for _ in 0..WORKER_COUNT {
|
||||
task::spawn(ack::worker(db.clone(), amqp.clone()));
|
||||
task::spawn(last_message_id::worker(db.clone()));
|
||||
task::spawn(process_embeds::worker(db.clone()));
|
||||
task::spawn(process_embeds::worker(db.clone(), amqp.clone()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::{models::Message, AppendMessage, Database};
|
||||
use crate::{AMQP, AppendMessage, Database, models::Message};
|
||||
|
||||
use futures::future::join_all;
|
||||
use linkify::{LinkFinder, LinkKind};
|
||||
@@ -41,7 +41,7 @@ pub async fn queue(channel: String, id: String, content: String) {
|
||||
}
|
||||
|
||||
/// Start a new worker
|
||||
pub async fn worker(db: Database) {
|
||||
pub async fn worker(db: Database, amqp: AMQP) {
|
||||
let semaphore = Arc::new(Semaphore::new(
|
||||
config().await.api.workers.max_concurrent_connections,
|
||||
));
|
||||
@@ -49,6 +49,7 @@ pub async fn worker(db: Database) {
|
||||
loop {
|
||||
let task = Q.pop().await;
|
||||
let db = db.clone();
|
||||
let amqp = amqp.clone();
|
||||
let semaphore = semaphore.clone();
|
||||
|
||||
spawn(async move {
|
||||
@@ -64,6 +65,7 @@ pub async fn worker(db: Database) {
|
||||
if let Ok(embeds) = embeds {
|
||||
if let Err(err) = Message::append(
|
||||
&db,
|
||||
Some(&amqp),
|
||||
task.id,
|
||||
task.channel,
|
||||
AppendMessage {
|
||||
|
||||
Reference in New Issue
Block a user