diff --git a/db/db-sqlx-postgres/src/lib.rs b/db/db-sqlx-postgres/src/lib.rs index 1762f138..56b15491 100644 --- a/db/db-sqlx-postgres/src/lib.rs +++ b/db/db-sqlx-postgres/src/lib.rs @@ -317,6 +317,42 @@ impl MCDatabase for Database { Ok(()) } + /// Get captcha config + async fn get_captcha_config(&self, username: &str, key: &str) -> DBResult { + let captcha = sqlx::query_as!( + InternaleCaptchaConfig, + "SELECT config_id, duration, name, key from mcaptcha_config WHERE + key = $1 AND + user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2) ", + &key, + &username, + ) + .fetch_one(&self.pool) + .await + .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?; + + Ok(captcha.into()) + } + + /// Get all captchas belonging to user + async fn get_all_user_captchas(&self, username: &str) -> DBResult> { + let mut res = sqlx::query_as!( + InternaleCaptchaConfig, + "SELECT key, name, config_id, duration FROM mcaptcha_config WHERE + user_id = (SELECT ID FROM mcaptcha_users WHERE name = $1) ", + &username, + ) + .fetch_all(&self.pool) + .await + .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?; + + let mut captchas = Vec::with_capacity(res.len()); + + res.drain(0..).for_each(|r| captchas.push(r.into())); + + Ok(captchas) + } + /// update captcha metadata; doesn't change captcha key async fn update_captcha_metadata( &self, @@ -883,3 +919,22 @@ impl From for Notification { } } } + +#[derive(Clone)] +struct InternaleCaptchaConfig { + config_id: i32, + duration: i32, + name: String, + key: String, +} + +impl From for Captcha { + fn from(i: InternaleCaptchaConfig) -> Self { + Self { + config_id: i.config_id, + duration: i.duration, + description: i.name, + key: i.key, + } + } +} diff --git a/sqlx-data.json b/sqlx-data.json index 3a1b3cda..95c8c858 100644 --- a/sqlx-data.json +++ b/sqlx-data.json @@ -1,109 +1,3 @@ { - "db": "PostgreSQL", - "4c3a9fe30a4c6bd49ab1cb8883c4495993aa05f2991483b4f04913b2e5043a63": { - "describe": { - "columns": [ - { - "name": "difficulty_factor", - "ordinal": 0, - "type_info": "Int4" - }, - { - "name": "visitor_threshold", - "ordinal": 1, - "type_info": "Int4" - } - ], - "nullable": [ - false, - false - ], - "parameters": { - "Left": [ - "Int4" - ] - } - }, - "query": "SELECT \n difficulty_factor, visitor_threshold \n FROM \n mcaptcha_levels \n WHERE config_id = $1 ORDER BY difficulty_factor ASC" - }, - "76d1b62e0c70d09247691ca328d8674c8039fab922a40352b8ab5ed5b26a5293": { - "describe": { - "columns": [ - { - "name": "key", - "ordinal": 0, - "type_info": "Varchar" - }, - { - "name": "name", - "ordinal": 1, - "type_info": "Varchar" - } - ], - "nullable": [ - false, - false - ], - "parameters": { - "Left": [ - "Text" - ] - } - }, - "query": "SELECT key, name from mcaptcha_config WHERE\n user_id = (SELECT ID FROM mcaptcha_users WHERE name = $1) " - }, - "a1c49ee377d6ac57fb22c9eac0ef1927a97087abd58da092a91623d06fa7076e": { - "describe": { - "columns": [ - { - "name": "name", - "ordinal": 0, - "type_info": "Varchar" - } - ], - "nullable": [ - false - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - } - }, - "query": "SELECT name FROM mcaptcha_config \n WHERE key = $1 \n AND user_id = (\n SELECT user_id FROM mcaptcha_users WHERE NAME = $2)" - }, - "ada91fac02c7bba9b13deebccda6f6fc45773b5a6e786c37c27b4a71a5cd29f2": { - "describe": { - "columns": [ - { - "name": "config_id", - "ordinal": 0, - "type_info": "Int4" - }, - { - "name": "duration", - "ordinal": 1, - "type_info": "Int4" - }, - { - "name": "name", - "ordinal": 2, - "type_info": "Varchar" - } - ], - "nullable": [ - false, - false, - false - ], - "parameters": { - "Left": [ - "Text", - "Text" - ] - } - }, - "query": "SELECT config_id, duration, name from mcaptcha_config WHERE\n key = $1 AND\n user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2) " - } + "db": "PostgreSQL" } \ No newline at end of file