diff --git a/src/master/embedded/master.rs b/src/master/embedded/master.rs index a6c23ca..b5d3947 100644 --- a/src/master/embedded/master.rs +++ b/src/master/embedded/master.rs @@ -27,7 +27,7 @@ use tokio::sync::oneshot::channel; use super::counter::Counter; use crate::errors::*; -use crate::master::messages::{AddSite, AddVisitor, Rename}; +use crate::master::messages::{AddSite, AddVisitor, RemoveCaptcha, Rename}; use crate::master::Master as MasterTrait; /// This Actor manages the [Counter] actors. @@ -127,14 +127,10 @@ impl Handler for Master { impl Handler for Master { type Result = MessageResult; - fn handle(&mut self, m: Rename, ctx: &mut Self::Context) -> Self::Result { + fn handle(&mut self, m: Rename, _ctx: &mut Self::Context) -> Self::Result { self.rename(m); let (tx, rx) = channel(); - let fut = async move { - let _ = tx.send(Ok(())); - } - .into_actor(self); - ctx.spawn(fut); + let _ = tx.send(Ok(())); MessageResult(rx) } } @@ -176,7 +172,7 @@ impl Handler for Master { println!("{}", visitor_count); if visitor_count == 0 && new.is_some() { addr.send(Stop).await.unwrap(); - master.send(RemoveSite(id.to_owned())).await.unwrap(); + master.send(RemoveCaptcha(id.to_owned())).await.unwrap(); println!("cleaned up"); } } @@ -191,16 +187,14 @@ impl Handler for Master { } } -/// Message to delete [Counter] actor -#[derive(Message)] -#[rtype(result = "()")] -pub struct RemoveSite(pub String); +impl Handler for Master { + type Result = MessageResult; -impl Handler for Master { - type Result = (); - - fn handle(&mut self, m: RemoveSite, _ctx: &mut Self::Context) -> Self::Result { + fn handle(&mut self, m: RemoveCaptcha, _ctx: &mut Self::Context) -> Self::Result { + let (tx, rx) = channel(); self.rm_site(&m.0); + tx.send(Ok(())).unwrap(); + MessageResult(rx) } } @@ -266,5 +260,7 @@ mod tests { let mcaptcha_addr = addr.send(GetSite(new_id.into())).await.unwrap(); assert_eq!(mcaptcha_addr, None); + + assert!(addr.send(RemoveCaptcha(new_id.into())).await.is_ok()); } } diff --git a/src/master/mod.rs b/src/master/mod.rs index 02c89bc..2c3a96b 100644 --- a/src/master/mod.rs +++ b/src/master/mod.rs @@ -32,6 +32,7 @@ pub trait Master: + actix::Handler + actix::Handler + actix::Handler + + actix::Handler { } @@ -87,10 +88,16 @@ pub mod messages { pub mcaptcha: MCaptcha, } + /// Message to rename an MCaptcha actor #[derive(Message, Builder)] #[rtype(result = "Receiver>")] pub struct Rename { pub name: String, pub rename_to: String, } + + /// Message to delete [Counter] actor + #[derive(Message)] + #[rtype(result = "Receiver>")] + pub struct RemoveCaptcha(pub String); } diff --git a/src/master/redis/master.rs b/src/master/redis/master.rs index 3628ce9..b1ca82a 100644 --- a/src/master/redis/master.rs +++ b/src/master/redis/master.rs @@ -19,7 +19,7 @@ use actix::dev::*; use tokio::sync::oneshot; use crate::errors::*; -use crate::master::messages::{AddSite, AddVisitor, Rename}; +use crate::master::messages::{AddSite, AddVisitor, RemoveCaptcha, Rename}; use crate::master::Master as MasterTrait; use crate::redis::mcaptcha_redis::MCaptchaRedis; use crate::redis::RedisConfig; @@ -93,6 +93,23 @@ impl Handler for Master { } } +impl Handler for Master { + type Result = MessageResult; + + fn handle(&mut self, m: RemoveCaptcha, ctx: &mut Self::Context) -> Self::Result { + let (tx, rx) = oneshot::channel(); + + let con = self.redis.get_client(); + let fut = async move { + let res = con.delete_captcha(&m.0).await; + let _ = tx.send(res); + } + .into_actor(self); + ctx.wait(fut); + MessageResult(rx) + } +} + #[cfg(test)] mod tests { use super::*; @@ -150,6 +167,10 @@ mod tests { .build() .unwrap(); assert!(addr.send(rename).await.is_ok()); + assert!(addr + .send(RemoveCaptcha(RENAME_CAPTCHA_NAME.into())) + .await + .is_ok()); } #[actix_rt::test]