diff --git a/src/controller/mod.rs b/src/controller/mod.rs index fe4a544b65cec3c65bedd9d1fa666dc986aff6f2..9fd148310ac8bb957e2174bbf51210bb549783ce 100644 --- a/src/controller/mod.rs +++ b/src/controller/mod.rs @@ -6,7 +6,8 @@ use rocket::fairing::AdHoc; pub fn route_stage() -> AdHoc { return AdHoc::on_ignite("Initializing controller routes...", |rocket| async { rocket - .mount("/product", routes![product::create, product::list, product::read, product::delete]) + .mount("/product", routes![product::create, product::list, + product::read, product::delete, product::publish]) .mount("/notification", routes![notification::subscribe, notification::unsubscribe]) }); } diff --git a/src/controller/product.rs b/src/controller/product.rs index 1cc538419d9a5a7f6b73e520417c04426fefbb3b..b67edeefbf79d431b30d384416ec05071726c9c4 100644 --- a/src/controller/product.rs +++ b/src/controller/product.rs @@ -37,3 +37,12 @@ pub fn delete(id: usize) -> Result<Json<Product>> { Err(e) => Err(e) }; } + +#[post("/<id>/publish")] +pub fn publish(id: usize) -> Result<Json<Product>> { + return match ProductService::publish(id) { + Ok(f) => Ok(Json::from(f)), + Err(e) => Err(e) + }; +} + diff --git a/src/model/subscriber.rs b/src/model/subscriber.rs index da38175f78d58bf45b8e86a61732de14c85e03ce..4786d58d876e232c30ad4d43dca5bf6c446a67f7 100644 --- a/src/model/subscriber.rs +++ b/src/model/subscriber.rs @@ -15,12 +15,12 @@ pub struct Subscriber { impl Subscriber { #[tokio::main] pub async fn update(&self, payload: Notification) { - REQUEST_CLIENT + REQWEST_CLIENT .post(&self.url) .header("Content-Type", "JSON") .body(to_string(&payload).unwrap()) .send().await.ok(); - log::warn!("Sent {} notification of: [{}] {}, to: {}", + log::warn_!("Sent {} notification of: [{}] {}, to: {}", payload.status, payload.product_type, payload.product_title, self.url); } } diff --git a/src/service/product.rs b/src/service/product.rs index 775bf09d1d171391547c61071a0f17c976131036..5d4c2407efb0ec99fe7ffcc2cb59b6b7ecc50769 100644 --- a/src/service/product.rs +++ b/src/service/product.rs @@ -42,4 +42,18 @@ impl ProductService { return Ok(Json::from(product)); } + + pub fn publish(id: usize) -> Result<Product> { + let product_opt: Option<Product> = ProductRepository::get_by_id(id); + if product_opt.is_none() { + return Err(compose_error_response( + Status::NotFound, + String::from("Product not found.") + )); + } + let product: Product = product_opt.unwrap(); + NotificationService.notify(&product.product_type, "PROMOTION", product.clone()); + return Ok(product); + } + }