From bdd8fae7d43267a2259aa6d86639061e0fa44d71 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 16:03:27 -0400 Subject: [PATCH 01/28] Moving file --- src/repo/{ => message}/message.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/repo/{ => message}/message.rs (100%) diff --git a/src/repo/message.rs b/src/repo/message/message.rs similarity index 100% rename from src/repo/message.rs rename to src/repo/message/message.rs -- 2.47.3 From e1f6cb7664f8d09711f0275a62bc49d01934b132 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 16:04:40 -0400 Subject: [PATCH 02/28] Renaming file --- src/repo/{ => message}/scheduling.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/repo/{ => message}/scheduling.rs (100%) diff --git a/src/repo/scheduling.rs b/src/repo/message/scheduling.rs similarity index 100% rename from src/repo/scheduling.rs rename to src/repo/message/scheduling.rs -- 2.47.3 From bb5f8920ced380cc15ab090fa34fe7df37363d9e Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 16:24:33 -0400 Subject: [PATCH 03/28] Saving changes --- src/caller/message/event.rs | 0 src/caller/mod.rs | 2 + src/repo/message/event.rs | 112 ++++++++++++++++++++++++++++++++++++ src/repo/message/mod.rs | 3 + src/repo/mod.rs | 1 - 5 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 src/caller/message/event.rs create mode 100644 src/repo/message/event.rs create mode 100644 src/repo/message/mod.rs diff --git a/src/caller/message/event.rs b/src/caller/message/event.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/caller/mod.rs b/src/caller/mod.rs index 11dff9c..5d68d7f 100644 --- a/src/caller/mod.rs +++ b/src/caller/mod.rs @@ -18,6 +18,8 @@ pub mod endpoints { pub const SCHEDULE_MESSAGE: &str = "/api/v1/schedule/message"; /// Constant for getting scheduled message endpoint pub const GET_SCHEDULE_MESSAGE: &str = "/api/v1/schedule/message"; + /// Constant for creating Scheduled Message Event endpoint + pub const CREATE_SCHEDULED_MESSAGE_EVENT: &str = "/api/v1/schedule/message/event"; } pub mod response { diff --git a/src/repo/message/event.rs b/src/repo/message/event.rs new file mode 100644 index 0000000..c7c78b8 --- /dev/null +++ b/src/repo/message/event.rs @@ -0,0 +1,112 @@ +use sqlx::Row; + +pub async fn insert( + pool: &sqlx::PgPool, + event: &textsender_models::message::event::MessageEventResponse, +) -> Result<(uuid::Uuid, time::OffsetDateTime), sqlx::Error> { + match sqlx::query( + r#" + INSERT INTO "scheduled_message_events" (contact_id, message_id, scheduled_message_id) + VALUES($1, $2, $3) RETURNING id, created; + "#, + ) + .bind(&event.contact_id) + .bind(&event.message_id) + .bind(&event.scheduled_message_event_id) + .fetch_one(pool) + .await + { + Ok(row) => { + let id: uuid::Uuid = row.try_get("id")?; + let created: time::OffsetDateTime = row.try_get("created")?; + Ok((id, created)) + } + Err(_) => Err(sqlx::Error::RowNotFound), + } +} + +pub async fn get( + pool: &sqlx::PgPool, + id: &uuid::Uuid, +) -> Result { + match sqlx::query( + r#" + SELECT id, contact_id, created, status, user_id FROM "scheduled_message_events" + WHERE + id = $1; + "#, + ) + .bind(id) + .fetch_one(pool) + .await + { + Ok(row) => match parse_row(&row).await { + Ok(event) => Ok(event), + Err(err) => Err(err), + }, + Err(_) => Err(sqlx::Error::RowNotFound), + } +} + +pub async fn get_with_user_id( + pool: &sqlx::PgPool, + scheduled_message_id: &uuid::Uuid, +) -> Result, sqlx::Error> { + match sqlx::query( + r#" + SELECT id, contact_id, message_id, schduled_message_id, created FROM "scheduled_message_events" + WHERE + scheduled_message_id = $1; + "#, + ) + .bind(scheduled_message_id) + .fetch_all(pool) + .await + { + Ok(rows) => { + let mut events: Vec = + Vec::new(); + for row in rows { + match parse_row(&row).await { + Ok(event) => { + events.push(event); + } + Err(err) => { + return Err(err); + } + } + } + + Ok(events) + } + Err(_) => Err(sqlx::Error::RowNotFound), + } +} + +async fn parse_row( + row: &sqlx::postgres::PgRow, +) -> Result { + let id: uuid::Uuid = row.try_get("id")?; + let response: String = row.try_get("response")?; + let status: String = row.try_get("status")?; + let contact_id: uuid::Uuid = row.try_get("contact_id")?; + let message_id: uuid::Uuid = row.try_get("message_id")?; + // todo!("Do something with created"); + // TODO: Do something about this + let _created: time::OffsetDateTime = row.try_get("created")?; + let sent: time::OffsetDateTime = row.try_get("sent")?; + let scheduled_message_id: uuid::Uuid = row.try_get("scheduled_message_id")?; + let user_id: uuid::Uuid = row.try_get("user_id")?; + + Ok(textsender_models::message::event::MessageEventResponse { + id, + response, + contact_id, + message_id, + status, + sent: Some(sent), + scheduled_message_event_id: scheduled_message_id, + user_id, + }) +} + diff --git a/src/repo/message/mod.rs b/src/repo/message/mod.rs new file mode 100644 index 0000000..54510d2 --- /dev/null +++ b/src/repo/message/mod.rs @@ -0,0 +1,3 @@ +pub mod event; +pub mod message; +pub mod scheduling; diff --git a/src/repo/mod.rs b/src/repo/mod.rs index d185221..2af9758 100644 --- a/src/repo/mod.rs +++ b/src/repo/mod.rs @@ -1,3 +1,2 @@ pub mod contact; pub mod message; -pub mod scheduling; -- 2.47.3 From cae25a84e7789e4f6d5ed69ffcbed83673171a8c Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 16:24:40 -0400 Subject: [PATCH 04/28] Adding table --- migrations/20260613211440_init.sql | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/migrations/20260613211440_init.sql b/migrations/20260613211440_init.sql index 48d8e47..0ab6ba3 100644 --- a/migrations/20260613211440_init.sql +++ b/migrations/20260613211440_init.sql @@ -24,3 +24,11 @@ CREATE TABLE IF NOT EXISTS "scheduled_messages" ( status TEXT CHECK (status IN ('PENDING', 'READY', 'PROCESSING', 'DONE')), user_id UUID NOT NULL ); + +CREATE TABLE IF NOT EXISTS "scheduled_message_events" ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + contact_id UUID NOT NULL, + message_id UUID NOT NULL, + scheduled_message_id UUID NOT NULL, + created timestamptz DEFAULT now() +); -- 2.47.3 From e40f0c6831dbfe0206223cb88cd6ba214258ef25 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 16:25:33 -0400 Subject: [PATCH 05/28] Adding message_event_responses table --- migrations/20260613211440_init.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/migrations/20260613211440_init.sql b/migrations/20260613211440_init.sql index 0ab6ba3..7be9c7b 100644 --- a/migrations/20260613211440_init.sql +++ b/migrations/20260613211440_init.sql @@ -32,3 +32,14 @@ CREATE TABLE IF NOT EXISTS "scheduled_message_events" ( scheduled_message_id UUID NOT NULL, created timestamptz DEFAULT now() ); + +CREATE TABLE IF NOT EXISTS "message_event_responses" ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + scheduled_message_event_id UUID NULL, + response JSONB NOT NULL, + user_id UUID NOT NULL, + sent timestamptz NOT NULL, + contact_id UUID NULL, + message_id UUID NULL, + status TEXT CHECK (status IN ('INSTANT', 'SCHEDULED')) +); -- 2.47.3 From 82b6a43cbe5e99801a981ea2f463f03813428bbc Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 16:33:10 -0400 Subject: [PATCH 06/28] Saving changes --- src/repo/message/event.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/repo/message/event.rs b/src/repo/message/event.rs index c7c78b8..d1be4de 100644 --- a/src/repo/message/event.rs +++ b/src/repo/message/event.rs @@ -3,23 +3,26 @@ use sqlx::Row; pub async fn insert( pool: &sqlx::PgPool, event: &textsender_models::message::event::MessageEventResponse, -) -> Result<(uuid::Uuid, time::OffsetDateTime), sqlx::Error> { +) -> Result { match sqlx::query( r#" - INSERT INTO "scheduled_message_events" (contact_id, message_id, scheduled_message_id) - VALUES($1, $2, $3) RETURNING id, created; + INSERT INTO "message_event_responses" (scheduled_message_event_id, response, user_id, sent, contact_id, message_id, status) + VALUES($1, $2, $3, $4, $5, $6, $7) RETURNING id; "#, ) + .bind(&event.scheduled_message_event_id) + .bind(&event.response) + .bind(&event.user_id) + .bind(&event.sent) .bind(&event.contact_id) .bind(&event.message_id) - .bind(&event.scheduled_message_event_id) + .bind(&event.status) .fetch_one(pool) .await { Ok(row) => { let id: uuid::Uuid = row.try_get("id")?; - let created: time::OffsetDateTime = row.try_get("created")?; - Ok((id, created)) + Ok(id) } Err(_) => Err(sqlx::Error::RowNotFound), } @@ -31,7 +34,7 @@ pub async fn get( ) -> Result { match sqlx::query( r#" - SELECT id, contact_id, created, status, user_id FROM "scheduled_message_events" + SELECT id, scheduled_message_event_id, response, user_id, sent, contact_id, message_id, status FROM "message_event_responses" WHERE id = $1; "#, @@ -50,16 +53,16 @@ pub async fn get( pub async fn get_with_user_id( pool: &sqlx::PgPool, - scheduled_message_id: &uuid::Uuid, + user_id: &uuid::Uuid, ) -> Result, sqlx::Error> { match sqlx::query( r#" - SELECT id, contact_id, message_id, schduled_message_id, created FROM "scheduled_message_events" + SELECT id, scheduled_message_event_id, response, user_id, sent, contact_id, message_id, status FROM "message_event_responses" WHERE - scheduled_message_id = $1; + user_id = $1; "#, ) - .bind(scheduled_message_id) + .bind(user_id) .fetch_all(pool) .await { @@ -91,9 +94,6 @@ async fn parse_row( let status: String = row.try_get("status")?; let contact_id: uuid::Uuid = row.try_get("contact_id")?; let message_id: uuid::Uuid = row.try_get("message_id")?; - // todo!("Do something with created"); - // TODO: Do something about this - let _created: time::OffsetDateTime = row.try_get("created")?; let sent: time::OffsetDateTime = row.try_get("sent")?; let scheduled_message_id: uuid::Uuid = row.try_get("scheduled_message_id")?; let user_id: uuid::Uuid = row.try_get("user_id")?; -- 2.47.3 From 26e1158881f215b9356d2f61281a819819c3922c Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 16:35:13 -0400 Subject: [PATCH 07/28] File changes --- src/repo/message/message.rs | 91 ------------------------------------ src/repo/message/mod.rs | 93 ++++++++++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 92 deletions(-) delete mode 100644 src/repo/message/message.rs diff --git a/src/repo/message/message.rs b/src/repo/message/message.rs deleted file mode 100644 index 0e3b015..0000000 --- a/src/repo/message/message.rs +++ /dev/null @@ -1,91 +0,0 @@ -use sqlx::Row; - -pub async fn insert( - pool: &sqlx::PgPool, - message: &textsender_models::message::Message, - user_id: &uuid::Uuid, -) -> Result { - match sqlx::query( - r#" - INSERT INTO "messages" (content, user_id) - VALUES($1, $2) RETURNING id; - "#, - ) - .bind(&message.content) - .bind(user_id) - .fetch_one(pool) - .await - { - Ok(row) => { - let id: uuid::Uuid = row.try_get("id")?; - Ok(id) - } - Err(_) => Err(sqlx::Error::RowNotFound), - } -} - -pub async fn get( - pool: &sqlx::PgPool, - id: &uuid::Uuid, -) -> Result { - match sqlx::query( - r#" - SELECT id, content, user_id FROM "messages" - WHERE - id = $1; - "#, - ) - .bind(id) - .fetch_one(pool) - .await - { - Ok(row) => { - let id: uuid::Uuid = row.try_get("id")?; - - let content: String = row.try_get("content")?; - let user_id: uuid::Uuid = row.try_get("user_id")?; - Ok(textsender_models::message::Message { - id: Some(id), - content, - user_id: Some(user_id), - }) - } - Err(_) => Err(sqlx::Error::RowNotFound), - } -} - -pub async fn get_with_user_id( - pool: &sqlx::PgPool, - user_id: &uuid::Uuid, -) -> Result, sqlx::Error> { - match sqlx::query( - r#" - SELECT id, content, user_id FROM "messages" - WHERE - user_id = $1; - "#, - ) - .bind(user_id) - .fetch_all(pool) - .await - { - Ok(rows) => { - let mut messages: Vec = Vec::new(); - for row in rows { - let id: uuid::Uuid = row.try_get("id")?; - let content: String = row.try_get("content")?; - let user_id: uuid::Uuid = row.try_get("user_id")?; - - let message = textsender_models::message::Message { - id: Some(id), - content, - user_id: Some(user_id), - }; - messages.push(message); - } - - Ok(messages) - } - Err(_) => Err(sqlx::Error::RowNotFound), - } -} diff --git a/src/repo/message/mod.rs b/src/repo/message/mod.rs index 54510d2..09b0414 100644 --- a/src/repo/message/mod.rs +++ b/src/repo/message/mod.rs @@ -1,3 +1,94 @@ pub mod event; -pub mod message; pub mod scheduling; + +use sqlx::Row; + +pub async fn insert( + pool: &sqlx::PgPool, + message: &textsender_models::message::Message, + user_id: &uuid::Uuid, +) -> Result { + match sqlx::query( + r#" + INSERT INTO "messages" (content, user_id) + VALUES($1, $2) RETURNING id; + "#, + ) + .bind(&message.content) + .bind(user_id) + .fetch_one(pool) + .await + { + Ok(row) => { + let id: uuid::Uuid = row.try_get("id")?; + Ok(id) + } + Err(_) => Err(sqlx::Error::RowNotFound), + } +} + +pub async fn get( + pool: &sqlx::PgPool, + id: &uuid::Uuid, +) -> Result { + match sqlx::query( + r#" + SELECT id, content, user_id FROM "messages" + WHERE + id = $1; + "#, + ) + .bind(id) + .fetch_one(pool) + .await + { + Ok(row) => { + let id: uuid::Uuid = row.try_get("id")?; + + let content: String = row.try_get("content")?; + let user_id: uuid::Uuid = row.try_get("user_id")?; + Ok(textsender_models::message::Message { + id: Some(id), + content, + user_id: Some(user_id), + }) + } + Err(_) => Err(sqlx::Error::RowNotFound), + } +} + +pub async fn get_with_user_id( + pool: &sqlx::PgPool, + user_id: &uuid::Uuid, +) -> Result, sqlx::Error> { + match sqlx::query( + r#" + SELECT id, content, user_id FROM "messages" + WHERE + user_id = $1; + "#, + ) + .bind(user_id) + .fetch_all(pool) + .await + { + Ok(rows) => { + let mut messages: Vec = Vec::new(); + for row in rows { + let id: uuid::Uuid = row.try_get("id")?; + let content: String = row.try_get("content")?; + let user_id: uuid::Uuid = row.try_get("user_id")?; + + let message = textsender_models::message::Message { + id: Some(id), + content, + user_id: Some(user_id), + }; + messages.push(message); + } + + Ok(messages) + } + Err(_) => Err(sqlx::Error::RowNotFound), + } +} -- 2.47.3 From 6724526807039eaee2b5ee6997703ded3ec3113e Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 16:36:30 -0400 Subject: [PATCH 08/28] Changes --- src/caller/message/scheduling.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs index 29f310a..089f1a9 100644 --- a/src/caller/message/scheduling.rs +++ b/src/caller/message/scheduling.rs @@ -41,7 +41,7 @@ pub mod response { } pub mod endpoint { - use crate::repo::scheduling as scheduling_repo; + use crate::repo::message::scheduling as scheduling_repo; /// Endpoint to create a Scheudled Message #[utoipa::path( -- 2.47.3 From fb512a0b14679d565e9b3071f1f2573af2a66a0c Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 16:37:08 -0400 Subject: [PATCH 09/28] Removed new line --- src/repo/message/event.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/repo/message/event.rs b/src/repo/message/event.rs index d1be4de..a8e6a19 100644 --- a/src/repo/message/event.rs +++ b/src/repo/message/event.rs @@ -109,4 +109,3 @@ async fn parse_row( user_id, }) } - -- 2.47.3 From e211fa7ff43a9034f3d7eb537dad46f0b693cfbe Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 16:41:27 -0400 Subject: [PATCH 10/28] Removing this file. Not yet --- src/caller/message/event.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/caller/message/event.rs diff --git a/src/caller/message/event.rs b/src/caller/message/event.rs deleted file mode 100644 index e69de29..0000000 -- 2.47.3 From cb81d0479f4121f15a684afeea64fbebb3b95163 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 17:10:29 -0400 Subject: [PATCH 11/28] Adding code for create sme --- src/caller/message/scheduling.rs | 114 ++++++++++++++++++++++++++++++- src/repo/message/scheduling.rs | 105 ++++++++++++++++++++++++++++ 2 files changed, 218 insertions(+), 1 deletion(-) diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs index 089f1a9..94f0c7f 100644 --- a/src/caller/message/scheduling.rs +++ b/src/caller/message/scheduling.rs @@ -21,6 +21,19 @@ pub mod request { pub id: Option, pub user_id: Option, } + + #[derive(Debug, Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)] + pub struct CreateScheduleMessageEventRequest { + pub contact_id: uuid::Uuid, + pub message_id: uuid::Uuid, + pub scheduled_message_id: uuid::Uuid, + } + + impl CreateScheduleMessageEventRequest { + pub fn is_valid(&self) -> bool { + !self.contact_id.is_nil() || !self.message_id.is_nil() || !self.scheduled_message_id.is_nil() + } + } } pub mod response { @@ -38,10 +51,18 @@ pub mod response { pub message: String, pub data: Vec, } + + #[derive(Debug, Default, Deserialize, Serialize, ToSchema)] + pub struct CreateScheduleMessageEventResponse { + pub message: String, + pub data: Vec, + } } pub mod endpoint { - use crate::repo::message::scheduling as scheduling_repo; + use crate::repo::message as message_repo; + use message_repo::scheduling as scheduling_repo; + use crate::repo::contact as contact_repo; /// Endpoint to create a Scheudled Message #[utoipa::path( @@ -174,4 +195,95 @@ pub mod endpoint { scheduled_time .is_some_and(|t| t - time::OffsetDateTime::now_utc() >= time::Duration::minutes(10)) } + + + /// Endpoint to create a Scheudled Message Event + #[utoipa::path( + post, + path = crate::caller::endpoints::CREATE_SCHEDULED_MESSAGE_EVENT, + request_body( + content = super::request::CreateScheduleMessageEventRequest, + description = "Data needed to create a Scheduled Message Event", + content_type = "application/json" + ), + responses( + (status = 201, description = "Scheduled Message Event created", body = super::response::CreateScheduleMessageEventResponse), + (status = 400, description = "Error", body = super::response::CreateScheduleMessageEventResponse), + (status = 500, description = "Error creating Scheduled Message Event", body = super::response::CreateScheduleMessageEventResponse) + ) +)] + pub async fn create_scheduled_message_event( + axum::Extension(pool): axum::Extension, + axum::Json(payload): axum::Json, + ) -> ( + axum::http::StatusCode, + axum::Json, + ) { + let mut response = super::response::CreateScheduleMessageEventResponse::default(); + + if payload.is_valid() { + match scheduling_repo::get(&pool, &payload.scheduled_message_id).await { + Ok(_) => { } + Err(err) => { + eprintln!("Error: {err:?}"); + response.message = String::from("Scheduled Message does not exist"); + return ( + axum::http::StatusCode::BAD_REQUEST, + axum::Json(response), + ); + } + } + + match contact_repo::get(&pool, &payload.contact_id).await { + Ok(_) => { } + Err(err) => { + eprintln!("Error: {err:?}"); + response.message = String::from("Contact does not exist"); + return ( + axum::http::StatusCode::BAD_REQUEST, + axum::Json(response), + ); + } + } + + match message_repo::get(&pool, &payload.message_id).await { + Ok(_) => { } + Err(err) => { + eprintln!("Error: {err:?}"); + response.message = String::from("Contact does not exist"); + return ( + axum::http::StatusCode::BAD_REQUEST, + axum::Json(response), + ); + } + } + + let mut scme = textsender_models::message::scheduling::ScheduledMessageEvent { + contact_id: payload.contact_id, + message_id: payload.message_id, + scheduled_message_id: payload.scheduled_message_id, + ..Default::default() + }; + match scheduling_repo::sched_msg_event::insert(&pool, &scme).await { + Ok((id, created)) => { + scme.id = id; + scme.created = Some(created); + response.message = String::from(super::super::super::response::SUCCESSFUL); + response.data.push(scme); + (axum::http::StatusCode::CREATED, axum::Json(response)) + } + Err(err) => { + eprintln!("Error: {err:?}"); + response.message = String::from("Error inserting"); + ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(response), + ) + } + } + } else { + response.message = String::from("Request body is not valid"); + (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) + } + } } diff --git a/src/repo/message/scheduling.rs b/src/repo/message/scheduling.rs index 97af52c..674d065 100644 --- a/src/repo/message/scheduling.rs +++ b/src/repo/message/scheduling.rs @@ -101,3 +101,108 @@ async fn parse_row( user_id, }) } + +pub mod sched_msg_event { + use sqlx::Row; + + pub async fn insert( + pool: &sqlx::PgPool, + scheduled_message_event: &textsender_models::message::scheduling::ScheduledMessageEvent, + ) -> Result<(uuid::Uuid, time::OffsetDateTime), sqlx::Error> { + match sqlx::query( + r#" + INSERT INTO "scheduled_message_events" (contact_id, message_id, scheduled_message_id) + VALUES($1, $2, $3) RETURNING id, created; + "#, + ) + .bind(&scheduled_message_event.contact_id) + .bind(&scheduled_message_event.message_id) + .bind(&scheduled_message_event.scheduled_message_id) + .fetch_one(pool) + .await + { + Ok(row) => { + let id: uuid::Uuid = row.try_get("id")?; + let created: time::OffsetDateTime = row.try_get("created")?; + Ok((id, created)) + } + Err(_) => Err(sqlx::Error::RowNotFound), + } + } + + pub async fn get( + pool: &sqlx::PgPool, + id: &uuid::Uuid, + ) -> Result { + match sqlx::query( + r#" + SELECT id, contact_id, message_id, scheduled_message_id, created FROM "scheduled_message_events" + WHERE + id = $1; + "#, + ) + .bind(id) + .fetch_one(pool) + .await + { + Ok(row) => match parse_row(&row).await { + Ok(scheduled_message_event) => Ok(scheduled_message_event), + Err(err) => Err(err), + }, + Err(_) => Err(sqlx::Error::RowNotFound), + } + } + + pub async fn get_with_scheduled_message_id( + pool: &sqlx::PgPool, + scheduled_message_id: &uuid::Uuid, + ) -> Result, sqlx::Error> { + match sqlx::query( + r#" + SELECT id, contact_id, message_id, scheduled_message_id, created FROM "scheduled_message_events" + WHERE + scheduled_message_id = $1; + "#, + ) + .bind(&scheduled_message_id) + .fetch_all(pool) + .await + { + Ok(rows) => { + let mut scheduled_message_events: Vec = + Vec::new(); + for row in rows { + match parse_row(&row).await { + Ok(scheduled_message_event) => { + scheduled_message_events.push(scheduled_message_event); + } + Err(err) => { + return Err(err); + } + } + } + + Ok(scheduled_message_events) + } + Err(_) => Err(sqlx::Error::RowNotFound), + } + } + + async fn parse_row( + row: &sqlx::postgres::PgRow, + ) -> Result { + let id: uuid::Uuid = row.try_get("id")?; + let contact_id: uuid::Uuid = row.try_get("contact_id")?; + let message_id: uuid::Uuid = row.try_get("message_id")?; + let scheduled_message_id: uuid::Uuid = row.try_get("scheduled_message_id")?; + let created: time::OffsetDateTime = row.try_get("created")?; + + Ok(textsender_models::message::scheduling::ScheduledMessageEvent { + id, + contact_id, + message_id, + scheduled_message_id, + created: Some(created), + }) + } +} -- 2.47.3 From 06c156738451f12e274b6375221d71231717bae8 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 17:11:05 -0400 Subject: [PATCH 12/28] cargo fmt --- src/caller/message/scheduling.rs | 52 ++++++++++++++------------------ src/repo/message/scheduling.rs | 19 +++++++----- 2 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs index 94f0c7f..5604f67 100644 --- a/src/caller/message/scheduling.rs +++ b/src/caller/message/scheduling.rs @@ -31,7 +31,9 @@ pub mod request { impl CreateScheduleMessageEventRequest { pub fn is_valid(&self) -> bool { - !self.contact_id.is_nil() || !self.message_id.is_nil() || !self.scheduled_message_id.is_nil() + !self.contact_id.is_nil() + || !self.message_id.is_nil() + || !self.scheduled_message_id.is_nil() } } } @@ -60,9 +62,9 @@ pub mod response { } pub mod endpoint { + use crate::repo::contact as contact_repo; use crate::repo::message as message_repo; use message_repo::scheduling as scheduling_repo; - use crate::repo::contact as contact_repo; /// Endpoint to create a Scheudled Message #[utoipa::path( @@ -196,7 +198,6 @@ pub mod endpoint { .is_some_and(|t| t - time::OffsetDateTime::now_utc() >= time::Duration::minutes(10)) } - /// Endpoint to create a Scheudled Message Event #[utoipa::path( post, @@ -223,38 +224,29 @@ pub mod endpoint { if payload.is_valid() { match scheduling_repo::get(&pool, &payload.scheduled_message_id).await { - Ok(_) => { } + Ok(_) => {} Err(err) => { - eprintln!("Error: {err:?}"); - response.message = String::from("Scheduled Message does not exist"); - return ( - axum::http::StatusCode::BAD_REQUEST, - axum::Json(response), - ); + eprintln!("Error: {err:?}"); + response.message = String::from("Scheduled Message does not exist"); + return (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)); } } match contact_repo::get(&pool, &payload.contact_id).await { - Ok(_) => { } + Ok(_) => {} Err(err) => { - eprintln!("Error: {err:?}"); - response.message = String::from("Contact does not exist"); - return ( - axum::http::StatusCode::BAD_REQUEST, - axum::Json(response), - ); + eprintln!("Error: {err:?}"); + response.message = String::from("Contact does not exist"); + return (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)); } } match message_repo::get(&pool, &payload.message_id).await { - Ok(_) => { } + Ok(_) => {} Err(err) => { - eprintln!("Error: {err:?}"); - response.message = String::from("Contact does not exist"); - return ( - axum::http::StatusCode::BAD_REQUEST, - axum::Json(response), - ); + eprintln!("Error: {err:?}"); + response.message = String::from("Contact does not exist"); + return (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)); } } @@ -273,12 +265,12 @@ pub mod endpoint { (axum::http::StatusCode::CREATED, axum::Json(response)) } Err(err) => { - eprintln!("Error: {err:?}"); - response.message = String::from("Error inserting"); - ( - axum::http::StatusCode::INTERNAL_SERVER_ERROR, - axum::Json(response), - ) + eprintln!("Error: {err:?}"); + response.message = String::from("Error inserting"); + ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(response), + ) } } } else { diff --git a/src/repo/message/scheduling.rs b/src/repo/message/scheduling.rs index 674d065..9c688b2 100644 --- a/src/repo/message/scheduling.rs +++ b/src/repo/message/scheduling.rs @@ -156,7 +156,8 @@ pub mod sched_msg_event { pub async fn get_with_scheduled_message_id( pool: &sqlx::PgPool, scheduled_message_id: &uuid::Uuid, - ) -> Result, sqlx::Error> { + ) -> Result, sqlx::Error> + { match sqlx::query( r#" SELECT id, contact_id, message_id, scheduled_message_id, created FROM "scheduled_message_events" @@ -197,12 +198,14 @@ pub mod sched_msg_event { let scheduled_message_id: uuid::Uuid = row.try_get("scheduled_message_id")?; let created: time::OffsetDateTime = row.try_get("created")?; - Ok(textsender_models::message::scheduling::ScheduledMessageEvent { - id, - contact_id, - message_id, - scheduled_message_id, - created: Some(created), - }) + Ok( + textsender_models::message::scheduling::ScheduledMessageEvent { + id, + contact_id, + message_id, + scheduled_message_id, + created: Some(created), + }, + ) } } -- 2.47.3 From b2432013027bd83aef42331a4babbbf5621ae0e9 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 17:19:14 -0400 Subject: [PATCH 13/28] Making endpoint available --- src/config/mod.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config/mod.rs b/src/config/mod.rs index ce2e588..6cb9a0d 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -136,6 +136,12 @@ pub mod init { axum::middleware::from_fn(crate::auth::auth::), ), ) + .route( + crate::caller::endpoints::CREATE_SCHEDULED_MESSAGE_EVENT, + post(scheduling_endpoints::create_scheduled_message_event).route_layer( + axum::middleware::from_fn(crate::auth::auth::), + ), + ) .layer(cors::configure_cors().await) } -- 2.47.3 From abe54bfe633449c769e9c005fa21db1c02a5418a Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 17:20:08 -0400 Subject: [PATCH 14/28] Removing common-multipart-rfc7578 crate --- Cargo.lock | 51 +++++++-------------------------------------------- Cargo.toml | 2 +- 2 files changed, 8 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b600799..53961a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -204,22 +204,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "common-multipart-rfc7578" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f08d53b5e0c302c5830cfa7511ba0edc3f241c691a95c0d184dfb761e11a6cc2" -dependencies = [ - "bytes", - "futures-core", - "futures-util", - "http", - "mime", - "mime_guess", - "rand", - "thiserror 1.0.69", -] - [[package]] name = "concurrent-queue" version = "2.5.0" @@ -1075,7 +1059,7 @@ dependencies = [ "regex", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror", "time", ] @@ -1982,7 +1966,7 @@ checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.18", + "thiserror", "time", ] @@ -2071,7 +2055,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror 2.0.18", + "thiserror", "time", "tokio", "tokio-stream", @@ -2155,7 +2139,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.18", + "thiserror", "time", "tracing", "uuid", @@ -2194,7 +2178,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.18", + "thiserror", "time", "tracing", "uuid", @@ -2220,7 +2204,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.18", + "thiserror", "time", "tracing", "url", @@ -2297,7 +2281,6 @@ version = "0.1.11" dependencies = [ "axum", "axum-extra", - "common-multipart-rfc7578", "futures", "josekit", "jsonwebtoken", @@ -2333,33 +2316,13 @@ dependencies = [ "uuid", ] -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - [[package]] name = "thiserror" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "thiserror-impl", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c11c93b..7c86886 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,6 @@ utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] } textsender_models = { git = "ssh://git@git.kundeng.us/phoenix/textsender_models.git", tag = "v0.4.1-29-ad632fca16-111" } [dev-dependencies] -common-multipart-rfc7578 = { version = "0.7.0" } +# common-multipart-rfc7578 = { version = "0.7.0" } url = { version = "2.5.8" } tempfile = { version = "3.27.0" } -- 2.47.3 From c0273615a9c12a3926cb0907f907967f315870b1 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 17:21:34 -0400 Subject: [PATCH 15/28] Cargo.toml cleanup --- Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 7c86886..42bee92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,5 @@ utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] } textsender_models = { git = "ssh://git@git.kundeng.us/phoenix/textsender_models.git", tag = "v0.4.1-29-ad632fca16-111" } [dev-dependencies] -# common-multipart-rfc7578 = { version = "0.7.0" } url = { version = "2.5.8" } tempfile = { version = "3.27.0" } -- 2.47.3 From 8c06dc7d7bfa7e3ffb4a8f339e182c08b632c3a6 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 17:50:56 -0400 Subject: [PATCH 16/28] Added test --- tests/test.rs | 134 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 124 insertions(+), 10 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index 0660fee..a447b4b 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -1,6 +1,3 @@ -// use std::io::Write; - -// use common_multipart_rfc7578::client::multipart::{Body as MultipartBody, Form as MultipartForm}; use textsender_api::db; mod db_mgr { @@ -178,6 +175,19 @@ pub async fn test_token() -> Result { } } +pub fn test_valid_schedulable_time() -> time::OffsetDateTime { + let now = time::OffsetDateTime::now_utc(); + now + std::time::Duration::from_secs(60 * 60) +} + +pub fn convert_time_to_iso(time: time::OffsetDateTime) -> Result { + use time::format_description::well_known::Iso8601; + match time.format(&Iso8601::DEFAULT) { + Ok(converted) => Ok(converted), + Err(err) => Err(err), + } +} + pub async fn bearer_auth() -> String { let token = match test_token().await { Ok(access_token) => access_token, @@ -191,9 +201,6 @@ pub async fn bearer_auth() -> String { } mod request { - // use common_multipart_rfc7578::client::multipart::{ - // Body as MultipartBody, Form as MultipartForm, - // }; use tower::ServiceExt; pub async fn create_contact( @@ -317,15 +324,13 @@ mod request { } pub mod scheduling { - use time::format_description::well_known::Iso8601; use tower::ServiceExt; pub async fn create_scheduled_message( app: &axum::Router, ) -> Result { - let now = time::OffsetDateTime::now_utc(); - let scheduled = now + std::time::Duration::from_secs(60 * 60); - let scheduled = match scheduled.format(&Iso8601::DEFAULT) { + let scheduled = super::super::super::test_valid_schedulable_time(); + let scheduled = match super::super::super::convert_time_to_iso(scheduled) { Ok(t) => t, Err(err) => { assert!(false, "Error: {err:?}"); @@ -373,6 +378,34 @@ mod request { Err(err) => Err(err), } } + + pub async fn create_scheduled_message_event( + app: &axum::Router, + contact_id: &uuid::Uuid, + message_id: &uuid::Uuid, + scheduled_message_id: &uuid::Uuid, + ) -> Result { + let payload = serde_json::json!({ + "contact_id": contact_id, + "message_id": message_id, + "scheduled_message_id": scheduled_message_id + }); + + match super::super::run_post( + Some(&payload), + textsender_api::caller::endpoints::CREATE_SCHEDULED_MESSAGE_EVENT, + axum::http::Method::POST, + true, + ) + .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), + } + } } } @@ -687,3 +720,84 @@ async fn test_get_scheduled_message() { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } + +#[tokio::test] +async fn test_create_scheduled_message() { + 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(); + + use textsender_api::repo; + + let mut contact = textsender_models::contact::Contact { + phone_number: String::from(TEST_CONTACT_PHONE_NUMBER), + ..Default::default() + }; + match repo::contact::insert(&tm_pool, &contact).await { + Ok(id) => { + contact.id = Some(id); + contact_id = id; + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + + let mut message = textsender_models::message::Message { + content: String::from(TEST_MESSAGE_CONTENT), + ..Default::default() + }; + match repo::message::insert(&tm_pool, &message, &TEST_USER_ID).await { + Ok(id) => { + message.id = Some(id); + message_id = id; + } + Err(err) => { + assert!(false, "Error {err:?}"); + } + } + + let scheduled_time = test_valid_schedulable_time(); + let mut scheduled_message = textsender_models::message::scheduling::ScheduledMessage { + scheduled: Some(scheduled_time), + status: String::from(textsender_models::message::scheduling::PENDING), + user_id: TEST_USER_ID, + ..Default::default() + }; + + match repo::message::scheduling::insert(&tm_pool, &scheduled_message, &TEST_USER_ID).await { + Ok((id, created)) => { + scheduled_message.id = id; + scheduled_message_id = id; + scheduled_message.created = Some(created); + } + 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::GetScheduledMessageResponse, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + + let _ = db_mgr::drop_database(&tm_pool, &db_name).await; +} -- 2.47.3 From b2dd5fdadfe2f1d6ba03c183caecd6fee07f35e5 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 17:54:15 -0400 Subject: [PATCH 17/28] TEst fix --- tests/test.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test.rs b/tests/test.rs index a447b4b..ecdb687 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -734,6 +734,7 @@ async fn test_create_scheduled_message() { let mut contact = textsender_models::contact::Contact { phone_number: String::from(TEST_CONTACT_PHONE_NUMBER), + user_id: Some(TEST_USER_ID), ..Default::default() }; match repo::contact::insert(&tm_pool, &contact).await { -- 2.47.3 From 3dc4786a309b905decc4865474878757caa5922b Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 17:56:15 -0400 Subject: [PATCH 18/28] Maybe --- tests/test.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test.rs b/tests/test.rs index ecdb687..8723bb7 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -734,6 +734,9 @@ async fn test_create_scheduled_message() { let mut contact = textsender_models::contact::Contact { phone_number: String::from(TEST_CONTACT_PHONE_NUMBER), + firstname: Some(String::from("Billy")), + lastname: Some(String::from("TheKid")), + nickname: Some(String::from("billbill9")), user_id: Some(TEST_USER_ID), ..Default::default() }; -- 2.47.3 From 1ec248633fa3c1c05b4c915c2373f38ebb1e5e3d Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 18:02:02 -0400 Subject: [PATCH 19/28] Test changes --- tests/test.rs | 70 +++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 42 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index 8723bb7..4bbeeae 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -661,8 +661,6 @@ async fn test_schedule_message() { match request::message::scheduling::create_scheduled_message(&app).await { Ok(response) => { - eprintln!("Response: {response:?}"); - println!("Response: {response:?}"); let resp = util::get_resp_data::< textsender_api::caller::message::scheduling::response::ScheduleMessageResponse, >(response) @@ -686,8 +684,6 @@ async fn test_get_scheduled_message() { match request::message::scheduling::create_scheduled_message(&app).await { Ok(response) => { - eprintln!("Response: {response:?}"); - println!("Response: {response:?}"); let resp = util::get_resp_data::< textsender_api::caller::message::scheduling::response::ScheduleMessageResponse, >(response) @@ -730,53 +726,43 @@ async fn test_create_scheduled_message() { let mut message_id: uuid::Uuid = uuid::Uuid::nil(); let mut scheduled_message_id: uuid::Uuid = uuid::Uuid::nil(); - use textsender_api::repo; - - let mut contact = textsender_models::contact::Contact { - phone_number: String::from(TEST_CONTACT_PHONE_NUMBER), - firstname: Some(String::from("Billy")), - lastname: Some(String::from("TheKid")), - nickname: Some(String::from("billbill9")), - user_id: Some(TEST_USER_ID), - ..Default::default() - }; - match repo::contact::insert(&tm_pool, &contact).await { - Ok(id) => { - contact.id = Some(id); - contact_id = id; + 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:?}"); + assert!(false, "Error: {:?}", err); } - } - - let mut message = textsender_models::message::Message { - content: String::from(TEST_MESSAGE_CONTENT), - ..Default::default() }; - match repo::message::insert(&tm_pool, &message, &TEST_USER_ID).await { - Ok(id) => { - message.id = Some(id); - message_id = id; + + 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:?}"); + assert!(false, "Error: {:?}", err); } - } - - let scheduled_time = test_valid_schedulable_time(); - let mut scheduled_message = textsender_models::message::scheduling::ScheduledMessage { - scheduled: Some(scheduled_time), - status: String::from(textsender_models::message::scheduling::PENDING), - user_id: TEST_USER_ID, - ..Default::default() }; - match repo::message::scheduling::insert(&tm_pool, &scheduled_message, &TEST_USER_ID).await { - Ok((id, created)) => { - scheduled_message.id = id; - scheduled_message_id = id; - scheduled_message.created = Some(created); + 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:?}"); -- 2.47.3 From 45c80e7a2f7963e5a477408b288213f318849fe8 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 18:04:15 -0400 Subject: [PATCH 20/28] Is it this? --- tests/test.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test.rs b/tests/test.rs index 4bbeeae..87853b1 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -769,6 +769,7 @@ async fn test_create_scheduled_message() { } } + /* match request::message::scheduling::create_scheduled_message_event( &app, &contact_id, @@ -788,6 +789,7 @@ async fn test_create_scheduled_message() { assert!(false, "Error: {err:?}"); } } + */ let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } -- 2.47.3 From 4b5062795870a35dda91e986886824fc9c7c6c9e Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 18:04:56 -0400 Subject: [PATCH 21/28] Whoops --- tests/test.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index 87853b1..656dee4 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -722,9 +722,9 @@ async fn test_create_scheduled_message() { 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(); + // 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) => { @@ -733,7 +733,7 @@ async fn test_create_scheduled_message() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - contact_id = resp.data[0].id.unwrap(); + // contact_id = resp.data[0].id.unwrap(); } Err(err) => { assert!(false, "Error: {:?}", err); @@ -747,8 +747,8 @@ async fn test_create_scheduled_message() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - let message = &resp.data[0]; - message_id = message.id.unwrap(); + // let message = &resp.data[0]; + // message_id = message.id.unwrap(); } Err(err) => { assert!(false, "Error: {:?}", err); @@ -762,7 +762,7 @@ async fn test_create_scheduled_message() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - scheduled_message_id = resp.data[0].id; + // scheduled_message_id = resp.data[0].id; } Err(err) => { assert!(false, "Error: {err:?}"); -- 2.47.3 From 82bc1ccfcd1fd0daaf05aa61117ffb80a78bb8f4 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 18:08:14 -0400 Subject: [PATCH 22/28] Adding this back --- tests/test.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index 656dee4..4bbeeae 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -722,9 +722,9 @@ async fn test_create_scheduled_message() { 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(); + 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) => { @@ -733,7 +733,7 @@ async fn test_create_scheduled_message() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - // contact_id = resp.data[0].id.unwrap(); + contact_id = resp.data[0].id.unwrap(); } Err(err) => { assert!(false, "Error: {:?}", err); @@ -747,8 +747,8 @@ async fn test_create_scheduled_message() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - // let message = &resp.data[0]; - // message_id = message.id.unwrap(); + let message = &resp.data[0]; + message_id = message.id.unwrap(); } Err(err) => { assert!(false, "Error: {:?}", err); @@ -762,14 +762,13 @@ async fn test_create_scheduled_message() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - // scheduled_message_id = resp.data[0].id; + scheduled_message_id = resp.data[0].id; } Err(err) => { assert!(false, "Error: {err:?}"); } } - /* match request::message::scheduling::create_scheduled_message_event( &app, &contact_id, @@ -789,7 +788,6 @@ async fn test_create_scheduled_message() { assert!(false, "Error: {err:?}"); } } - */ let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } -- 2.47.3 From 07c9a0202150bf1529eac32d6db0847e5d999a70 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 18:14:50 -0400 Subject: [PATCH 23/28] Saving changes --- src/repo/message/event.rs | 10 +++++----- src/repo/message/scheduling.rs | 8 ++++---- tests/test.rs | 12 ++++++++---- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/repo/message/event.rs b/src/repo/message/event.rs index a8e6a19..c5898c6 100644 --- a/src/repo/message/event.rs +++ b/src/repo/message/event.rs @@ -10,12 +10,12 @@ pub async fn insert( VALUES($1, $2, $3, $4, $5, $6, $7) RETURNING id; "#, ) - .bind(&event.scheduled_message_event_id) + .bind(event.scheduled_message_event_id) .bind(&event.response) - .bind(&event.user_id) - .bind(&event.sent) - .bind(&event.contact_id) - .bind(&event.message_id) + .bind(event.user_id) + .bind(event.sent) + .bind(event.contact_id) + .bind(event.message_id) .bind(&event.status) .fetch_one(pool) .await diff --git a/src/repo/message/scheduling.rs b/src/repo/message/scheduling.rs index 9c688b2..246a9c9 100644 --- a/src/repo/message/scheduling.rs +++ b/src/repo/message/scheduling.rs @@ -115,9 +115,9 @@ pub mod sched_msg_event { VALUES($1, $2, $3) RETURNING id, created; "#, ) - .bind(&scheduled_message_event.contact_id) - .bind(&scheduled_message_event.message_id) - .bind(&scheduled_message_event.scheduled_message_id) + .bind(scheduled_message_event.contact_id) + .bind(scheduled_message_event.message_id) + .bind(scheduled_message_event.scheduled_message_id) .fetch_one(pool) .await { @@ -165,7 +165,7 @@ pub mod sched_msg_event { scheduled_message_id = $1; "#, ) - .bind(&scheduled_message_id) + .bind(scheduled_message_id) .fetch_all(pool) .await { diff --git a/tests/test.rs b/tests/test.rs index 4bbeeae..1b644c4 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -379,6 +379,7 @@ mod request { } } + /* pub async fn create_scheduled_message_event( app: &axum::Router, contact_id: &uuid::Uuid, @@ -406,6 +407,7 @@ mod request { Err(err) => Err(err), } } + */ } } @@ -722,9 +724,9 @@ async fn test_create_scheduled_message() { 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(); + // 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) => { @@ -733,12 +735,13 @@ async fn test_create_scheduled_message() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - contact_id = resp.data[0].id.unwrap(); + // contact_id = resp.data[0].id.unwrap(); } Err(err) => { assert!(false, "Error: {:?}", err); } }; + /* match request::message::create_message(&app).await { Ok(response) => { @@ -788,6 +791,7 @@ async fn test_create_scheduled_message() { assert!(false, "Error: {err:?}"); } } + */ let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } -- 2.47.3 From a49a7e07c0ef7612f64fef8aeee0d6ced68c15d4 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 18:16:53 -0400 Subject: [PATCH 24/28] Good --- tests/test.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index 1b644c4..66172fd 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -720,7 +720,7 @@ async fn test_get_scheduled_message() { } #[tokio::test] -async fn test_create_scheduled_message() { +async fn test_create_scheduled_message_event() { let (tm_pool, db_name, pool) = db_mgr::get_database_ready().await; let app = init::app(pool).await; @@ -741,7 +741,6 @@ async fn test_create_scheduled_message() { assert!(false, "Error: {:?}", err); } }; - /* match request::message::create_message(&app).await { Ok(response) => { @@ -750,14 +749,15 @@ async fn test_create_scheduled_message() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - let message = &resp.data[0]; - message_id = message.id.unwrap(); + // 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::< -- 2.47.3 From 5e38e1beef6c3ca4410cb14d4732285e58896d23 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 18:25:06 -0400 Subject: [PATCH 25/28] Updated testing --- tests/test.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index 66172fd..1e43a7c 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -757,7 +757,6 @@ async fn test_create_scheduled_message_event() { } }; - /* match request::message::scheduling::create_scheduled_message(&app).await { Ok(response) => { let resp = util::get_resp_data::< @@ -765,13 +764,14 @@ async fn test_create_scheduled_message_event() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - scheduled_message_id = resp.data[0].id; + // scheduled_message_id = resp.data[0].id; } Err(err) => { assert!(false, "Error: {err:?}"); } } + /* match request::message::scheduling::create_scheduled_message_event( &app, &contact_id, -- 2.47.3 From c1aa41b65c5a7ea26002042ec0d394f4f39af787 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 18:29:09 -0400 Subject: [PATCH 26/28] Adding this back --- tests/test.rs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index 1e43a7c..a6c2c47 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -379,7 +379,6 @@ mod request { } } - /* pub async fn create_scheduled_message_event( app: &axum::Router, contact_id: &uuid::Uuid, @@ -392,6 +391,8 @@ mod request { "scheduled_message_id": scheduled_message_id }); + println!("Payload: {payload:?}"); + match super::super::run_post( Some(&payload), textsender_api::caller::endpoints::CREATE_SCHEDULED_MESSAGE_EVENT, @@ -407,7 +408,6 @@ mod request { Err(err) => Err(err), } } - */ } } @@ -724,9 +724,9 @@ async fn test_create_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(); + 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) => { @@ -735,7 +735,7 @@ async fn test_create_scheduled_message_event() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - // contact_id = resp.data[0].id.unwrap(); + contact_id = resp.data[0].id.unwrap(); } Err(err) => { assert!(false, "Error: {:?}", err); @@ -749,8 +749,8 @@ async fn test_create_scheduled_message_event() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - // let message = &resp.data[0]; - // message_id = message.id.unwrap(); + let message = &resp.data[0]; + message_id = message.id.unwrap(); } Err(err) => { assert!(false, "Error: {:?}", err); @@ -764,14 +764,13 @@ async fn test_create_scheduled_message_event() { >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - // scheduled_message_id = resp.data[0].id; + scheduled_message_id = resp.data[0].id; } Err(err) => { assert!(false, "Error: {err:?}"); } } - /* match request::message::scheduling::create_scheduled_message_event( &app, &contact_id, @@ -791,7 +790,6 @@ async fn test_create_scheduled_message_event() { assert!(false, "Error: {err:?}"); } } - */ let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } -- 2.47.3 From feb3a78ed03a2dec15dee8ccec46f341fa8061c0 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 18:35:47 -0400 Subject: [PATCH 27/28] Fixing test --- tests/test.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test.rs b/tests/test.rs index a6c2c47..6d2b843 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -781,7 +781,7 @@ async fn test_create_scheduled_message_event() { { Ok(response) => { let resp = util::get_resp_data::< - textsender_api::caller::message::scheduling::response::GetScheduledMessageResponse, + textsender_api::caller::message::scheduling::response::CreateScheduleMessageEventResponse, >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); -- 2.47.3 From 673d7106961eabf9f016b7975355f4b1753ed5d0 Mon Sep 17 00:00:00 2001 From: phoenix Date: Thu, 18 Jun 2026 18:38:04 -0400 Subject: [PATCH 28/28] 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 53961a1..f342aea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2277,7 +2277,7 @@ dependencies = [ [[package]] name = "textsender_api" -version = "0.1.11" +version = "0.1.12" dependencies = [ "axum", "axum-extra", diff --git a/Cargo.toml b/Cargo.toml index 42bee92..253522b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "textsender_api" -version = "0.1.11" +version = "0.1.12" edition = "2024" rust-version = "1.96" -- 2.47.3