diff --git a/src/service/notification.rs b/src/service/notification.rs index 5a35cdbb996fddd318083459d4399802f0529e49..6dd7b84a4bdac24762e25b55df17ba52e9e6d2aa 100644 --- a/src/service/notification.rs +++ b/src/service/notification.rs @@ -1,5 +1,6 @@ use std::thread; +use reqwest::Request; use rocket::http::Status; use rocket::log; use rocket::serde::json::to_string; @@ -14,4 +15,40 @@ use crate::repository::notification::NotificationRepository; pub struct NotificationService; impl NotificationService { + #[tokio::main] + async fn subscribe_request(product_type: String) -> Result<SubscriberRequest> { + let product_type_upper = product_type.to_uppercase(); + let product_type_str = product_type_upper.as_str(); + + let notification_receiver_url = format!("{}/receive", APP_CONFIG.get_instance_root_url()); + + let payload = SubscriberRequest { + name: APP_CONFIG.get_instance_name().to_string(), + url: notification_receiver_url + }; + + let request_url = format!("{}/notification/subscribe/{}", APP_CONFIG.get_publisher_root_url(), product_type_str); + let request = REQWEST_CLIENT + .post(request_url.clone()) + .header("Content-Type", "application/json") + .header("Accept", "application/json") + .body(to_string(&payload).unwrap()) + .send().await; + + log::warn_!("Sent subscribe request to {}", request_url); + + return match request { + Ok(f) => match f.json::<SubscriberRequest>().await { + Ok(x) => Ok(x), + Err(y) => Err(compose_error_response(Status::NotAcceptable, + y.to_string())) + }, + Err(e) => Err(compose_error_response(Status::NotFound, e.to_string())) + } + } + + pub fn subscribe(product_type: &str) -> Result<SubscriberRequest> { + let product_type_clone = String::from(product_type); + return thread::spawn(move || Self::subscribe_request(product_type_clone)).join().unwrap(); + } } \ No newline at end of file