mirror of
https://github.com/mCaptcha/mCaptcha.git
synced 2025-05-05 06:32:49 +03:00
feat: add psuedo ID support to publish campaign IDs
This commit is contained in:
parent
8af09939ff
commit
68b59ade8c
11 changed files with 352 additions and 0 deletions
db/db-sqlx-postgres
|
@ -13,6 +13,7 @@ async-trait = "0.1.51"
|
|||
db-core = {path = "../db-core"}
|
||||
futures = "0.3.15"
|
||||
sqlx = { version = "0.5.13", features = [ "runtime-actix-rustls", "postgres", "time", "offline" ] }
|
||||
uuid = { version = "1.4.0", features = ["v4", "serde"] }
|
||||
|
||||
[dev-dependencies]
|
||||
actix-rt = "2"
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
CREATE TABLE IF NOT EXISTS mcaptcha_psuedo_campaign_id (
|
||||
id SERIAL PRIMARY KEY NOT NULL,
|
||||
config_id INTEGER NOT NULL references mcaptcha_config(config_id) ON DELETE CASCADE,
|
||||
psuedo_id varchar(100) NOT NULL UNIQUE
|
||||
);
|
|
@ -172,6 +172,26 @@
|
|||
},
|
||||
"query": "UPDATE mcaptcha_users set name = $1\n WHERE name = $2"
|
||||
},
|
||||
"21cdf28d8962389d22c8ddefdad82780f5316737e3d833623512aa12a54a026a": {
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "key",
|
||||
"ordinal": 0,
|
||||
"type_info": "Varchar"
|
||||
}
|
||||
],
|
||||
"nullable": [
|
||||
false
|
||||
],
|
||||
"parameters": {
|
||||
"Left": [
|
||||
"Text"
|
||||
]
|
||||
}
|
||||
},
|
||||
"query": "SELECT\n key\n FROM\n mcaptcha_config\n WHERE\n config_id = (\n SELECT\n config_id\n FROM\n mcaptcha_psuedo_campaign_id\n WHERE\n psuedo_id = $1\n );"
|
||||
},
|
||||
"2b319a202bb983d5f28979d1e371f399125da1122fbda36a5a55b75b9c743451": {
|
||||
"describe": {
|
||||
"columns": [],
|
||||
|
@ -446,6 +466,26 @@
|
|||
},
|
||||
"query": "INSERT INTO mcaptcha_users \n (name , password, secret) VALUES ($1, $2, $3)"
|
||||
},
|
||||
"839dfdfc3543b12128cb2b44bf356cd81f3da380963e5684ec3624a0ea4f9547": {
|
||||
"describe": {
|
||||
"columns": [
|
||||
{
|
||||
"name": "psuedo_id",
|
||||
"ordinal": 0,
|
||||
"type_info": "Varchar"
|
||||
}
|
||||
],
|
||||
"nullable": [
|
||||
false
|
||||
],
|
||||
"parameters": {
|
||||
"Left": [
|
||||
"Text"
|
||||
]
|
||||
}
|
||||
},
|
||||
"query": "SELECT psuedo_id FROM\n mcaptcha_psuedo_campaign_id\n WHERE\n config_id = (SELECT config_id FROM mcaptcha_config WHERE key = ($1));\n "
|
||||
},
|
||||
"84484cb6892db29121816bc5bff5702b9e857e20aa14e79d080d78ae7593153b": {
|
||||
"describe": {
|
||||
"columns": [
|
||||
|
@ -600,6 +640,19 @@
|
|||
},
|
||||
"query": "SELECT name, password FROM mcaptcha_users WHERE email = ($1)"
|
||||
},
|
||||
"c1bb8e02d1f9dc28322309d055de3c40ed4e1a1b9453a7e5a93a70e5186d762d": {
|
||||
"describe": {
|
||||
"columns": [],
|
||||
"nullable": [],
|
||||
"parameters": {
|
||||
"Left": [
|
||||
"Text",
|
||||
"Varchar"
|
||||
]
|
||||
}
|
||||
},
|
||||
"query": "\n INSERT INTO\n mcaptcha_psuedo_campaign_id (config_id, psuedo_id)\n VALUES (\n (SELECT config_id FROM mcaptcha_config WHERE key = ($1)),\n $2\n );"
|
||||
},
|
||||
"c2e167e56242de7e0a835e25004b15ca8340545fa0ca7ac8f3293157d2d03d98": {
|
||||
"describe": {
|
||||
"columns": [
|
||||
|
|
|
@ -22,6 +22,7 @@ use sqlx::postgres::PgPoolOptions;
|
|||
use sqlx::types::time::OffsetDateTime;
|
||||
use sqlx::ConnectOptions;
|
||||
use sqlx::PgPool;
|
||||
use uuid::Uuid;
|
||||
|
||||
pub mod errors;
|
||||
#[cfg(test)]
|
||||
|
@ -975,6 +976,87 @@ impl MCDatabase for Database {
|
|||
|
||||
Ok(res)
|
||||
}
|
||||
|
||||
/// Create psuedo ID against campaign ID to publish analytics
|
||||
async fn analytics_create_psuedo_id_if_not_exists(
|
||||
&self,
|
||||
captcha_id: &str,
|
||||
) -> DBResult<()> {
|
||||
let id = Uuid::new_v4();
|
||||
sqlx::query!(
|
||||
"
|
||||
INSERT INTO
|
||||
mcaptcha_psuedo_campaign_id (config_id, psuedo_id)
|
||||
VALUES (
|
||||
(SELECT config_id FROM mcaptcha_config WHERE key = ($1)),
|
||||
$2
|
||||
);",
|
||||
captcha_id,
|
||||
&id.to_string(),
|
||||
)
|
||||
.execute(&self.pool)
|
||||
.await
|
||||
.map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Get psuedo ID from campaign ID
|
||||
async fn analytics_get_psuedo_id_from_capmaign_id(
|
||||
&self,
|
||||
captcha_id: &str,
|
||||
) -> DBResult<String> {
|
||||
struct ID {
|
||||
psuedo_id: String,
|
||||
}
|
||||
|
||||
let res = sqlx::query_as!(
|
||||
ID,
|
||||
"SELECT psuedo_id FROM
|
||||
mcaptcha_psuedo_campaign_id
|
||||
WHERE
|
||||
config_id = (SELECT config_id FROM mcaptcha_config WHERE key = ($1));
|
||||
",
|
||||
captcha_id
|
||||
)
|
||||
.fetch_one(&self.pool)
|
||||
.await
|
||||
.map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
|
||||
|
||||
Ok(res.psuedo_id)
|
||||
}
|
||||
|
||||
/// Get campaign ID from psuedo ID
|
||||
async fn analytics_get_capmaign_id_from_psuedo_id(
|
||||
&self,
|
||||
psuedo_id: &str,
|
||||
) -> DBResult<String> {
|
||||
struct ID {
|
||||
key: String,
|
||||
}
|
||||
|
||||
let res = sqlx::query_as!(
|
||||
ID,
|
||||
"SELECT
|
||||
key
|
||||
FROM
|
||||
mcaptcha_config
|
||||
WHERE
|
||||
config_id = (
|
||||
SELECT
|
||||
config_id
|
||||
FROM
|
||||
mcaptcha_psuedo_campaign_id
|
||||
WHERE
|
||||
psuedo_id = $1
|
||||
);",
|
||||
psuedo_id
|
||||
)
|
||||
.fetch_one(&self.pool)
|
||||
.await
|
||||
.map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
|
||||
Ok(res.key)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue