feat: initial work on elasticsearch integration
Signed-off-by: Zomatree <me@zomatree.live>
This commit is contained in:
25
crates/daemons/searchd/src/consumers/channel_delete.rs
Normal file
25
crates/daemons/searchd/src/consumers/channel_delete.rs
Normal file
@@ -0,0 +1,25 @@
|
||||
use amqprs::{BasicProperties, Deliver, channel::{BasicAckArguments, Channel}, consumer::AsyncConsumer};
|
||||
use async_trait::async_trait;
|
||||
use revolt_database::events::rabbit::{ChannelDeletePayload, MessageDeletePayload};
|
||||
use revolt_search::ElasticsearchClient;
|
||||
|
||||
pub struct ChannelDeleteConsumer(pub ElasticsearchClient);
|
||||
|
||||
#[async_trait]
|
||||
impl AsyncConsumer for ChannelDeleteConsumer {
|
||||
async fn consume(
|
||||
&mut self,
|
||||
channel: &Channel,
|
||||
deliver: Deliver,
|
||||
_basic_properties: BasicProperties,
|
||||
content: Vec<u8>,
|
||||
) {
|
||||
let payload = serde_json::from_slice::<ChannelDeletePayload>(&content).expect("Failed to decode message");
|
||||
|
||||
if self.0.delete_channel(&payload.channel_id).await.is_ok() {
|
||||
channel.basic_ack(BasicAckArguments::new(deliver.delivery_tag(), false)).await.expect("Failed to ack");
|
||||
} else {
|
||||
// todo requeue
|
||||
}
|
||||
}
|
||||
}
|
||||
26
crates/daemons/searchd/src/consumers/message.rs
Normal file
26
crates/daemons/searchd/src/consumers/message.rs
Normal file
@@ -0,0 +1,26 @@
|
||||
use amqprs::{BasicProperties, Deliver, channel::{BasicAckArguments, Channel}, consumer::AsyncConsumer};
|
||||
use async_trait::async_trait;
|
||||
use revolt_database::Message;
|
||||
use revolt_search::ElasticsearchClient;
|
||||
|
||||
pub struct MessageConsumer(pub ElasticsearchClient);
|
||||
|
||||
#[async_trait]
|
||||
impl AsyncConsumer for MessageConsumer {
|
||||
async fn consume(
|
||||
&mut self,
|
||||
channel: &Channel,
|
||||
deliver: Deliver,
|
||||
_basic_properties: BasicProperties,
|
||||
content: Vec<u8>,
|
||||
) {
|
||||
let message = serde_json::from_slice::<Message>(&content).expect("Failed to decode message");
|
||||
log::debug!("Received message {message:?}");
|
||||
|
||||
if self.0.index_message(message).await.is_ok() {
|
||||
channel.basic_ack(BasicAckArguments::new(deliver.delivery_tag(), false)).await.expect("Failed to ack");
|
||||
} else {
|
||||
// todo requeue
|
||||
}
|
||||
}
|
||||
}
|
||||
25
crates/daemons/searchd/src/consumers/message_delete.rs
Normal file
25
crates/daemons/searchd/src/consumers/message_delete.rs
Normal file
@@ -0,0 +1,25 @@
|
||||
use amqprs::{BasicProperties, Deliver, channel::{BasicAckArguments, Channel}, consumer::AsyncConsumer};
|
||||
use async_trait::async_trait;
|
||||
use revolt_database::events::rabbit::MessageDeletePayload;
|
||||
use revolt_search::ElasticsearchClient;
|
||||
|
||||
pub struct MessageDeleteConsumer(pub ElasticsearchClient);
|
||||
|
||||
#[async_trait]
|
||||
impl AsyncConsumer for MessageDeleteConsumer {
|
||||
async fn consume(
|
||||
&mut self,
|
||||
channel: &Channel,
|
||||
deliver: Deliver,
|
||||
_basic_properties: BasicProperties,
|
||||
content: Vec<u8>,
|
||||
) {
|
||||
let payload = serde_json::from_slice::<MessageDeletePayload>(&content).expect("Failed to decode message");
|
||||
|
||||
if self.0.delete_message(&payload.message_id).await.is_ok() {
|
||||
channel.basic_ack(BasicAckArguments::new(deliver.delivery_tag(), false)).await.expect("Failed to ack");
|
||||
} else {
|
||||
// todo requeue
|
||||
}
|
||||
}
|
||||
}
|
||||
25
crates/daemons/searchd/src/consumers/message_edit.rs
Normal file
25
crates/daemons/searchd/src/consumers/message_edit.rs
Normal file
@@ -0,0 +1,25 @@
|
||||
use amqprs::{BasicProperties, Deliver, channel::{BasicAckArguments, Channel}, consumer::AsyncConsumer};
|
||||
use async_trait::async_trait;
|
||||
use revolt_database::Message;
|
||||
use revolt_search::ElasticsearchClient;
|
||||
|
||||
pub struct MessageEditConsumer(pub ElasticsearchClient);
|
||||
|
||||
#[async_trait]
|
||||
impl AsyncConsumer for MessageEditConsumer {
|
||||
async fn consume(
|
||||
&mut self,
|
||||
channel: &Channel,
|
||||
deliver: Deliver,
|
||||
_basic_properties: BasicProperties,
|
||||
content: Vec<u8>,
|
||||
) {
|
||||
let message = serde_json::from_slice::<Message>(&content).expect("Failed to decode message");
|
||||
|
||||
if self.0.edit_message(message).await.is_ok() {
|
||||
channel.basic_ack(BasicAckArguments::new(deliver.delivery_tag(), false)).await.expect("Failed to ack");
|
||||
} else {
|
||||
// todo requeue
|
||||
}
|
||||
}
|
||||
}
|
||||
8
crates/daemons/searchd/src/consumers/mod.rs
Normal file
8
crates/daemons/searchd/src/consumers/mod.rs
Normal file
@@ -0,0 +1,8 @@
|
||||
mod message;
|
||||
mod message_edit;
|
||||
mod message_delete;
|
||||
mod channel_delete;
|
||||
|
||||
pub use message::*;
|
||||
pub use message_edit::*;
|
||||
pub use channel_delete::*;
|
||||
Reference in New Issue
Block a user