diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs index af1eef7..249dd73 100644 --- a/src/caller/message/scheduling.rs +++ b/src/caller/message/scheduling.rs @@ -104,6 +104,8 @@ pub mod response { pub struct ChangedStatus { pub old_status: String, } + + pub use ScheduleMessageResponse as FetchScheduledMessageResponse; } pub mod endpoint { @@ -243,6 +245,50 @@ pub mod endpoint { .is_some_and(|t| t - time::OffsetDateTime::now_utc() >= time::Duration::minutes(10)) } + /// Endpoint to fetch Scheduled Message that is ready + #[utoipa::path( + get, + path = crate::caller::endpoints::FETCH_SCHEDULED_MESSAGE, + responses( + (status = 200, description = "Scheduled Message found", body = super::response::FetchScheduledMessageResponse), + (status = 400, description = "Error getting Scheduled Message", body = super::response::FetchScheduledMessageResponse) + ) + )] + pub async fn fetch_scheduled_message( + axum::Extension(pool): axum::Extension, + ) -> ( + axum::http::StatusCode, + axum::Json, + ) { + let mut response = super::response::FetchScheduledMessageResponse::default(); + + match scheduling_repo::fetch(&pool).await { + Ok(scheduled_message) => { + response.data.push(scheduled_message); + response.message = String::from(super::super::super::response::SUCCESSFUL); + + (axum::http::StatusCode::OK, axum::Json(response)) + } + Err(err) => { + match err { + sqlx::Error::RowNotFound => { + response.message = String::from("Nothing to fetch"); + + (axum::http::StatusCode::NO_CONTENT, axum::Json(response)) + } + _ => { + eprintln!("Error: {err:?}"); + response.message = String::from("Error"); + ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(response), + ) + } + } + } + } + } + /// Endpoint to update status of Scheduled Message #[utoipa::path( patch, diff --git a/src/config/mod.rs b/src/config/mod.rs index d09b4e0..17d8485 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -160,6 +160,12 @@ pub mod init { axum::middleware::from_fn(crate::auth::auth::), ), ) + .route( + crate::caller::endpoints::FETCH_SCHEDULED_MESSAGE, + get(scheduling_endpoints::fetch_scheduled_message).route_layer( + axum::middleware::from_fn(crate::auth::auth::), + ), + ) .layer(cors::configure_cors().await) } diff --git a/src/repo/message/scheduling.rs b/src/repo/message/scheduling.rs index 36141a8..4a21621 100644 --- a/src/repo/message/scheduling.rs +++ b/src/repo/message/scheduling.rs @@ -84,6 +84,40 @@ pub async fn get_with_user_id( } } +pub async fn fetch( + pool: &sqlx::PgPool, +) -> Result { + match sqlx::query( + r#" + UPDATE "scheduled_messages" + SET status = $1 + WHERE id = ( + SELECT id FROM "scheduled_messages" + WHERE status = $2 + ORDER BY id + FOR UPDATE SKIP LOCKED + LIMIT 1 + ) + RETURNING id, scheduled, created, status, user_id + "#, + ) + .bind(textsender_models::message::scheduling::PROCESSING) + .bind(textsender_models::message::scheduling::READY) + .fetch_one(pool) + .await + { + Ok(row) => { + match parse_row(&row).await { + Ok(scheduled_message) => { + Ok(scheduled_message) + } + Err(err) => Err(err) + } + } + Err(err) => Err(err), + } +} + pub async fn update_status( pool: &sqlx::PgPool, id: &uuid::Uuid,