From 923a42ada6a82863d068f102285a5e84b04c1933 Mon Sep 17 00:00:00 2001 From: xeovalyte Date: Fri, 28 Feb 2025 13:48:30 +0100 Subject: [PATCH] Added route to send message --- server/migrations/007_alter_messages.sql | 1 + server/src/database/model/message.rs | 20 ++++++++++++ server/src/model/message.rs | 3 +- server/src/routes/message.rs | 39 +++++++++++++++++++++--- 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 server/migrations/007_alter_messages.sql diff --git a/server/migrations/007_alter_messages.sql b/server/migrations/007_alter_messages.sql new file mode 100644 index 0000000..5ead5c2 --- /dev/null +++ b/server/migrations/007_alter_messages.sql @@ -0,0 +1 @@ +ALTER TYPE message_status ADD VALUE 'draft'; diff --git a/server/src/database/model/message.rs b/server/src/database/model/message.rs index 47ec858..a20424a 100644 --- a/server/src/database/model/message.rs +++ b/server/src/database/model/message.rs @@ -85,4 +85,24 @@ impl Message { Ok(messages) } + + pub async fn update_status( + transaction: &mut sqlx::Transaction<'_, Postgres>, + message_id: &uuid::Uuid, + status: MessageStatus, + ) -> Result<(), sqlx::Error> { + sqlx::query!( + " + UPDATE ONLY messages + SET status = $1 + WHERE message_id = $2 + ", + status as MessageStatus, + message_id, + ) + .execute(&mut **transaction) + .await?; + + Ok(()) + } } diff --git a/server/src/model/message.rs b/server/src/model/message.rs index 614eb0c..18d1f59 100644 --- a/server/src/model/message.rs +++ b/server/src/model/message.rs @@ -22,6 +22,7 @@ pub enum MessageStatus { Pending, Sent, Canceled, + Draft, } bitflags! { @@ -92,7 +93,7 @@ impl Message { thumbnail_url: message_create.thumbnail_url, member_groups, member_roles, - status: MessageStatus::Pending, + status: MessageStatus::Draft, }) } } diff --git a/server/src/routes/message.rs b/server/src/routes/message.rs index 1770da2..6dcd8b4 100644 --- a/server/src/routes/message.rs +++ b/server/src/routes/message.rs @@ -1,4 +1,9 @@ -use axum::{extract::State, http::HeaderMap, routing::post, Json, Router}; +use axum::{ + extract::{Path, State}, + http::HeaderMap, + routing::post, + Json, Router, +}; use bitflags::Flags; use serde::Deserialize; @@ -7,14 +12,16 @@ use crate::{ database::model::Message as DbMessage, model::{ member::{Groups, Roles}, - message::{Channel, MessageCreate}, + message::{Channel, MessageCreate, MessageStatus}, Message, }, AppState, }; pub fn routes() -> Router { - Router::new().route("/messages", post(message_create)) + Router::new() + .route("/messages", post(message_create)) + .route("/messages/{message_id}/send", post(message_send)) } #[derive(Debug, Deserialize)] @@ -30,7 +37,7 @@ pub async fn message_create( State(state): State, headers: HeaderMap, Json(request): Json, -) -> Result<(), crate::Error> { +) -> Result { let user = get_user_from_header(&state.pool, &headers).await?; user.authorize(&state.pool, Some(Roles::ADMIN | Roles::MESSAGES), None) @@ -53,5 +60,29 @@ pub async fn message_create( transaction.commit().await?; + Ok(db_message.message_id.to_string()) +} + +pub async fn message_send( + State(state): State, + headers: HeaderMap, + Path(message_id): Path, +) -> Result<(), crate::Error> { + let user = get_user_from_header(&state.pool, &headers).await?; + + user.authorize(&state.pool, Some(Roles::ADMIN | Roles::MESSAGES), None) + .await?; + + let message_id: uuid::Uuid = + uuid::Uuid::parse_str(&message_id).map_err(|_| crate::Error::BadRequest { + expected: "Could not convert message id to uuid".to_string(), + })?; + + let mut transaction = state.pool.begin().await?; + + DbMessage::update_status(&mut transaction, &message_id, MessageStatus::Sent).await?; + + transaction.commit().await?; + Ok(()) }