diff --git a/Cargo.lock b/Cargo.lock index 0d306d5..712f8f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2277,7 +2277,7 @@ dependencies = [ [[package]] name = "textsender_api" -version = "0.1.16" +version = "0.1.17" dependencies = [ "axum", "axum-extra", diff --git a/Cargo.toml b/Cargo.toml index 17c693c..8f7388a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "textsender_api" -version = "0.1.16" +version = "0.1.17" edition = "2024" rust-version = "1.96" diff --git a/src/caller/message/event.rs b/src/caller/message/event.rs index 4341d07..5635d7c 100644 --- a/src/caller/message/event.rs +++ b/src/caller/message/event.rs @@ -25,6 +25,12 @@ pub mod request { || !self.message_id.is_nil() } } + + #[derive(Debug, Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)] + pub struct GetMessageEventResponseParams { + pub id: Option, + pub user_id: Option, + } } pub mod response { @@ -36,6 +42,8 @@ pub mod response { pub message: String, pub data: Vec, } + + pub use RecordMessageEventResponse as GetMERResponse; } pub mod endpoint { @@ -95,4 +103,65 @@ pub mod endpoint { (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) } } + + /// Endpoint to get Messages + #[utoipa::path( + get, + path = crate::caller::endpoints::GET_MESSAGE_EVENT_RESPONSE, + params( + ("id" = uuid::Uuid, Path, description = "Id of Message Event Response"), + ("user_id" = uuid::Uuid, Path, description = "User Id associated with the Message Event Response") + ), + responses( + (status = 200, description = "Message Event Response found", body = super::response::GetMERResponse), + (status = 400, description = "Error getting Message Event Response", body = super::response::GetMERResponse) + ) + )] + pub async fn get_record_message_event_response( + axum::Extension(pool): axum::Extension, + axum::extract::Query(params): axum::extract::Query< + super::request::GetMessageEventResponseParams, + >, + ) -> ( + axum::http::StatusCode, + axum::Json, + ) { + let mut response = super::response::GetMERResponse::default(); + + let messages = match params.id { + Some(id) => match event_repo::get(&pool, &id).await { + Ok(message) => { + vec![message] + } + Err(err) => { + eprintln!("Error: {err:?}"); + return ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(response), + ); + } + }, + None => match params.user_id { + Some(user_id) => match event_repo::get_with_user_id(&pool, &user_id).await { + Ok(messages) => messages, + Err(err) => { + eprintln!("Error: {err:?}"); + return ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(response), + ); + } + }, + None => { + response.message = String::from("Invalid parameter"); + return (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)); + } + }, + }; + + response.data = messages; + response.message = String::from(super::super::super::response::SUCCESSFUL); + + (axum::http::StatusCode::OK, axum::Json(response)) + } } diff --git a/src/caller/mod.rs b/src/caller/mod.rs index 91f3c45..f37aea0 100644 --- a/src/caller/mod.rs +++ b/src/caller/mod.rs @@ -31,6 +31,8 @@ pub mod endpoints { /// Constant for recording Message Event Response endpoint pub const RECORD_MESSAGE_EVENT_RESPONSE: &str = "/api/v1/schedule/message/event/response/record"; + /// Constant for getting Message Event Response endpoint + pub const GET_MESSAGE_EVENT_RESPONSE: &str = "/api/v1/schedule/message/event/response"; } pub mod response { diff --git a/src/config/mod.rs b/src/config/mod.rs index 7c2460c..4d34d4c 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -177,6 +177,12 @@ pub mod init { axum::middleware::from_fn(crate::auth::auth::), ), ) + .route( + crate::caller::endpoints::GET_MESSAGE_EVENT_RESPONSE, + get(event_endpoints::get_record_message_event_response).route_layer( + axum::middleware::from_fn(crate::auth::auth::), + ), + ) .layer(cors::configure_cors().await) } diff --git a/src/repo/message/event.rs b/src/repo/message/event.rs index fd77cc3..3022a99 100644 --- a/src/repo/message/event.rs +++ b/src/repo/message/event.rs @@ -96,7 +96,7 @@ async fn parse_row( let contact_id: uuid::Uuid = row.try_get("contact_id")?; let message_id: uuid::Uuid = row.try_get("message_id")?; let sent: time::OffsetDateTime = row.try_get("sent")?; - let scheduled_message_id: uuid::Uuid = row.try_get("scheduled_message_id")?; + let scheduled_message_event_id: uuid::Uuid = row.try_get("scheduled_message_event_id")?; let user_id: uuid::Uuid = row.try_get("user_id")?; Ok(textsender_models::message::event::MessageEventResponse { @@ -106,7 +106,7 @@ async fn parse_row( message_id, status, sent: Some(sent), - scheduled_message_event_id: scheduled_message_id, + scheduled_message_event_id, user_id, }) } diff --git a/tests/test.rs b/tests/test.rs index 1011a45..df7c426 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -391,6 +391,25 @@ mod request { Err(err) => Err(err), } } + + pub async fn get_message_event_response( + app: &axum::Router, + id: &uuid::Uuid, + ) -> Result { + let uri = format!( + "{}?id={}", + textsender_api::caller::endpoints::GET_MESSAGE_EVENT_RESPONSE, + id + ); + + match super::super::run_post(None, &uri, axum::http::Method::GET, 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), + } + } } pub mod scheduling { @@ -1481,3 +1500,153 @@ async fn test_record_message_event_response() { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } + +#[tokio::test] +async fn test_get_message_event_response() { + 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 scheduled_message_event_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"); + let scheduled_message_event = &resp.data[0]; + scheduled_message_event_id = scheduled_message_event.id; + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + + match request::message::scheduling::update_scheduled_message_status( + &app, + &scheduled_message_id, + textsender_models::message::scheduling::READY, + ) + .await + { + Ok(response) => { + let resp = util::get_resp_data::< + textsender_api::caller::message::scheduling::response::UpdateScheduledMessageStatusResponse, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + + match request::message::scheduling::fetch_scheduled_message(&app).await { + Ok(response) => { + let resp = util::get_resp_data::< + textsender_api::caller::message::scheduling::response::FetchScheduledMessageResponse, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + + assert_eq!( + false, + scheduled_message_event_id.is_nil(), + "Scheduled Message Event Id should not be empty" + ); + + match request::message::event::record_message_event_response( + &app, + &scheduled_message_event_id, + &TEST_USER_ID, + &contact_id, + &message_id, + ) + .await + { + Ok(response) => { + let resp = util::get_resp_data::< + textsender_api::caller::message::event::response::RecordMessageEventResponse, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + let mer = &resp.data[0]; + match request::message::event::get_message_event_response(&app, &mer.id).await { + Ok(response) => { + let resp = util::get_resp_data::< + textsender_api::caller::message::event::response::GetMERResponse, + >(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; +}