From 2734f4af1aaccd67cc72b44f10a2554444ef6390 Mon Sep 17 00:00:00 2001 From: phoenix Date: Sat, 20 Jun 2026 15:54:36 -0400 Subject: [PATCH] Adding code --- src/caller/instant.rs | 129 ++++++++++++++++++++++++++++++++++++++++++ src/caller/mod.rs | 1 + 2 files changed, 130 insertions(+) create mode 100644 src/caller/instant.rs diff --git a/src/caller/instant.rs b/src/caller/instant.rs new file mode 100644 index 0000000..afd86ca --- /dev/null +++ b/src/caller/instant.rs @@ -0,0 +1,129 @@ +pub mod request { + use serde::{Deserialize, Serialize}; + use utoipa::ToSchema; + + #[derive(Debug, Deserialize, Serialize, ToSchema)] + pub struct InstantMessageRequest { + pub contact_ids: Vec, + pub message_id: uuid::Uuid, + pub user_id: uuid::Uuid, + } + + impl InstantMessageRequest { + pub fn is_valid(&self) -> bool { + !self.contact_ids.is_empty() || !self.message_id.is_nil() || !self.user_id.is_nil() + } + } +} + +pub mod response { + use serde::{Deserialize, Serialize}; + use utoipa::ToSchema; + + #[derive(Debug, Default, Deserialize, Serialize, ToSchema)] + pub struct InstantMessageResponse { + pub message: String, + } +} + +pub mod endpoint { + use crate::repo::contact as contact_repo; + use crate::repo::message as message_repo; + + /// Endpoint to create Message + #[utoipa::path( + post, + path = super::super::endpoints::ADD_MESSAGE, + request_body( + content = super::request::InstantMessageRequest, + description = "Data needed to create a Message", + content_type = "application/json" + ), + responses( + (status = 201, description = "Message created", body = super::response::InstantMessageResponse), + (status = 400, description = "Error", body = super::response::InstantMessageResponse), + (status = 500, description = "Error creating Message", body = super::response::InstantMessageResponse) + ) +)] + pub async fn send_message( + axum::Extension(pool): axum::Extension, + axum::Json(payload): axum::Json, + ) -> ( + axum::http::StatusCode, + axum::Json, + ) { + let mut response = super::response::InstantMessageResponse::default(); + + if payload.is_valid() { + let mut contacts: Vec = Vec::new(); + + for contact_id in payload.contact_ids { + match contact_repo::get(&pool, &contact_id).await { + Ok(contact) => { + contacts.push(contact); + } + Err(err) => { + eprintln!("Error: {err:?}"); + response.message = String::from("Invalid"); + return ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(response), + ); + } + } + } + + if !contacts.is_empty() { + match message_repo::get(&pool, &payload.message_id).await { + Ok(message) => { + let t_config = textsender_models::config::auxiliary::TwilioConfig { + ..Default::default() + }; + let mut results: Vec = Vec::new(); + + for contact in contacts { + let pp = swoosh::twilio::types::Parameters { + schedule: false, + schedule_at: None, + }; + match swoosh::twilio::api::send_mssage( + &message, &contact, pp, &t_config, + ) + .await + { + Ok(result) => { + results.push(result); + } + Err(err) => { + eprintln!("Error: {err:?}"); + } + } + } + + if results.is_empty() { + eprintln!("Error sending"); + ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(response), + ) + } else { + response.message = String::from(super::super::response::SUCCESSFUL); + (axum::http::StatusCode::OK, axum::Json(response)) + } + } + Err(err) => { + eprintln!("Error: {err:?}"); + response.message = String::from("Request body is not valid"); + (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) + } + } + } else { + response.message = String::from("Request body is not valid"); + (axum::http::StatusCode::BAD_REQUEST, 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/caller/mod.rs b/src/caller/mod.rs index 214dbaa..8b747d6 100644 --- a/src/caller/mod.rs +++ b/src/caller/mod.rs @@ -1,4 +1,5 @@ pub mod contact; +pub mod instant; pub mod message; pub mod endpoints {