feat: add reply_to field to messages
All checks were successful
ci/woodpecker/push/build-and-publish Pipeline was successful
ci/woodpecker/push/publish-docs Pipeline was successful

This commit is contained in:
Radical 2025-07-04 21:42:23 +02:00
parent b6df1e38ad
commit f3760af1bb
6 changed files with 20 additions and 1 deletions

View file

@ -0,0 +1,2 @@
-- This file should undo anything in `up.sql`
ALTER TABLE messages DROP COLUMN reply_to;

View file

@ -0,0 +1,2 @@
-- Your SQL goes here
ALTER TABLE messages ADD COLUMN reply_to UUID REFERENCES messages(uuid) DEFAULT NULL;

View file

@ -5,6 +5,7 @@ use actix_web::{
}; };
use actix_ws::AggregatedMessage; use actix_ws::AggregatedMessage;
use futures_util::StreamExt as _; use futures_util::StreamExt as _;
use serde::Deserialize;
use uuid::Uuid; use uuid::Uuid;
use crate::{ use crate::{
@ -14,6 +15,12 @@ use crate::{
utils::{get_ws_protocol_header, global_checks}, utils::{get_ws_protocol_header, global_checks},
}; };
#[derive(Deserialize)]
struct MessageBody {
message: String,
reply_to: Option<Uuid>,
}
#[get("/{uuid}/socket")] #[get("/{uuid}/socket")]
pub async fn ws( pub async fn ws(
req: HttpRequest, req: HttpRequest,
@ -74,7 +81,9 @@ pub async fn ws(
Ok(AggregatedMessage::Text(text)) => { Ok(AggregatedMessage::Text(text)) => {
let mut conn = data.cache_pool.get_multiplexed_tokio_connection().await?; let mut conn = data.cache_pool.get_multiplexed_tokio_connection().await?;
let message = channel.new_message(&data, uuid, text.to_string()).await?; let message_body: MessageBody = serde_json::from_str(&text)?;
let message = channel.new_message(&data, uuid, message_body.message, message_body.reply_to).await?;
redis::cmd("PUBLISH") redis::cmd("PUBLISH")
.arg(&[channel_uuid.to_string(), serde_json::to_string(&message)?]) .arg(&[channel_uuid.to_string(), serde_json::to_string(&message)?])

View file

@ -270,6 +270,7 @@ impl Channel {
data: &Data, data: &Data,
user_uuid: Uuid, user_uuid: Uuid,
message: String, message: String,
reply_to: Option<Uuid>,
) -> Result<Message, Error> { ) -> Result<Message, Error> {
let message_uuid = Uuid::now_v7(); let message_uuid = Uuid::now_v7();
@ -278,6 +279,7 @@ impl Channel {
channel_uuid: self.uuid, channel_uuid: self.uuid,
user_uuid, user_uuid,
message, message,
reply_to,
}; };
let mut conn = data.pool.get().await?; let mut conn = data.pool.get().await?;

View file

@ -14,6 +14,7 @@ pub struct MessageBuilder {
pub channel_uuid: Uuid, pub channel_uuid: Uuid,
pub user_uuid: Uuid, pub user_uuid: Uuid,
pub message: String, pub message: String,
pub reply_to: Option<Uuid>,
} }
impl MessageBuilder { impl MessageBuilder {
@ -25,6 +26,7 @@ impl MessageBuilder {
channel_uuid: self.channel_uuid, channel_uuid: self.channel_uuid,
user_uuid: self.user_uuid, user_uuid: self.user_uuid,
message: self.message.clone(), message: self.message.clone(),
reply_to: self.reply_to,
user, user,
}) })
} }
@ -36,5 +38,6 @@ pub struct Message {
channel_uuid: Uuid, channel_uuid: Uuid,
user_uuid: Uuid, user_uuid: Uuid,
message: String, message: String,
reply_to: Option<Uuid>,
user: User, user: User,
} }

View file

@ -77,6 +77,7 @@ diesel::table! {
user_uuid -> Uuid, user_uuid -> Uuid,
#[max_length = 4000] #[max_length = 4000]
message -> Varchar, message -> Varchar,
reply_to -> Nullable<Uuid>,
} }
} }