diff --git a/src/controller/mod.rs b/src/controller/mod.rs index df6df1a2a3c3ee7c538caba296b381784260470a..9107e7231500c57457faf4b812b97e29651cc862 100644 --- a/src/controller/mod.rs +++ b/src/controller/mod.rs @@ -6,7 +6,7 @@ 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]) }); } \ No newline at end of file diff --git a/src/controller/product.rs b/src/controller/product.rs index 1cc538419d9a5a7f6b73e520417c04426fefbb3b..9e976c8d02b4402b3e28c128e634a3b7795ac929 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) + }; +} \ No newline at end of file diff --git a/src/service/product.rs b/src/service/product.rs index 775bf09d1d171391547c61071a0f17c976131036..44424d033c8c87745b0178fc53a014ac23e72110 100644 --- a/src/service/product.rs +++ b/src/service/product.rs @@ -5,6 +5,8 @@ use bambangshop::{Result, compose_error_response}; use crate::model::product::Product; use crate::repository::product::ProductRepository; +use super::notification::NotificationService; + pub struct ProductService; impl ProductService { @@ -42,4 +44,20 @@ impl ProductService { return Ok(Json::from(product)); } + + pub fn publish(id: usize) -> Result<Product> { + let product_opt = 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_opt.unwrap(); + + NotificationService.notify(&product.product_type, "PROMOTION", product.clone()); + + return Ok(product); + } }