From 208ebe5b9590d45b0d8a943de0f4059307ea584a Mon Sep 17 00:00:00 2001 From: raja <rafaelraja.sitorus@gmail.com> Date: Fri, 28 Mar 2025 21:45:07 +0800 Subject: [PATCH] Implement subscribe function in Notification service. --- src/service/notification.rs | 61 ++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/src/service/notification.rs b/src/service/notification.rs index 9c57880..843c426 100644 --- a/src/service/notification.rs +++ b/src/service/notification.rs @@ -1,17 +1,50 @@ use std::thread; - use rocket::http::Status; - use rocket::log; +use rocket::http::Status; +use rocket::log; + +use rocket::serde::json::to_string; +use rocket::tokio; + +use bambangshop_receiver::{APP_CONFIG, REQWEST_CLIENT, Result, compose_error_response}; +use crate::model::notification::Notification; +use crate::model::subscriber::SubscriberRequest; +use crate::repository::notification::NotificationRepository; + +pub struct NotificationService; - use rocket::serde::json::to_string; - use rocket::tokio; - - use bambangshop_receiver::{APP_CONFIG, REQWEST_CLIENT, Result, compose_error_response}; - use crate::model::notification::Notification; - use crate::model::subscriber::SubscriberRequest; - use crate::repository::notification::NotificationRepository; - - pub struct NotificationService; - - impl NotificationService { - } \ No newline at end of file +impl NotificationService { + 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(); + } +} + +#[tokio::main] +async fn subscribe_request(product_type: String) -> Result<SubscriberRequest> { + let product_type_upper: String = product_type.to_uppercase(); + let product_type_str: &str = product_type_upper.as_str(); + let notification_receiver_url: String = format!("{}/receive", APP_CONFIG.get_instance_root_url()); + let payload: SubscriberRequest = SubscriberRequest { + name: APP_CONFIG.get_instance_name().to_string(), + url: notification_receiver_url, + }; + + let request_url: String = 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())), + }; +} \ No newline at end of file -- GitLab