diff --git a/src/controller/mod.rs b/src/controller/mod.rs
index fe4a544b65cec3c65bedd9d1fa666dc986aff6f2..349f17e41c377cb868a56914743b2bb594243d07 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..680231497fe1fa9806fe8c4955de6381c6b36b20 100644
--- a/src/controller/product.rs
+++ b/src/controller/product.rs
@@ -37,3 +37,11 @@ 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..c928891bf872cf440bf4443a4d247dc885b847fc 100644
--- a/src/service/product.rs
+++ b/src/service/product.rs
@@ -1,10 +1,15 @@
+use std::ops::Not;
+
 use rocket::http::Status;
 use rocket::serde::json::Json;
 
 use bambangshop::{Result, compose_error_response};
+use crate::model::notification::Notification;
 use crate::model::product::Product;
 use crate::repository::product::ProductRepository;
 
+use super::notification::NotificationService;
+
 pub struct ProductService;
 
 impl ProductService {
@@ -42,4 +47,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);
+    }
 }