diff --git a/db/db-core/src/lib.rs b/db/db-core/src/lib.rs index ae46f70a..77c98eca 100644 --- a/db/db-core/src/lib.rs +++ b/db/db-core/src/lib.rs @@ -283,6 +283,12 @@ pub trait MCDatabase: std::marker::Send + std::marker::Sync + CloneSPDatabase { &self, psuedo_id: &str, ) -> DBResult; + + /// Delete all records for campaign + async fn analytics_delete_all_records_for_campaign( + &self, + campaign_id: &str, + ) -> DBResult<()>; } #[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq)] @@ -389,7 +395,6 @@ pub struct Secret { /// user's secret pub secret: String, } - /// Trait to clone MCDatabase pub trait CloneSPDatabase { /// clone DB diff --git a/db/db-core/src/tests.rs b/db/db-core/src/tests.rs index 777a6f09..eccc27b0 100644 --- a/db/db-core/src/tests.rs +++ b/db/db-core/src/tests.rs @@ -304,6 +304,21 @@ pub async fn database_works<'a, T: MCDatabase>( .unwrap() .is_empty()); + db.analytics_delete_all_records_for_campaign(c.key) + .await + .unwrap(); + assert_eq!(db.analytics_fetch(c.key, 1000, 0).await.unwrap().len(), 0); + let err = db.analytics_get_psuedo_id_from_capmaign_id(c.key).await; + assert!(err.is_err()); + assert_eq!( + format!("{:?}", err), + format!("{:?}", Err::<(), errors::DBError>(DBError::CaptchaNotFound)) + ); + db.analytics_delete_all_records_for_campaign(c.key) + .await + .unwrap(); + // analytics end + assert_eq!(db.fetch_solve(p.username, c.key).await.unwrap().len(), 1); assert_eq!( db.fetch_config_fetched(p.username, c.key) @@ -314,7 +329,6 @@ pub async fn database_works<'a, T: MCDatabase>( ); assert_eq!(db.fetch_solve(p.username, c.key).await.unwrap().len(), 1); assert_eq!(db.fetch_confirm(p.username, c.key).await.unwrap().len(), 1); - // analytics end // update captcha key; set key = username; db.update_captcha_key(p.username, c.key, p.username) diff --git a/db/db-sqlx-maria/sqlx-data.json b/db/db-sqlx-maria/sqlx-data.json index 7f82e8d5..48a43b0a 100644 --- a/db/db-sqlx-maria/sqlx-data.json +++ b/db/db-sqlx-maria/sqlx-data.json @@ -214,6 +214,16 @@ }, "query": "INSERT INTO mcaptcha_users \n (name , password, secret) VALUES (?, ?, ?)" }, + "6094468b7fa20043b0da90e366b7f1fa29a8c748e163b6712725440b25ae9361": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Right": 1 + } + }, + "query": "\n DELETE FROM\n mcaptcha_pow_analytics\n WHERE\n config_id = (\n SELECT config_id FROM mcaptcha_config WHERE captcha_key = ?\n ) " + }, "66ec7df10484f8e0206f3c97afc9136021589556c38dbbed341d6574487f79f2": { "describe": { "columns": [ @@ -883,6 +893,16 @@ }, "query": "INSERT INTO mcaptcha_pow_solved_stats \n (config_id, time) VALUES ((SELECT config_id FROM mcaptcha_config where captcha_key= ?), ?)" }, + "e4d9bf156a368dcee1433dd5ced9f1991aa15f84e0ade916433aada40f68f0aa": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Right": 1 + } + }, + "query": "\n DELETE FROM\n mcaptcha_psuedo_campaign_id\n WHERE config_id = (\n SELECT config_id FROM mcaptcha_config WHERE captcha_key = ?\n );" + }, "e6569a6064d0e07abea4c0bd4686cdfdaac64f0109ac40efaed06a744a2eaf5e": { "describe": { "columns": [ diff --git a/db/db-sqlx-maria/src/lib.rs b/db/db-sqlx-maria/src/lib.rs index ef839f8e..0652755f 100644 --- a/db/db-sqlx-maria/src/lib.rs +++ b/db/db-sqlx-maria/src/lib.rs @@ -1049,6 +1049,38 @@ impl MCDatabase for Database { .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?; Ok(res.captcha_key) } + + async fn analytics_delete_all_records_for_campaign( + &self, + campaign_id: &str, + ) -> DBResult<()> { + let _ = sqlx::query!( + " + DELETE FROM + mcaptcha_psuedo_campaign_id + WHERE config_id = ( + SELECT config_id FROM mcaptcha_config WHERE captcha_key = ? + );", + campaign_id + ) + .execute(&self.pool) + .await; + + let _ = sqlx::query!( + " + DELETE FROM + mcaptcha_pow_analytics + WHERE + config_id = ( + SELECT config_id FROM mcaptcha_config WHERE captcha_key = ? + ) ", + campaign_id + ) + .execute(&self.pool) + .await; + + Ok(()) + } } #[derive(Clone)] diff --git a/db/db-sqlx-postgres/sqlx-data.json b/db/db-sqlx-postgres/sqlx-data.json index 7fd3dc72..2c3d85e3 100644 --- a/db/db-sqlx-postgres/sqlx-data.json +++ b/db/db-sqlx-postgres/sqlx-data.json @@ -240,6 +240,18 @@ }, "query": "SELECT email FROM mcaptcha_users WHERE name = $1" }, + "30d8945806b4c68b6da800395f61c1e480839093bfcda9c693bf1972a65c7d79": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Left": [ + "Text" + ] + } + }, + "query": "\n DELETE FROM\n mcaptcha_psuedo_campaign_id\n WHERE config_id = (\n SELECT config_id FROM mcaptcha_config WHERE key = ($1)\n );" + }, "3b1c8128fc48b16d8e8ea6957dd4fbc0eb19ae64748fd7824e9f5e1901dd1726": { "describe": { "columns": [], @@ -588,6 +600,18 @@ }, "query": "INSERT INTO mcaptcha_pow_analytics \n (config_id, time, difficulty_factor, worker_type)\n VALUES ((SELECT config_id FROM mcaptcha_config WHERE key = $1), $2, $3, $4)" }, + "b67da576ff30a1bc8b1c0a79eff07f0622bd9ea035d3de15b91f5e1e8a5fda9b": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Left": [ + "Text" + ] + } + }, + "query": "\n DELETE FROM\n mcaptcha_pow_analytics\n WHERE\n config_id = (\n SELECT config_id FROM mcaptcha_config WHERE key = $1\n )\n " + }, "b97d810814fbeb2df19f47bcfa381bc6fb7ac6832d040b377cf4fca2ca896cfb": { "describe": { "columns": [], diff --git a/db/db-sqlx-postgres/src/lib.rs b/db/db-sqlx-postgres/src/lib.rs index 319c2f28..2ee8f85c 100644 --- a/db/db-sqlx-postgres/src/lib.rs +++ b/db/db-sqlx-postgres/src/lib.rs @@ -1057,6 +1057,39 @@ impl MCDatabase for Database { .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?; Ok(res.key) } + + async fn analytics_delete_all_records_for_campaign( + &self, + campaign_id: &str, + ) -> DBResult<()> { + let _ = sqlx::query!( + " + DELETE FROM + mcaptcha_psuedo_campaign_id + WHERE config_id = ( + SELECT config_id FROM mcaptcha_config WHERE key = ($1) + );", + campaign_id + ) + .execute(&self.pool) + .await; + + let _ = sqlx::query!( + " + DELETE FROM + mcaptcha_pow_analytics + WHERE + config_id = ( + SELECT config_id FROM mcaptcha_config WHERE key = $1 + ) + ", + campaign_id + ) + .execute(&self.pool) + .await; + + Ok(()) + } } #[derive(Clone)]