From 9025cbc9e58642f04b0925b38048802e1b603833 Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 19 Jun 2026 15:26:53 -0400 Subject: [PATCH 1/8] Adding constant for endpoint --- src/caller/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caller/mod.rs b/src/caller/mod.rs index a65b069..6821497 100644 --- a/src/caller/mod.rs +++ b/src/caller/mod.rs @@ -22,6 +22,8 @@ pub mod endpoints { pub const CREATE_SCHEDULED_MESSAGE_EVENT: &str = "/api/v1/schedule/message/event"; /// Constant for getting Scheduled Message Event endpoint pub const GET_SCHEDULED_MESSAGE_EVENT: &str = "/api/v1/schedule/message/event"; + /// Constant for deleting Scheduled Message Event endpoint + pub const DELETE_SCHEDULED_MESSAGE_EVENT: &str = "/api/v1/schedule/message/event/{id}"; } pub mod response { -- 2.47.3 From 8626b383badc79ddaedc4f4fb293c0c3ffab7318 Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 19 Jun 2026 15:28:18 -0400 Subject: [PATCH 2/8] Adding some code for the endpoint to delete Scheduled Message Events --- src/caller/message/scheduling.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs index 5f3c3b5..c0290ce 100644 --- a/src/caller/message/scheduling.rs +++ b/src/caller/message/scheduling.rs @@ -67,6 +67,8 @@ pub mod response { } pub use CreateScheduleMessageEventResponse as GetScheduledMessageEventResponse; + + pub use CreateScheduleMessageEventResponse as DeleteScheduledMessageEventResponse; } pub mod endpoint { @@ -355,4 +357,28 @@ pub mod endpoint { (axum::http::StatusCode::OK, axum::Json(response)) } + + + /// Endpoint to delete the Scheduled Message Event + #[utoipa::path( + delete, + path = crate::caller::endpoints::DELETE_SCHEDULED_MESSAGE_EVENT, + params(("id" = uuid::Uuid, Path, description = "Scheduled Message Event Id")), + responses( + (status = 200, description = "Song deleted", body = super::response::DeleteScheduledMessageEventResponse), + (status = 404, description = "Song not found", body = super::response::DeleteScheduledMessageEventResponse), + (status = 500, description = "Error deleting song", body = super::response::DeleteScheduledMessageEventResponse) + ) + )] + pub async fn delete_scheduled_message_event( + axum::Extension(pool): axum::Extension, + axum::extract::Path(id): axum::extract::Path, + ) -> ( + axum::http::StatusCode, + axum::Json, + ) { + let response = super::response::DeleteScheduledMessageEventResponse::default(); + todo!("Has not been implemented"); + (axum::http::StatusCode::NOT_IMPLEMENTED, axum::Json(response)) + } } -- 2.47.3 From 805bb04407a5850b1f13b664b504b037545c1c89 Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 19 Jun 2026 15:28:28 -0400 Subject: [PATCH 3/8] Making the endpoint available --- src/config/mod.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/config/mod.rs b/src/config/mod.rs index bbf64e4..6eea69c 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -10,7 +10,7 @@ pub mod host { pub mod init { use std::time::Duration; - use axum::routing::{get, patch, post}; + use axum::routing::{delete, get, patch, post}; use tower_http::timeout::TimeoutLayer; use utoipa::OpenApi; @@ -148,6 +148,12 @@ pub mod init { axum::middleware::from_fn(crate::auth::auth::), ), ) + .route( + crate::caller::endpoints::DELETE_SCHEDULED_MESSAGE_EVENT, + delete(scheduling_endpoints::delete_scheduled_message_event).route_layer( + axum::middleware::from_fn(crate::auth::auth::), + ), + ) .layer(cors::configure_cors().await) } -- 2.47.3 From 95846299292be9b52d2a128df4d32a03ae2f5ccf Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 19 Jun 2026 15:48:23 -0400 Subject: [PATCH 4/8] Got it --- src/caller/message/scheduling.rs | 31 +++++++++++++++++++++++++------ src/repo/message/scheduling.rs | 22 ++++++++++++++++++++++ 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs index c0290ce..dc3733c 100644 --- a/src/caller/message/scheduling.rs +++ b/src/caller/message/scheduling.rs @@ -365,9 +365,9 @@ pub mod endpoint { path = crate::caller::endpoints::DELETE_SCHEDULED_MESSAGE_EVENT, params(("id" = uuid::Uuid, Path, description = "Scheduled Message Event Id")), responses( - (status = 200, description = "Song deleted", body = super::response::DeleteScheduledMessageEventResponse), - (status = 404, description = "Song not found", body = super::response::DeleteScheduledMessageEventResponse), - (status = 500, description = "Error deleting song", body = super::response::DeleteScheduledMessageEventResponse) + (status = 200, description = "Deleted", body = super::response::DeleteScheduledMessageEventResponse), + (status = 400, description = "Bad request", body = super::response::DeleteScheduledMessageEventResponse), + (status = 500, description = "Error deleting", body = super::response::DeleteScheduledMessageEventResponse) ) )] pub async fn delete_scheduled_message_event( @@ -377,8 +377,27 @@ pub mod endpoint { axum::http::StatusCode, axum::Json, ) { - let response = super::response::DeleteScheduledMessageEventResponse::default(); - todo!("Has not been implemented"); - (axum::http::StatusCode::NOT_IMPLEMENTED, axum::Json(response)) + let mut response = super::response::DeleteScheduledMessageEventResponse::default(); + match scheduling_repo::sched_msg_event::get(&pool, &id).await { + Ok(scheduled_message_event) => { + match scheduling_repo::sched_msg_event::delete(&pool, &scheduled_message_event).await { + Ok(_) => { + response.message = String::from(super::super::super::response::SUCCESSFUL); + response.data.push(scheduled_message_event); + (axum::http::StatusCode::OK, axum::Json(response)) + } + Err(err) => { + eprintln!("Error: {err:?}"); + response.message = String::from("Error deleting"); + (axum::http::StatusCode::INTERNAL_SERVER_ERROR, axum::Json(response)) + } + } + } + Err(err) => { + eprintln!("Error: {err:?}"); + response.message = String::from("Bad request"); + (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) + } + } } } diff --git a/src/repo/message/scheduling.rs b/src/repo/message/scheduling.rs index 246a9c9..e68c72d 100644 --- a/src/repo/message/scheduling.rs +++ b/src/repo/message/scheduling.rs @@ -189,6 +189,28 @@ pub mod sched_msg_event { } } +pub async fn delete( + pool: &sqlx::PgPool, + scheduled_message_event: &textsender_models::message::scheduling::ScheduledMessageEvent, +) -> Result<(), sqlx::Error> { + match sqlx::query( + r#" + DELETE FROM "scheduled_message_events" + WHERE id = $1 + "#, + ) + .bind(scheduled_message_event.id) + .execute(pool) + .await { + Ok(_) => { + Ok(()) + } + Err(err) => { + Err(err) + } + } +} + async fn parse_row( row: &sqlx::postgres::PgRow, ) -> Result { -- 2.47.3 From bafb62d5068baa9cc40f6ebb13fc54484509657b Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 19 Jun 2026 15:58:05 -0400 Subject: [PATCH 5/8] Adding test --- tests/test.rs | 128 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 126 insertions(+), 2 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index 54cc70a..16e9b66 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -124,12 +124,10 @@ mod util { serde_json::from_slice(&body).unwrap() } - /* pub async fn format_url_with_value(endpoint: &str, value: &uuid::Uuid) -> String { let last = endpoint.len() - 5; format!("{}/{value}", &endpoint[0..last]) } - */ } pub fn token_fields() -> (String, String, String) { @@ -427,6 +425,29 @@ mod request { Err(err) => Err(err), } } + + pub async fn delete_scheduled_message_event( + app: &axum::Router, + scheduled_message_event_id: &uuid::Uuid, + ) -> Result { + /* + let uri = format!( + "{}?scheduled_message_id={}", + textsender_api::caller::endpoints::GET_SCHEDULED_MESSAGE_EVENT, + scheduled_message_id + ); + */ + let uri = super::super::super::util::format_url_with_value(textsender_api::caller::endpoints::DELETE_SCHEDULED_MESSAGE_EVENT, scheduled_message_event_id).await; + println!("Link: {uri:?}"); + + match super::super::run_post(None, &uri, axum::http::Method::DELETE, false).await { + Ok(req) => match app.clone().oneshot(req).await { + Ok(response) => Ok(response), + Err(err) => Err(axum::http::Error::from(err)), + }, + Err(err) => Err(err), + } + } } } @@ -902,3 +923,106 @@ async fn test_get_scheduled_message_event() { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } + +#[tokio::test] +async fn test_delete_scheduled_message_event() { + let (tm_pool, db_name, pool) = db_mgr::get_database_ready().await; + let app = init::app(pool).await; + + let mut contact_id: uuid::Uuid = uuid::Uuid::nil(); + let mut message_id: uuid::Uuid = uuid::Uuid::nil(); + let mut scheduled_message_id: uuid::Uuid = uuid::Uuid::nil(); + + match request::create_contact(&app).await { + Ok(response) => { + let resp = util::get_resp_data::< + textsender_api::caller::contact::response::AddContactResponse, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + contact_id = resp.data[0].id.unwrap(); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + }; + + match request::message::create_message(&app).await { + Ok(response) => { + let resp = util::get_resp_data::< + textsender_api::caller::message::response::AddMessageResponse, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + let message = &resp.data[0]; + message_id = message.id.unwrap(); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + }; + + match request::message::scheduling::create_scheduled_message(&app).await { + Ok(response) => { + let resp = util::get_resp_data::< + textsender_api::caller::message::scheduling::response::ScheduleMessageResponse, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + scheduled_message_id = resp.data[0].id; + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + + match request::message::scheduling::create_scheduled_message_event( + &app, + &contact_id, + &message_id, + &scheduled_message_id, + ) + .await + { + Ok(response) => { + let resp = util::get_resp_data::< + textsender_api::caller::message::scheduling::response::CreateScheduleMessageEventResponse, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + + match request::message::scheduling::get_scheduled_message_events(&app, &scheduled_message_id) + .await + { + Ok(response) => { + let resp = util::get_resp_data::< + textsender_api::caller::message::scheduling::response::GetScheduledMessageEventResponse, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + let scheduled_message_event = &resp.data[0]; + match request::message::scheduling::delete_scheduled_message_event(&app, &scheduled_message_event.id).await { + Ok(response) => { + let resp = util::get_resp_data::< + textsender_api::caller::message::scheduling::response::DeleteScheduledMessageEventResponse, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + + let _ = db_mgr::drop_database(&tm_pool, &db_name).await; +} -- 2.47.3 From 7c6d82015c31d10589febcab6c25309c5d8ed28f Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 19 Jun 2026 15:58:20 -0400 Subject: [PATCH 6/8] cargo fmt --- src/caller/message/scheduling.rs | 10 +++++++--- src/repo/message/scheduling.rs | 29 +++++++++++++---------------- tests/test.rs | 17 +++++++++++++---- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs index dc3733c..161673d 100644 --- a/src/caller/message/scheduling.rs +++ b/src/caller/message/scheduling.rs @@ -358,7 +358,6 @@ pub mod endpoint { (axum::http::StatusCode::OK, axum::Json(response)) } - /// Endpoint to delete the Scheduled Message Event #[utoipa::path( delete, @@ -380,7 +379,9 @@ pub mod endpoint { let mut response = super::response::DeleteScheduledMessageEventResponse::default(); match scheduling_repo::sched_msg_event::get(&pool, &id).await { Ok(scheduled_message_event) => { - match scheduling_repo::sched_msg_event::delete(&pool, &scheduled_message_event).await { + match scheduling_repo::sched_msg_event::delete(&pool, &scheduled_message_event) + .await + { Ok(_) => { response.message = String::from(super::super::super::response::SUCCESSFUL); response.data.push(scheduled_message_event); @@ -389,7 +390,10 @@ pub mod endpoint { Err(err) => { eprintln!("Error: {err:?}"); response.message = String::from("Error deleting"); - (axum::http::StatusCode::INTERNAL_SERVER_ERROR, axum::Json(response)) + ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(response), + ) } } } diff --git a/src/repo/message/scheduling.rs b/src/repo/message/scheduling.rs index e68c72d..5e3fe71 100644 --- a/src/repo/message/scheduling.rs +++ b/src/repo/message/scheduling.rs @@ -189,27 +189,24 @@ pub mod sched_msg_event { } } -pub async fn delete( - pool: &sqlx::PgPool, - scheduled_message_event: &textsender_models::message::scheduling::ScheduledMessageEvent, -) -> Result<(), sqlx::Error> { - match sqlx::query( - r#" + pub async fn delete( + pool: &sqlx::PgPool, + scheduled_message_event: &textsender_models::message::scheduling::ScheduledMessageEvent, + ) -> Result<(), sqlx::Error> { + match sqlx::query( + r#" DELETE FROM "scheduled_message_events" WHERE id = $1 "#, - ) - .bind(scheduled_message_event.id) - .execute(pool) - .await { - Ok(_) => { - Ok(()) - } - Err(err) => { - Err(err) + ) + .bind(scheduled_message_event.id) + .execute(pool) + .await + { + Ok(_) => Ok(()), + Err(err) => Err(err), } } -} async fn parse_row( row: &sqlx::postgres::PgRow, diff --git a/tests/test.rs b/tests/test.rs index 16e9b66..d359804 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -437,7 +437,11 @@ mod request { scheduled_message_id ); */ - let uri = super::super::super::util::format_url_with_value(textsender_api::caller::endpoints::DELETE_SCHEDULED_MESSAGE_EVENT, scheduled_message_event_id).await; + let uri = super::super::super::util::format_url_with_value( + textsender_api::caller::endpoints::DELETE_SCHEDULED_MESSAGE_EVENT, + scheduled_message_event_id, + ) + .await; println!("Link: {uri:?}"); match super::super::run_post(None, &uri, axum::http::Method::DELETE, false).await { @@ -1006,13 +1010,18 @@ async fn test_delete_scheduled_message_event() { .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); let scheduled_message_event = &resp.data[0]; - match request::message::scheduling::delete_scheduled_message_event(&app, &scheduled_message_event.id).await { + match request::message::scheduling::delete_scheduled_message_event( + &app, + &scheduled_message_event.id, + ) + .await + { Ok(response) => { - let resp = util::get_resp_data::< + let resp = util::get_resp_data::< textsender_api::caller::message::scheduling::response::DeleteScheduledMessageEventResponse, >(response) .await; - assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); } Err(err) => { assert!(false, "Error: {err:?}"); -- 2.47.3 From c953491cc8c611f97ffa7f7ff45403884eefe330 Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 19 Jun 2026 16:00:28 -0400 Subject: [PATCH 7/8] Test cleanup --- tests/test.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index d359804..2293c90 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -430,19 +430,11 @@ mod request { app: &axum::Router, scheduled_message_event_id: &uuid::Uuid, ) -> Result { - /* - let uri = format!( - "{}?scheduled_message_id={}", - textsender_api::caller::endpoints::GET_SCHEDULED_MESSAGE_EVENT, - scheduled_message_id - ); - */ let uri = super::super::super::util::format_url_with_value( textsender_api::caller::endpoints::DELETE_SCHEDULED_MESSAGE_EVENT, scheduled_message_event_id, ) .await; - println!("Link: {uri:?}"); match super::super::run_post(None, &uri, axum::http::Method::DELETE, false).await { Ok(req) => match app.clone().oneshot(req).await { -- 2.47.3 From 9a374880a2afbef0af4a104a757d228bbb8eace3 Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 19 Jun 2026 16:00:34 -0400 Subject: [PATCH 8/8] bump: textsender_api --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f342aea..baf05a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2277,7 +2277,7 @@ dependencies = [ [[package]] name = "textsender_api" -version = "0.1.12" +version = "0.1.13" dependencies = [ "axum", "axum-extra", diff --git a/Cargo.toml b/Cargo.toml index 253522b..4cc484c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "textsender_api" -version = "0.1.12" +version = "0.1.13" edition = "2024" rust-version = "1.96" -- 2.47.3