mirror of
https://github.com/mCaptcha/mCaptcha.git
synced 2026-02-13 02:55:39 +00:00
Deploying to gh-pages from @ ac502b7c08 🚀
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `db/db-core/src/errors.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>errors.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../../dark.css" disabled><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../db_core/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `db/db-core/src/errors.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>errors.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../../normalize.css"><link rel="stylesheet" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../../ayu.css" disabled><link rel="stylesheet" href="../../dark.css" disabled><link rel="stylesheet" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../db_core/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
|
||||
<span id="2">2</span>
|
||||
<span id="3">3</span>
|
||||
<span id="4">4</span>
|
||||
@@ -74,51 +74,51 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/</span>
|
||||
<span class="doccomment">//! represents all the ways a trait can fail using this crate</span>
|
||||
<span class="kw">use</span> <span class="ident">std::error::Error</span> <span class="kw">as</span> <span class="ident">StdError</span>;
|
||||
*/
|
||||
</span><span class="doccomment">//! represents all the ways a trait can fail using this crate
|
||||
</span><span class="kw">use </span>std::error::Error <span class="kw">as </span>StdError;
|
||||
|
||||
<span class="comment">//use derive_more::{error, Error as DeriveError};</span>
|
||||
<span class="kw">use</span> <span class="ident">thiserror::Error</span>;
|
||||
<span class="comment">//use derive_more::{error, Error as DeriveError};
|
||||
</span><span class="kw">use </span>thiserror::Error;
|
||||
|
||||
<span class="doccomment">/// Error data structure grouping various error subtypes</span>
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">Error</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">enum</span> <span class="ident">DBError</span> {
|
||||
<span class="doccomment">/// errors that are specific to a database implementation</span>
|
||||
<span class="attribute">#[<span class="ident">error</span>(<span class="string">"{0}"</span>)]</span>
|
||||
<span class="ident">DBError</span>(<span class="attribute">#[<span class="ident">source</span>]</span> <span class="ident">BoxDynError</span>),
|
||||
<span class="doccomment">/// Username is taken</span>
|
||||
<span class="attribute">#[<span class="ident">error</span>(<span class="string">"Username is taken"</span>)]</span>
|
||||
<span class="ident">UsernameTaken</span>,
|
||||
<span class="doccomment">/// Email is taken</span>
|
||||
<span class="attribute">#[<span class="ident">error</span>(<span class="string">"Email is taken"</span>)]</span>
|
||||
<span class="ident">EmailTaken</span>,
|
||||
<span class="doccomment">/// Secret is taken</span>
|
||||
<span class="attribute">#[<span class="ident">error</span>(<span class="string">"Secret is taken"</span>)]</span>
|
||||
<span class="ident">SecretTaken</span>,
|
||||
<span class="doccomment">/// Captcha key is taken</span>
|
||||
<span class="attribute">#[<span class="ident">error</span>(<span class="string">"Captcha key is taken"</span>)]</span>
|
||||
<span class="ident">CaptchaKeyTaken</span>,
|
||||
<span class="doccomment">/// Account not found</span>
|
||||
<span class="attribute">#[<span class="ident">error</span>(<span class="string">"Account not found"</span>)]</span>
|
||||
<span class="ident">AccountNotFound</span>,
|
||||
<span class="doccomment">/// Error data structure grouping various error subtypes
|
||||
</span><span class="attribute">#[derive(Debug, Error)]
|
||||
</span><span class="kw">pub enum </span>DBError {
|
||||
<span class="doccomment">/// errors that are specific to a database implementation
|
||||
</span><span class="attribute">#[error(<span class="string">"{0}"</span>)]
|
||||
</span>DBError(<span class="attribute">#[source] </span>BoxDynError),
|
||||
<span class="doccomment">/// Username is taken
|
||||
</span><span class="attribute">#[error(<span class="string">"Username is taken"</span>)]
|
||||
</span>UsernameTaken,
|
||||
<span class="doccomment">/// Email is taken
|
||||
</span><span class="attribute">#[error(<span class="string">"Email is taken"</span>)]
|
||||
</span>EmailTaken,
|
||||
<span class="doccomment">/// Secret is taken
|
||||
</span><span class="attribute">#[error(<span class="string">"Secret is taken"</span>)]
|
||||
</span>SecretTaken,
|
||||
<span class="doccomment">/// Captcha key is taken
|
||||
</span><span class="attribute">#[error(<span class="string">"Captcha key is taken"</span>)]
|
||||
</span>CaptchaKeyTaken,
|
||||
<span class="doccomment">/// Account not found
|
||||
</span><span class="attribute">#[error(<span class="string">"Account not found"</span>)]
|
||||
</span>AccountNotFound,
|
||||
|
||||
<span class="doccomment">/// Captcha not found</span>
|
||||
<span class="attribute">#[<span class="ident">error</span>(<span class="string">"Captcha not found"</span>)]</span>
|
||||
<span class="ident">CaptchaNotFound</span>,
|
||||
<span class="doccomment">/// Traffic pattern not found</span>
|
||||
<span class="attribute">#[<span class="ident">error</span>(<span class="string">"Traffic pattern not found"</span>)]</span>
|
||||
<span class="ident">TrafficPatternNotFound</span>,
|
||||
<span class="doccomment">/// Captcha not found
|
||||
</span><span class="attribute">#[error(<span class="string">"Captcha not found"</span>)]
|
||||
</span>CaptchaNotFound,
|
||||
<span class="doccomment">/// Traffic pattern not found
|
||||
</span><span class="attribute">#[error(<span class="string">"Traffic pattern not found"</span>)]
|
||||
</span>TrafficPatternNotFound,
|
||||
|
||||
<span class="doccomment">/// Notification not found</span>
|
||||
<span class="attribute">#[<span class="ident">error</span>(<span class="string">"Notification not found"</span>)]</span>
|
||||
<span class="ident">NotificationNotFound</span>,
|
||||
<span class="doccomment">/// Notification not found
|
||||
</span><span class="attribute">#[error(<span class="string">"Notification not found"</span>)]
|
||||
</span>NotificationNotFound,
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Convenience type alias for grouping driver-specific errors</span>
|
||||
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">BoxDynError</span> <span class="op">=</span> <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">StdError</span> <span class="op">+</span> <span class="lifetime">'static</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span><span class="op">></span>;
|
||||
<span class="doccomment">/// Convenience type alias for grouping driver-specific errors
|
||||
</span><span class="kw">pub type </span>BoxDynError = Box<<span class="kw">dyn </span>StdError + <span class="lifetime">'static </span>+ Send + Sync>;
|
||||
|
||||
<span class="doccomment">/// Generic result data structure</span>
|
||||
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">V</span><span class="op">></span> <span class="op">=</span> <span class="ident">std::result::Result</span><span class="op"><</span><span class="ident">V</span>, <span class="ident">DBError</span><span class="op">></span>;
|
||||
<span class="doccomment">/// Generic result data structure
|
||||
</span><span class="kw">pub type </span>DBResult<V> = std::result::Result<V, DBError>;
|
||||
</code></pre></div>
|
||||
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="db_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.64.0 (a55dd71d5 2022-09-19)" ></div></body></html>
|
||||
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="db_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.65.0 (897e37553 2022-11-02)" ></div></body></html>
|
||||
@@ -1,4 +1,4 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `db/db-core/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../../dark.css" disabled><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../db_core/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `db/db-core/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../../normalize.css"><link rel="stylesheet" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../../ayu.css" disabled><link rel="stylesheet" href="../../dark.css" disabled><link rel="stylesheet" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../db_core/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
|
||||
<span id="2">2</span>
|
||||
<span id="3">3</span>
|
||||
<span id="4">4</span>
|
||||
@@ -368,345 +368,345 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/</span>
|
||||
*/
|
||||
|
||||
<span class="attribute">#![<span class="ident">warn</span>(<span class="ident">missing_docs</span>)]</span>
|
||||
<span class="doccomment">//! # `mCaptcha` database operations</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! Traits and datastructures used in mCaptcha to interact with database.</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! To use an unsupported database with mCaptcha, traits present within this crate should be</span>
|
||||
<span class="doccomment">//! implemented.</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! ## Organisation</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! Database functionality is divided across various modules:</span>
|
||||
<span class="doccomment">//!</span>
|
||||
<span class="doccomment">//! - [errors](crate::auth): error data structures used in this crate</span>
|
||||
<span class="doccomment">//! - [ops](crate::ops): meta operations like connection pool creation, migrations and getting</span>
|
||||
<span class="doccomment">//! connection from pool</span>
|
||||
<span class="kw">use</span> <span class="ident">serde</span>::{<span class="ident">Deserialize</span>, <span class="ident">Serialize</span>};
|
||||
</span><span class="attribute">#![warn(missing_docs)]
|
||||
</span><span class="doccomment">//! # `mCaptcha` database operations
|
||||
//!
|
||||
//! Traits and datastructures used in mCaptcha to interact with database.
|
||||
//!
|
||||
//! To use an unsupported database with mCaptcha, traits present within this crate should be
|
||||
//! implemented.
|
||||
//!
|
||||
//!
|
||||
//! ## Organisation
|
||||
//!
|
||||
//! Database functionality is divided across various modules:
|
||||
//!
|
||||
//! - [errors](crate::auth): error data structures used in this crate
|
||||
//! - [ops](crate::ops): meta operations like connection pool creation, migrations and getting
|
||||
//! connection from pool
|
||||
</span><span class="kw">use </span>serde::{Deserialize, Serialize};
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">libmcaptcha::defense::Level</span>;
|
||||
<span class="kw">pub use </span>libmcaptcha::defense::Level;
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">errors</span>;
|
||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">ops</span>;
|
||||
<span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">feature</span> <span class="op">=</span> <span class="string">"test"</span>)]</span>
|
||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">tests</span>;
|
||||
<span class="kw">pub mod </span>errors;
|
||||
<span class="kw">pub mod </span>ops;
|
||||
<span class="attribute">#[cfg(feature = <span class="string">"test"</span>)]
|
||||
</span><span class="kw">pub mod </span>tests;
|
||||
|
||||
<span class="kw">use</span> <span class="ident">dev</span>::<span class="kw-2">*</span>;
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">ops::GetConnection</span>;
|
||||
<span class="kw">use </span>dev::<span class="kw-2">*</span>;
|
||||
<span class="kw">pub use </span>ops::GetConnection;
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">prelude</span> {
|
||||
<span class="doccomment">//! useful imports for users working with a supported database</span>
|
||||
<span class="kw">pub mod </span>prelude {
|
||||
<span class="doccomment">//! useful imports for users working with a supported database
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident"><span class="kw">super</span>::errors</span>::<span class="kw-2">*</span>;
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident"><span class="kw">super</span>::ops</span>::<span class="kw-2">*</span>;
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="kw">super</span>::<span class="kw-2">*</span>;
|
||||
</span><span class="kw">pub use </span><span class="kw">super</span>::errors::<span class="kw-2">*</span>;
|
||||
<span class="kw">pub use </span><span class="kw">super</span>::ops::<span class="kw-2">*</span>;
|
||||
<span class="kw">pub use super</span>::<span class="kw-2">*</span>;
|
||||
}
|
||||
|
||||
<span class="kw">pub</span> <span class="kw">mod</span> <span class="ident">dev</span> {
|
||||
<span class="doccomment">//! useful imports for supporting a new database</span>
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident"><span class="kw">super</span>::prelude</span>::<span class="kw-2">*</span>;
|
||||
<span class="kw">pub</span> <span class="kw">use</span> <span class="ident">async_trait::async_trait</span>;
|
||||
<span class="kw">pub mod </span>dev {
|
||||
<span class="doccomment">//! useful imports for supporting a new database
|
||||
</span><span class="kw">pub use </span><span class="kw">super</span>::prelude::<span class="kw-2">*</span>;
|
||||
<span class="kw">pub use </span>async_trait::async_trait;
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>, <span class="ident">PartialEq</span>)]</span>
|
||||
<span class="doccomment">/// Data required to register a new user</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Register</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> {
|
||||
<span class="doccomment">/// username of new user</span>
|
||||
<span class="kw">pub</span> <span class="ident">username</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="doccomment">/// secret of new user</span>
|
||||
<span class="kw">pub</span> <span class="ident">secret</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="doccomment">/// hashed password of new use</span>
|
||||
<span class="kw">pub</span> <span class="ident">hash</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="doccomment">/// Optionally, email of new use</span>
|
||||
<span class="kw">pub</span> <span class="ident">email</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span><span class="op">></span>,
|
||||
<span class="attribute">#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
|
||||
</span><span class="doccomment">/// Data required to register a new user
|
||||
</span><span class="kw">pub struct </span>Register<<span class="lifetime">'a</span>> {
|
||||
<span class="doccomment">/// username of new user
|
||||
</span><span class="kw">pub </span>username: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
<span class="doccomment">/// secret of new user
|
||||
</span><span class="kw">pub </span>secret: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
<span class="doccomment">/// hashed password of new use
|
||||
</span><span class="kw">pub </span>hash: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
<span class="doccomment">/// Optionally, email of new use
|
||||
</span><span class="kw">pub </span>email: <span class="prelude-ty">Option</span><<span class="kw-2">&</span><span class="lifetime">'a </span>str>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>, <span class="ident">PartialEq</span>)]</span>
|
||||
<span class="doccomment">/// data required to update them email of a user</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">UpdateEmail</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> {
|
||||
<span class="doccomment">/// username of the user</span>
|
||||
<span class="kw">pub</span> <span class="ident">username</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="doccomment">/// new email address of the user</span>
|
||||
<span class="kw">pub</span> <span class="ident">new_email</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="attribute">#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
|
||||
</span><span class="doccomment">/// data required to update them email of a user
|
||||
</span><span class="kw">pub struct </span>UpdateEmail<<span class="lifetime">'a</span>> {
|
||||
<span class="doccomment">/// username of the user
|
||||
</span><span class="kw">pub </span>username: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
<span class="doccomment">/// new email address of the user
|
||||
</span><span class="kw">pub </span>new_email: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>, <span class="ident">PartialEq</span>)]</span>
|
||||
<span class="doccomment">/// types of credentials used as identifiers during login</span>
|
||||
<span class="kw">pub</span> <span class="kw">enum</span> <span class="ident">Login</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> {
|
||||
<span class="doccomment">/// username as login</span>
|
||||
<span class="ident">Username</span>(<span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>),
|
||||
<span class="doccomment">/// email as login</span>
|
||||
<span class="ident">Email</span>(<span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>),
|
||||
<span class="attribute">#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
|
||||
</span><span class="doccomment">/// types of credentials used as identifiers during login
|
||||
</span><span class="kw">pub enum </span>Login<<span class="lifetime">'a</span>> {
|
||||
<span class="doccomment">/// username as login
|
||||
</span>Username(<span class="kw-2">&</span><span class="lifetime">'a </span>str),
|
||||
<span class="doccomment">/// email as login
|
||||
</span>Email(<span class="kw-2">&</span><span class="lifetime">'a </span>str),
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>, <span class="ident">PartialEq</span>)]</span>
|
||||
<span class="doccomment">/// type encapsulating username and hashed password of a user</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">NameHash</span> {
|
||||
<span class="doccomment">/// username</span>
|
||||
<span class="kw">pub</span> <span class="ident">username</span>: <span class="ident">String</span>,
|
||||
<span class="doccomment">/// hashed password</span>
|
||||
<span class="kw">pub</span> <span class="ident">hash</span>: <span class="ident">String</span>,
|
||||
<span class="attribute">#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
|
||||
</span><span class="doccomment">/// type encapsulating username and hashed password of a user
|
||||
</span><span class="kw">pub struct </span>NameHash {
|
||||
<span class="doccomment">/// username
|
||||
</span><span class="kw">pub </span>username: String,
|
||||
<span class="doccomment">/// hashed password
|
||||
</span><span class="kw">pub </span>hash: String,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">async_trait</span>]</span>
|
||||
<span class="doccomment">/// mCaptcha's database requirements. To implement support for $Database, kindly implement this</span>
|
||||
<span class="doccomment">/// trait.</span>
|
||||
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">MCDatabase</span>: <span class="ident">std::marker::Send</span> <span class="op">+</span> <span class="ident">std::marker::Sync</span> <span class="op">+</span> <span class="ident">CloneSPDatabase</span> {
|
||||
<span class="doccomment">/// ping DB</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">ping</span>(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="ident">bool</span>;
|
||||
<span class="attribute">#[async_trait]
|
||||
</span><span class="doccomment">/// mCaptcha's database requirements. To implement support for $Database, kindly implement this
|
||||
/// trait.
|
||||
</span><span class="kw">pub trait </span>MCDatabase: std::marker::Send + std::marker::Sync + CloneSPDatabase {
|
||||
<span class="doccomment">/// ping DB
|
||||
</span><span class="kw">async fn </span>ping(<span class="kw-2">&</span><span class="self">self</span>) -> bool;
|
||||
|
||||
<span class="doccomment">/// register a new user</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">register</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">p</span>: <span class="kw-2">&</span><span class="ident">Register</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// register a new user
|
||||
</span><span class="kw">async fn </span>register(<span class="kw-2">&</span><span class="self">self</span>, p: <span class="kw-2">&</span>Register) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// delete a user</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">delete_user</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// delete a user
|
||||
</span><span class="kw">async fn </span>delete_user(<span class="kw-2">&</span><span class="self">self</span>, username: <span class="kw-2">&</span>str) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// check if username exists</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">username_exists</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">bool</span><span class="op">></span>;
|
||||
<span class="doccomment">/// check if username exists
|
||||
</span><span class="kw">async fn </span>username_exists(<span class="kw-2">&</span><span class="self">self</span>, username: <span class="kw-2">&</span>str) -> DBResult<bool>;
|
||||
|
||||
<span class="doccomment">/// get user email</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_email</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">String</span><span class="op">></span><span class="op">></span>;
|
||||
<span class="doccomment">/// get user email
|
||||
</span><span class="kw">async fn </span>get_email(<span class="kw-2">&</span><span class="self">self</span>, username: <span class="kw-2">&</span>str) -> DBResult<<span class="prelude-ty">Option</span><String>>;
|
||||
|
||||
<span class="doccomment">/// check if email exists</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">email_exists</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">email</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">bool</span><span class="op">></span>;
|
||||
<span class="doccomment">/// check if email exists
|
||||
</span><span class="kw">async fn </span>email_exists(<span class="kw-2">&</span><span class="self">self</span>, email: <span class="kw-2">&</span>str) -> DBResult<bool>;
|
||||
|
||||
<span class="doccomment">/// update a user's email</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">update_email</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">p</span>: <span class="kw-2">&</span><span class="ident">UpdateEmail</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// update a user's email
|
||||
</span><span class="kw">async fn </span>update_email(<span class="kw-2">&</span><span class="self">self</span>, p: <span class="kw-2">&</span>UpdateEmail) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// get a user's password</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_password</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">l</span>: <span class="kw-2">&</span><span class="ident">Login</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">NameHash</span><span class="op">></span>;
|
||||
<span class="doccomment">/// get a user's password
|
||||
</span><span class="kw">async fn </span>get_password(<span class="kw-2">&</span><span class="self">self</span>, l: <span class="kw-2">&</span>Login) -> DBResult<NameHash>;
|
||||
|
||||
<span class="doccomment">/// update user's password</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">update_password</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">p</span>: <span class="kw-2">&</span><span class="ident">NameHash</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// update user's password
|
||||
</span><span class="kw">async fn </span>update_password(<span class="kw-2">&</span><span class="self">self</span>, p: <span class="kw-2">&</span>NameHash) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// update username</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">update_username</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">current</span>: <span class="kw-2">&</span><span class="ident">str</span>, <span class="ident">new</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// update username
|
||||
</span><span class="kw">async fn </span>update_username(<span class="kw-2">&</span><span class="self">self</span>, current: <span class="kw-2">&</span>str, new: <span class="kw-2">&</span>str) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// get a user's secret</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_secret</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">Secret</span><span class="op">></span>;
|
||||
<span class="doccomment">/// get a user's secret
|
||||
</span><span class="kw">async fn </span>get_secret(<span class="kw-2">&</span><span class="self">self</span>, username: <span class="kw-2">&</span>str) -> DBResult<Secret>;
|
||||
|
||||
<span class="doccomment">/// get a user's secret from a captcha key</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_secret_from_captcha</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">key</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">Secret</span><span class="op">></span>;
|
||||
<span class="doccomment">/// get a user's secret from a captcha key
|
||||
</span><span class="kw">async fn </span>get_secret_from_captcha(<span class="kw-2">&</span><span class="self">self</span>, key: <span class="kw-2">&</span>str) -> DBResult<Secret>;
|
||||
|
||||
<span class="doccomment">/// update a user's secret</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">update_secret</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>, <span class="ident">secret</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// update a user's secret
|
||||
</span><span class="kw">async fn </span>update_secret(<span class="kw-2">&</span><span class="self">self</span>, username: <span class="kw-2">&</span>str, secret: <span class="kw-2">&</span>str) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// create new captcha</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">create_captcha</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>, <span class="ident">p</span>: <span class="kw-2">&</span><span class="ident">CreateCaptcha</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// create new captcha
|
||||
</span><span class="kw">async fn </span>create_captcha(<span class="kw-2">&</span><span class="self">self</span>, username: <span class="kw-2">&</span>str, p: <span class="kw-2">&</span>CreateCaptcha) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// Get captcha config</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_captcha_config</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>, <span class="ident">key</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">Captcha</span><span class="op">></span>;
|
||||
<span class="doccomment">/// Get captcha config
|
||||
</span><span class="kw">async fn </span>get_captcha_config(<span class="kw-2">&</span><span class="self">self</span>, username: <span class="kw-2">&</span>str, key: <span class="kw-2">&</span>str) -> DBResult<Captcha>;
|
||||
|
||||
<span class="doccomment">/// Get all captchas belonging to user</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_all_user_captchas</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="ident">Captcha</span><span class="op">></span><span class="op">></span>;
|
||||
<span class="doccomment">/// Get all captchas belonging to user
|
||||
</span><span class="kw">async fn </span>get_all_user_captchas(<span class="kw-2">&</span><span class="self">self</span>, username: <span class="kw-2">&</span>str) -> DBResult<Vec<Captcha>>;
|
||||
|
||||
<span class="doccomment">/// update captcha metadata; doesn't change captcha key</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">update_captcha_metadata</span>(
|
||||
<span class="doccomment">/// update captcha metadata; doesn't change captcha key
|
||||
</span><span class="kw">async fn </span>update_captcha_metadata(
|
||||
<span class="kw-2">&</span><span class="self">self</span>,
|
||||
<span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
<span class="ident">p</span>: <span class="kw-2">&</span><span class="ident">CreateCaptcha</span>,
|
||||
) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
username: <span class="kw-2">&</span>str,
|
||||
p: <span class="kw-2">&</span>CreateCaptcha,
|
||||
) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// update captcha key; doesn't change metadata</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">update_captcha_key</span>(
|
||||
<span class="doccomment">/// update captcha key; doesn't change metadata
|
||||
</span><span class="kw">async fn </span>update_captcha_key(
|
||||
<span class="kw-2">&</span><span class="self">self</span>,
|
||||
<span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
<span class="ident">old_key</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
<span class="ident">new_key</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
username: <span class="kw-2">&</span>str,
|
||||
old_key: <span class="kw-2">&</span>str,
|
||||
new_key: <span class="kw-2">&</span>str,
|
||||
) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// Add levels to captcha</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">add_captcha_levels</span>(
|
||||
<span class="doccomment">/// Add levels to captcha
|
||||
</span><span class="kw">async fn </span>add_captcha_levels(
|
||||
<span class="kw-2">&</span><span class="self">self</span>,
|
||||
<span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
<span class="ident">captcha_key</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
<span class="ident">levels</span>: <span class="kw-2">&</span>[<span class="ident">Level</span>],
|
||||
) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
username: <span class="kw-2">&</span>str,
|
||||
captcha_key: <span class="kw-2">&</span>str,
|
||||
levels: <span class="kw-2">&</span>[Level],
|
||||
) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// check if captcha exists</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">captcha_exists</span>(
|
||||
<span class="doccomment">/// check if captcha exists
|
||||
</span><span class="kw">async fn </span>captcha_exists(
|
||||
<span class="kw-2">&</span><span class="self">self</span>,
|
||||
<span class="ident">username</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span>,
|
||||
<span class="ident">captcha_key</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">bool</span><span class="op">></span>;
|
||||
username: <span class="prelude-ty">Option</span><<span class="kw-2">&</span>str>,
|
||||
captcha_key: <span class="kw-2">&</span>str,
|
||||
) -> DBResult<bool>;
|
||||
|
||||
<span class="doccomment">/// Delete all levels of a captcha</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">delete_captcha_levels</span>(
|
||||
<span class="doccomment">/// Delete all levels of a captcha
|
||||
</span><span class="kw">async fn </span>delete_captcha_levels(
|
||||
<span class="kw-2">&</span><span class="self">self</span>,
|
||||
<span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
<span class="ident">captcha_key</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
username: <span class="kw-2">&</span>str,
|
||||
captcha_key: <span class="kw-2">&</span>str,
|
||||
) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// Delete captcha</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">delete_captcha</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>, <span class="ident">captcha_key</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// Delete captcha
|
||||
</span><span class="kw">async fn </span>delete_captcha(<span class="kw-2">&</span><span class="self">self</span>, username: <span class="kw-2">&</span>str, captcha_key: <span class="kw-2">&</span>str) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// Get captcha levels</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_captcha_levels</span>(
|
||||
<span class="doccomment">/// Get captcha levels
|
||||
</span><span class="kw">async fn </span>get_captcha_levels(
|
||||
<span class="kw-2">&</span><span class="self">self</span>,
|
||||
<span class="ident">username</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="kw-2">&</span><span class="ident">str</span><span class="op">></span>,
|
||||
<span class="ident">captcha_key</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="ident">Level</span><span class="op">></span><span class="op">></span>;
|
||||
username: <span class="prelude-ty">Option</span><<span class="kw-2">&</span>str>,
|
||||
captcha_key: <span class="kw-2">&</span>str,
|
||||
) -> DBResult<Vec<Level>>;
|
||||
|
||||
<span class="doccomment">/// Get captcha's cooldown period</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_captcha_cooldown</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">captcha_key</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">i32</span><span class="op">></span>;
|
||||
<span class="doccomment">/// Get captcha's cooldown period
|
||||
</span><span class="kw">async fn </span>get_captcha_cooldown(<span class="kw-2">&</span><span class="self">self</span>, captcha_key: <span class="kw-2">&</span>str) -> DBResult<i32>;
|
||||
|
||||
<span class="doccomment">/// Add traffic configuration</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">add_traffic_pattern</span>(
|
||||
<span class="doccomment">/// Add traffic configuration
|
||||
</span><span class="kw">async fn </span>add_traffic_pattern(
|
||||
<span class="kw-2">&</span><span class="self">self</span>,
|
||||
<span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
<span class="ident">captcha_key</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
<span class="ident">pattern</span>: <span class="kw-2">&</span><span class="ident">TrafficPattern</span>,
|
||||
) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
username: <span class="kw-2">&</span>str,
|
||||
captcha_key: <span class="kw-2">&</span>str,
|
||||
pattern: <span class="kw-2">&</span>TrafficPattern,
|
||||
) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// Get traffic configuration</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_traffic_pattern</span>(
|
||||
<span class="doccomment">/// Get traffic configuration
|
||||
</span><span class="kw">async fn </span>get_traffic_pattern(
|
||||
<span class="kw-2">&</span><span class="self">self</span>,
|
||||
<span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
<span class="ident">captcha_key</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">TrafficPattern</span><span class="op">></span>;
|
||||
username: <span class="kw-2">&</span>str,
|
||||
captcha_key: <span class="kw-2">&</span>str,
|
||||
) -> DBResult<TrafficPattern>;
|
||||
|
||||
<span class="doccomment">/// Delete traffic configuration</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">delete_traffic_pattern</span>(
|
||||
<span class="doccomment">/// Delete traffic configuration
|
||||
</span><span class="kw">async fn </span>delete_traffic_pattern(
|
||||
<span class="kw-2">&</span><span class="self">self</span>,
|
||||
<span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
<span class="ident">captcha_key</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
username: <span class="kw-2">&</span>str,
|
||||
captcha_key: <span class="kw-2">&</span>str,
|
||||
) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// create new notification</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">create_notification</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">p</span>: <span class="kw-2">&</span><span class="ident">AddNotification</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// create new notification
|
||||
</span><span class="kw">async fn </span>create_notification(<span class="kw-2">&</span><span class="self">self</span>, p: <span class="kw-2">&</span>AddNotification) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// get all unread notifications</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_all_unread_notifications</span>(
|
||||
<span class="doccomment">/// get all unread notifications
|
||||
</span><span class="kw">async fn </span>get_all_unread_notifications(
|
||||
<span class="kw-2">&</span><span class="self">self</span>,
|
||||
<span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>,
|
||||
) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="ident">Notification</span><span class="op">></span><span class="op">></span>;
|
||||
username: <span class="kw-2">&</span>str,
|
||||
) -> DBResult<Vec<Notification>>;
|
||||
|
||||
<span class="doccomment">/// mark a notification read</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">mark_notification_read</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">username</span>: <span class="kw-2">&</span><span class="ident">str</span>, <span class="ident">id</span>: <span class="ident">i32</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// mark a notification read
|
||||
</span><span class="kw">async fn </span>mark_notification_read(<span class="kw-2">&</span><span class="self">self</span>, username: <span class="kw-2">&</span>str, id: i32) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// record PoWConfig fetches</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">record_fetch</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">key</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// record PoWConfig fetches
|
||||
</span><span class="kw">async fn </span>record_fetch(<span class="kw-2">&</span><span class="self">self</span>, key: <span class="kw-2">&</span>str) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// record PoWConfig solves</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">record_solve</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">key</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// record PoWConfig solves
|
||||
</span><span class="kw">async fn </span>record_solve(<span class="kw-2">&</span><span class="self">self</span>, key: <span class="kw-2">&</span>str) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// record PoWConfig confirms</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">record_confirm</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">key</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// record PoWConfig confirms
|
||||
</span><span class="kw">async fn </span>record_confirm(<span class="kw-2">&</span><span class="self">self</span>, key: <span class="kw-2">&</span>str) -> DBResult<()>;
|
||||
|
||||
<span class="doccomment">/// fetch PoWConfig fetches</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">fetch_config_fetched</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">user</span>: <span class="kw-2">&</span><span class="ident">str</span>, <span class="ident">key</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="ident">i64</span><span class="op">></span><span class="op">></span>;
|
||||
<span class="doccomment">/// fetch PoWConfig fetches
|
||||
</span><span class="kw">async fn </span>fetch_config_fetched(<span class="kw-2">&</span><span class="self">self</span>, user: <span class="kw-2">&</span>str, key: <span class="kw-2">&</span>str) -> DBResult<Vec<i64>>;
|
||||
|
||||
<span class="doccomment">/// fetch PoWConfig solves</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">fetch_solve</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">user</span>: <span class="kw-2">&</span><span class="ident">str</span>, <span class="ident">key</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="ident">i64</span><span class="op">></span><span class="op">></span>;
|
||||
<span class="doccomment">/// fetch PoWConfig solves
|
||||
</span><span class="kw">async fn </span>fetch_solve(<span class="kw-2">&</span><span class="self">self</span>, user: <span class="kw-2">&</span>str, key: <span class="kw-2">&</span>str) -> DBResult<Vec<i64>>;
|
||||
|
||||
<span class="doccomment">/// fetch PoWConfig confirms</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">fetch_confirm</span>(<span class="kw-2">&</span><span class="self">self</span>, <span class="ident">user</span>: <span class="kw-2">&</span><span class="ident">str</span>, <span class="ident">key</span>: <span class="kw-2">&</span><span class="ident">str</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident">Vec</span><span class="op"><</span><span class="ident">i64</span><span class="op">></span><span class="op">></span>;
|
||||
<span class="doccomment">/// fetch PoWConfig confirms
|
||||
</span><span class="kw">async fn </span>fetch_confirm(<span class="kw-2">&</span><span class="self">self</span>, user: <span class="kw-2">&</span>str, key: <span class="kw-2">&</span>str) -> DBResult<Vec<i64>>;
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">Clone</span>, <span class="ident">Default</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>, <span class="ident">PartialEq</span>)]</span>
|
||||
<span class="doccomment">/// Captcha statistics with time recorded in UNIX epoch formats</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">StatsUnixTimestamp</span> {
|
||||
<span class="doccomment">/// times at which the configuration were fetched</span>
|
||||
<span class="kw">pub</span> <span class="ident">config_fetches</span>: <span class="ident">Vec</span><span class="op"><</span><span class="ident">i64</span><span class="op">></span>,
|
||||
<span class="doccomment">/// times at which the PoW was solved</span>
|
||||
<span class="kw">pub</span> <span class="ident">solves</span>: <span class="ident">Vec</span><span class="op"><</span><span class="ident">i64</span><span class="op">></span>,
|
||||
<span class="doccomment">/// times at which the PoW token was verified</span>
|
||||
<span class="kw">pub</span> <span class="ident">confirms</span>: <span class="ident">Vec</span><span class="op"><</span><span class="ident">i64</span><span class="op">></span>,
|
||||
<span class="attribute">#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq)]
|
||||
</span><span class="doccomment">/// Captcha statistics with time recorded in UNIX epoch formats
|
||||
</span><span class="kw">pub struct </span>StatsUnixTimestamp {
|
||||
<span class="doccomment">/// times at which the configuration were fetched
|
||||
</span><span class="kw">pub </span>config_fetches: Vec<i64>,
|
||||
<span class="doccomment">/// times at which the PoW was solved
|
||||
</span><span class="kw">pub </span>solves: Vec<i64>,
|
||||
<span class="doccomment">/// times at which the PoW token was verified
|
||||
</span><span class="kw">pub </span>confirms: Vec<i64>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">Clone</span>, <span class="ident">Default</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>, <span class="ident">PartialEq</span>)]</span>
|
||||
<span class="doccomment">/// Represents notification</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Notification</span> {
|
||||
<span class="doccomment">/// receiver name of the notification</span>
|
||||
<span class="kw">pub</span> <span class="ident">name</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">String</span><span class="op">></span>,
|
||||
<span class="doccomment">/// heading of the notification</span>
|
||||
<span class="kw">pub</span> <span class="ident">heading</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">String</span><span class="op">></span>,
|
||||
<span class="doccomment">/// message of the notification</span>
|
||||
<span class="kw">pub</span> <span class="ident">message</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">String</span><span class="op">></span>,
|
||||
<span class="doccomment">/// when notification was received</span>
|
||||
<span class="kw">pub</span> <span class="ident">received</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">i64</span><span class="op">></span>,
|
||||
<span class="doccomment">/// db assigned ID of the notification</span>
|
||||
<span class="kw">pub</span> <span class="ident">id</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">i32</span><span class="op">></span>,
|
||||
<span class="attribute">#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq)]
|
||||
</span><span class="doccomment">/// Represents notification
|
||||
</span><span class="kw">pub struct </span>Notification {
|
||||
<span class="doccomment">/// receiver name of the notification
|
||||
</span><span class="kw">pub </span>name: <span class="prelude-ty">Option</span><String>,
|
||||
<span class="doccomment">/// heading of the notification
|
||||
</span><span class="kw">pub </span>heading: <span class="prelude-ty">Option</span><String>,
|
||||
<span class="doccomment">/// message of the notification
|
||||
</span><span class="kw">pub </span>message: <span class="prelude-ty">Option</span><String>,
|
||||
<span class="doccomment">/// when notification was received
|
||||
</span><span class="kw">pub </span>received: <span class="prelude-ty">Option</span><i64>,
|
||||
<span class="doccomment">/// db assigned ID of the notification
|
||||
</span><span class="kw">pub </span>id: <span class="prelude-ty">Option</span><i32>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Debug</span>, <span class="ident">Clone</span>, <span class="ident">Default</span>, <span class="ident">PartialEq</span>, <span class="ident">Serialize</span>, <span class="ident">Deserialize</span>)]</span>
|
||||
<span class="doccomment">/// Data required to add notification</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">AddNotification</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> {
|
||||
<span class="doccomment">/// who is the notification addressed to?</span>
|
||||
<span class="kw">pub</span> <span class="ident">to</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="doccomment">/// notification sender</span>
|
||||
<span class="kw">pub</span> <span class="ident">from</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="doccomment">/// heading of the notification</span>
|
||||
<span class="kw">pub</span> <span class="ident">heading</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="doccomment">/// message of the notification</span>
|
||||
<span class="kw">pub</span> <span class="ident">message</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="attribute">#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
|
||||
</span><span class="doccomment">/// Data required to add notification
|
||||
</span><span class="kw">pub struct </span>AddNotification<<span class="lifetime">'a</span>> {
|
||||
<span class="doccomment">/// who is the notification addressed to?
|
||||
</span><span class="kw">pub </span>to: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
<span class="doccomment">/// notification sender
|
||||
</span><span class="kw">pub </span>from: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
<span class="doccomment">/// heading of the notification
|
||||
</span><span class="kw">pub </span>heading: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
<span class="doccomment">/// message of the notification
|
||||
</span><span class="kw">pub </span>message: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Default</span>, <span class="ident">PartialEq</span>, <span class="ident">Serialize</span>, <span class="ident">Deserialize</span>, <span class="ident">Clone</span>, <span class="ident">Debug</span>)]</span>
|
||||
<span class="doccomment">/// User's traffic pattern; used in generating a captcha configuration</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">TrafficPattern</span> {
|
||||
<span class="doccomment">/// average traffic of user's website</span>
|
||||
<span class="kw">pub</span> <span class="ident">avg_traffic</span>: <span class="ident">u32</span>,
|
||||
<span class="doccomment">/// the peak traffic that the user's website can handle</span>
|
||||
<span class="kw">pub</span> <span class="ident">peak_sustainable_traffic</span>: <span class="ident">u32</span>,
|
||||
<span class="doccomment">/// traffic that bought the user's website down; optional</span>
|
||||
<span class="kw">pub</span> <span class="ident">broke_my_site_traffic</span>: <span class="prelude-ty">Option</span><span class="op"><</span><span class="ident">u32</span><span class="op">></span>,
|
||||
<span class="attribute">#[derive(Default, PartialEq, Serialize, Deserialize, Clone, Debug)]
|
||||
</span><span class="doccomment">/// User's traffic pattern; used in generating a captcha configuration
|
||||
</span><span class="kw">pub struct </span>TrafficPattern {
|
||||
<span class="doccomment">/// average traffic of user's website
|
||||
</span><span class="kw">pub </span>avg_traffic: u32,
|
||||
<span class="doccomment">/// the peak traffic that the user's website can handle
|
||||
</span><span class="kw">pub </span>peak_sustainable_traffic: u32,
|
||||
<span class="doccomment">/// traffic that bought the user's website down; optional
|
||||
</span><span class="kw">pub </span>broke_my_site_traffic: <span class="prelude-ty">Option</span><u32>,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Default</span>, <span class="ident">PartialEq</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>)]</span>
|
||||
<span class="doccomment">/// data required to create new captcha</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">CreateCaptcha</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span> {
|
||||
<span class="doccomment">/// cool down duration</span>
|
||||
<span class="kw">pub</span> <span class="ident">duration</span>: <span class="ident">i32</span>,
|
||||
<span class="doccomment">/// description of the captcha</span>
|
||||
<span class="kw">pub</span> <span class="ident">description</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="doccomment">/// secret key of the captcha</span>
|
||||
<span class="kw">pub</span> <span class="ident">key</span>: <span class="kw-2">&</span><span class="lifetime">'a</span> <span class="ident">str</span>,
|
||||
<span class="attribute">#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
|
||||
</span><span class="doccomment">/// data required to create new captcha
|
||||
</span><span class="kw">pub struct </span>CreateCaptcha<<span class="lifetime">'a</span>> {
|
||||
<span class="doccomment">/// cool down duration
|
||||
</span><span class="kw">pub </span>duration: i32,
|
||||
<span class="doccomment">/// description of the captcha
|
||||
</span><span class="kw">pub </span>description: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
<span class="doccomment">/// secret key of the captcha
|
||||
</span><span class="kw">pub </span>key: <span class="kw-2">&</span><span class="lifetime">'a </span>str,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Default</span>, <span class="ident">PartialEq</span>, <span class="ident">Deserialize</span>, <span class="ident">Serialize</span>)]</span>
|
||||
<span class="doccomment">/// Data representing a captcha</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Captcha</span> {
|
||||
<span class="doccomment">/// Database assigned ID</span>
|
||||
<span class="kw">pub</span> <span class="ident">config_id</span>: <span class="ident">i32</span>,
|
||||
<span class="doccomment">/// cool down duration</span>
|
||||
<span class="kw">pub</span> <span class="ident">duration</span>: <span class="ident">i32</span>,
|
||||
<span class="doccomment">/// description of the captcha</span>
|
||||
<span class="kw">pub</span> <span class="ident">description</span>: <span class="ident">String</span>,
|
||||
<span class="doccomment">/// secret key of the captcha</span>
|
||||
<span class="kw">pub</span> <span class="ident">key</span>: <span class="ident">String</span>,
|
||||
<span class="attribute">#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
|
||||
</span><span class="doccomment">/// Data representing a captcha
|
||||
</span><span class="kw">pub struct </span>Captcha {
|
||||
<span class="doccomment">/// Database assigned ID
|
||||
</span><span class="kw">pub </span>config_id: i32,
|
||||
<span class="doccomment">/// cool down duration
|
||||
</span><span class="kw">pub </span>duration: i32,
|
||||
<span class="doccomment">/// description of the captcha
|
||||
</span><span class="kw">pub </span>description: String,
|
||||
<span class="doccomment">/// secret key of the captcha
|
||||
</span><span class="kw">pub </span>key: String,
|
||||
}
|
||||
|
||||
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>, <span class="ident">Debug</span>, <span class="ident">Deserialize</span>, <span class="ident">PartialEq</span>, <span class="ident">Default</span>, <span class="ident">Serialize</span>)]</span>
|
||||
<span class="doccomment">/// datastructure representing a user's secret</span>
|
||||
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">Secret</span> {
|
||||
<span class="doccomment">/// user's secret</span>
|
||||
<span class="kw">pub</span> <span class="ident">secret</span>: <span class="ident">String</span>,
|
||||
<span class="attribute">#[derive(Clone, Debug, Deserialize, PartialEq, Default, Serialize)]
|
||||
</span><span class="doccomment">/// datastructure representing a user's secret
|
||||
</span><span class="kw">pub struct </span>Secret {
|
||||
<span class="doccomment">/// user's secret
|
||||
</span><span class="kw">pub </span>secret: String,
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Trait to clone MCDatabase</span>
|
||||
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">CloneSPDatabase</span> {
|
||||
<span class="doccomment">/// clone DB</span>
|
||||
<span class="kw">fn</span> <span class="ident">clone_db</span>(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">MCDatabase</span><span class="op">></span>;
|
||||
<span class="doccomment">/// Trait to clone MCDatabase
|
||||
</span><span class="kw">pub trait </span>CloneSPDatabase {
|
||||
<span class="doccomment">/// clone DB
|
||||
</span><span class="kw">fn </span>clone_db(<span class="kw-2">&</span><span class="self">self</span>) -> Box<<span class="kw">dyn </span>MCDatabase>;
|
||||
}
|
||||
|
||||
<span class="kw">impl</span><span class="op"><</span><span class="ident">T</span><span class="op">></span> <span class="ident">CloneSPDatabase</span> <span class="kw">for</span> <span class="ident">T</span>
|
||||
<span class="kw">where</span>
|
||||
<span class="ident">T</span>: <span class="ident">MCDatabase</span> <span class="op">+</span> <span class="ident">Clone</span> <span class="op">+</span> <span class="lifetime">'static</span>,
|
||||
<span class="kw">impl</span><T> CloneSPDatabase <span class="kw">for </span>T
|
||||
<span class="kw">where
|
||||
</span>T: MCDatabase + Clone + <span class="lifetime">'static</span>,
|
||||
{
|
||||
<span class="kw">fn</span> <span class="ident">clone_db</span>(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">MCDatabase</span><span class="op">></span> {
|
||||
<span class="ident">Box::new</span>(<span class="self">self</span>.<span class="ident">clone</span>())
|
||||
<span class="kw">fn </span>clone_db(<span class="kw-2">&</span><span class="self">self</span>) -> Box<<span class="kw">dyn </span>MCDatabase> {
|
||||
Box::new(<span class="self">self</span>.clone())
|
||||
}
|
||||
}
|
||||
|
||||
<span class="kw">impl</span> <span class="ident">Clone</span> <span class="kw">for</span> <span class="ident">Box</span><span class="op"><</span><span class="kw">dyn</span> <span class="ident">MCDatabase</span><span class="op">></span> {
|
||||
<span class="kw">fn</span> <span class="ident">clone</span>(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="self">Self</span> {
|
||||
(<span class="kw-2">*</span><span class="kw-2">*</span><span class="self">self</span>).<span class="ident">clone_db</span>()
|
||||
<span class="kw">impl </span>Clone <span class="kw">for </span>Box<<span class="kw">dyn </span>MCDatabase> {
|
||||
<span class="kw">fn </span>clone(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="self">Self </span>{
|
||||
(<span class="kw-2">**</span><span class="self">self</span>).clone_db()
|
||||
}
|
||||
}
|
||||
</code></pre></div>
|
||||
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="db_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.64.0 (a55dd71d5 2022-09-19)" ></div></body></html>
|
||||
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="db_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.65.0 (897e37553 2022-11-02)" ></div></body></html>
|
||||
@@ -1,4 +1,4 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `db/db-core/src/ops.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>ops.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../../dark.css" disabled><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../db_core/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `db/db-core/src/ops.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>ops.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../../normalize.css"><link rel="stylesheet" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../../ayu.css" disabled><link rel="stylesheet" href="../../dark.css" disabled><link rel="stylesheet" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../db_core/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
|
||||
<span id="2">2</span>
|
||||
<span id="3">3</span>
|
||||
<span id="4">4</span>
|
||||
@@ -62,39 +62,39 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/</span>
|
||||
<span class="doccomment">//! meta operations like migration and connecting to a database</span>
|
||||
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::dev</span>::<span class="kw-2">*</span>;
|
||||
*/
|
||||
</span><span class="doccomment">//! meta operations like migration and connecting to a database
|
||||
</span><span class="kw">use </span><span class="kw">crate</span>::dev::<span class="kw-2">*</span>;
|
||||
|
||||
<span class="doccomment">/// Database operations trait(migrations, pool creation and fetching connection from pool)</span>
|
||||
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">DBOps</span>: <span class="ident">GetConnection</span> <span class="op">+</span> <span class="ident">Migrate</span> {}
|
||||
<span class="doccomment">/// Database operations trait(migrations, pool creation and fetching connection from pool)
|
||||
</span><span class="kw">pub trait </span>DBOps: GetConnection + Migrate {}
|
||||
|
||||
<span class="doccomment">/// Get database connection</span>
|
||||
<span class="attribute">#[<span class="ident">async_trait</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">GetConnection</span> {
|
||||
<span class="doccomment">/// database connection type</span>
|
||||
<span class="kw">type</span> <span class="ident">Conn</span>;
|
||||
<span class="doccomment">/// database specific error-type</span>
|
||||
<span class="doccomment">/// get connection from connection pool</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">get_conn</span>(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident"><span class="self">Self</span>::Conn</span><span class="op">></span>;
|
||||
<span class="doccomment">/// Get database connection
|
||||
</span><span class="attribute">#[async_trait]
|
||||
</span><span class="kw">pub trait </span>GetConnection {
|
||||
<span class="doccomment">/// database connection type
|
||||
</span><span class="kw">type </span>Conn;
|
||||
<span class="doccomment">/// database specific error-type
|
||||
/// get connection from connection pool
|
||||
</span><span class="kw">async fn </span>get_conn(<span class="kw-2">&</span><span class="self">self</span>) -> DBResult<<span class="self">Self</span>::Conn>;
|
||||
}
|
||||
|
||||
<span class="doccomment">/// Create database connection</span>
|
||||
<span class="attribute">#[<span class="ident">async_trait</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">Connect</span> {
|
||||
<span class="doccomment">/// database specific pool-type</span>
|
||||
<span class="kw">type</span> <span class="ident">Pool</span>: <span class="ident">MCDatabase</span>;
|
||||
<span class="doccomment">/// database specific error-type</span>
|
||||
<span class="doccomment">/// create connection pool</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">connect</span>(<span class="self">self</span>) -> <span class="ident">DBResult</span><span class="op"><</span><span class="ident"><span class="self">Self</span>::Pool</span><span class="op">></span>;
|
||||
<span class="doccomment">/// Create database connection
|
||||
</span><span class="attribute">#[async_trait]
|
||||
</span><span class="kw">pub trait </span>Connect {
|
||||
<span class="doccomment">/// database specific pool-type
|
||||
</span><span class="kw">type </span>Pool: MCDatabase;
|
||||
<span class="doccomment">/// database specific error-type
|
||||
/// create connection pool
|
||||
</span><span class="kw">async fn </span>connect(<span class="self">self</span>) -> DBResult<<span class="self">Self</span>::Pool>;
|
||||
}
|
||||
|
||||
<span class="doccomment">/// database migrations</span>
|
||||
<span class="attribute">#[<span class="ident">async_trait</span>]</span>
|
||||
<span class="kw">pub</span> <span class="kw">trait</span> <span class="ident">Migrate</span>: <span class="ident">MCDatabase</span> {
|
||||
<span class="doccomment">/// database specific error-type</span>
|
||||
<span class="doccomment">/// run migrations</span>
|
||||
<span class="kw">async</span> <span class="kw">fn</span> <span class="ident">migrate</span>(<span class="kw-2">&</span><span class="self">self</span>) -> <span class="ident">DBResult</span><span class="op"><</span>()<span class="op">></span>;
|
||||
<span class="doccomment">/// database migrations
|
||||
</span><span class="attribute">#[async_trait]
|
||||
</span><span class="kw">pub trait </span>Migrate: MCDatabase {
|
||||
<span class="doccomment">/// database specific error-type
|
||||
/// run migrations
|
||||
</span><span class="kw">async fn </span>migrate(<span class="kw-2">&</span><span class="self">self</span>) -> DBResult<()>;
|
||||
}
|
||||
</code></pre></div>
|
||||
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="db_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.64.0 (a55dd71d5 2022-09-19)" ></div></body></html>
|
||||
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="db_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.65.0 (897e37553 2022-11-02)" ></div></body></html>
|
||||
@@ -1,4 +1,4 @@
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `db/db-core/src/tests.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>tests.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../../dark.css" disabled><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../db_core/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `db/db-core/src/tests.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>tests.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" href="../../normalize.css"><link rel="stylesheet" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" href="../../ayu.css" disabled><link rel="stylesheet" href="../../dark.css" disabled><link rel="stylesheet" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a><h2 class="location"></h2></nav><nav class="sidebar"><a class="sidebar-logo" href="../../db_core/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div></a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../db_core/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1"><a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
|
||||
<span id="2">2</span>
|
||||
<span id="3">3</span>
|
||||
<span id="4">4</span>
|
||||
@@ -311,226 +311,226 @@
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/</span>
|
||||
<span class="doccomment">//! Test utilities</span>
|
||||
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::errors</span>::<span class="kw-2">*</span>;
|
||||
<span class="kw">use</span> <span class="ident"><span class="kw">crate</span>::prelude</span>::<span class="kw-2">*</span>;
|
||||
*/
|
||||
</span><span class="doccomment">//! Test utilities
|
||||
</span><span class="kw">use </span><span class="kw">crate</span>::errors::<span class="kw-2">*</span>;
|
||||
<span class="kw">use </span><span class="kw">crate</span>::prelude::<span class="kw-2">*</span>;
|
||||
|
||||
<span class="doccomment">/// test all database functions</span>
|
||||
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">database_works</span><span class="op"><</span><span class="lifetime">'a</span>, <span class="ident">T</span>: <span class="ident">MCDatabase</span><span class="op">></span>(
|
||||
<span class="ident">db</span>: <span class="kw-2">&</span><span class="ident">T</span>,
|
||||
<span class="ident">p</span>: <span class="kw-2">&</span><span class="ident">Register</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span>,
|
||||
<span class="ident">c</span>: <span class="kw-2">&</span><span class="ident">CreateCaptcha</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span>,
|
||||
<span class="ident">l</span>: <span class="kw-2">&</span>[<span class="ident">Level</span>],
|
||||
<span class="ident">tp</span>: <span class="kw-2">&</span><span class="ident">TrafficPattern</span>,
|
||||
<span class="ident">an</span>: <span class="kw-2">&</span><span class="ident">AddNotification</span><span class="op"><</span><span class="lifetime">'a</span><span class="op">></span>,
|
||||
<span class="doccomment">/// test all database functions
|
||||
</span><span class="kw">pub async fn </span>database_works<<span class="lifetime">'a</span>, T: MCDatabase>(
|
||||
db: <span class="kw-2">&</span>T,
|
||||
p: <span class="kw-2">&</span>Register<<span class="lifetime">'a</span>>,
|
||||
c: <span class="kw-2">&</span>CreateCaptcha<<span class="lifetime">'a</span>>,
|
||||
l: <span class="kw-2">&</span>[Level],
|
||||
tp: <span class="kw-2">&</span>TrafficPattern,
|
||||
an: <span class="kw-2">&</span>AddNotification<<span class="lifetime">'a</span>>,
|
||||
) {
|
||||
<span class="macro">assert!</span>(<span class="ident">db</span>.<span class="ident">ping</span>().<span class="kw">await</span>, <span class="string">"ping test"</span>);
|
||||
<span class="macro">assert!</span>(db.ping().<span class="kw">await</span>, <span class="string">"ping test"</span>);
|
||||
|
||||
<span class="kw">if</span> <span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>() {
|
||||
<span class="ident">db</span>.<span class="ident">delete_user</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="kw">if </span>db.username_exists(p.username).<span class="kw">await</span>.unwrap() {
|
||||
db.delete_user(p.username).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="op">!</span><span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
|
||||
<span class="string">"user is deleted so username shouldn't exist"</span>
|
||||
);
|
||||
!db.username_exists(p.username).<span class="kw">await</span>.unwrap(),
|
||||
<span class="string">"user is deleted so username shouldn't exist"
|
||||
</span>);
|
||||
}
|
||||
|
||||
<span class="macro">assert!</span>(<span class="macro">matches!</span>(
|
||||
<span class="ident">db</span>.<span class="ident">get_secret</span>(<span class="kw-2">&</span><span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>,
|
||||
<span class="prelude-val">Err</span>(<span class="ident">DBError::AccountNotFound</span>)
|
||||
db.get_secret(<span class="kw-2">&</span>p.username).<span class="kw">await</span>,
|
||||
<span class="prelude-val">Err</span>(DBError::AccountNotFound)
|
||||
));
|
||||
|
||||
<span class="ident">db</span>.<span class="ident">register</span>(<span class="ident">p</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
db.register(p).<span class="kw">await</span>.unwrap();
|
||||
|
||||
<span class="macro">assert!</span>(<span class="macro">matches!</span>(<span class="ident">db</span>.<span class="ident">register</span>(<span class="kw-2">&</span><span class="ident">p</span>).<span class="kw">await</span>, <span class="prelude-val">Err</span>(<span class="ident">DBError::UsernameTaken</span>)));
|
||||
<span class="macro">assert!</span>(<span class="macro">matches!</span>(db.register(<span class="kw-2">&</span>p).<span class="kw">await</span>, <span class="prelude-val">Err</span>(DBError::UsernameTaken)));
|
||||
|
||||
<span class="comment">// testing get secret</span>
|
||||
<span class="kw">let</span> <span class="ident">secret</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_secret</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">secret</span>.<span class="ident">secret</span>, <span class="ident">p</span>.<span class="ident">secret</span>, <span class="string">"user secret matches"</span>);
|
||||
<span class="comment">// testing get secret
|
||||
</span><span class="kw">let </span>secret = db.get_secret(p.username).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(secret.secret, p.secret, <span class="string">"user secret matches"</span>);
|
||||
|
||||
<span class="comment">// testing update secret: setting secret = username</span>
|
||||
<span class="ident">db</span>.<span class="ident">update_secret</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="comment">// testing update secret: setting secret = username
|
||||
</span>db.update_secret(p.username, p.username).<span class="kw">await</span>.unwrap();
|
||||
|
||||
<span class="kw">let</span> <span class="ident">secret</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_secret</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="kw">let </span>secret = db.get_secret(p.username).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(
|
||||
<span class="ident">secret</span>.<span class="ident">secret</span>, <span class="ident">p</span>.<span class="ident">username</span>,
|
||||
<span class="string">"user secret matches username; as set by previous step"</span>
|
||||
secret.secret, p.username,
|
||||
<span class="string">"user secret matches username; as set by previous step"
|
||||
</span>);
|
||||
|
||||
<span class="comment">// testing get_password
|
||||
|
||||
// with username
|
||||
</span><span class="kw">let </span>name_hash = db.get_password(<span class="kw-2">&</span>Login::Username(p.username)).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(name_hash.hash, p.hash, <span class="string">"user password matches"</span>);
|
||||
|
||||
<span class="macro">assert_eq!</span>(name_hash.username, p.username, <span class="string">"username matches"</span>);
|
||||
|
||||
<span class="comment">// with email
|
||||
</span><span class="kw">let </span><span class="kw-2">mut </span>name_hash = db
|
||||
.get_password(<span class="kw-2">&</span>Login::Email(p.email.as_ref().unwrap()))
|
||||
.<span class="kw">await
|
||||
</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(name_hash.hash, p.hash, <span class="string">"user password matches"</span>);
|
||||
<span class="macro">assert_eq!</span>(name_hash.username, p.username, <span class="string">"username matches"</span>);
|
||||
|
||||
<span class="comment">// testing get_email
|
||||
</span><span class="macro">assert_eq!</span>(
|
||||
db.get_email(p.username)
|
||||
.<span class="kw">await
|
||||
</span>.unwrap()
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.as_str(),
|
||||
p.email.unwrap()
|
||||
);
|
||||
|
||||
<span class="comment">// testing get_password</span>
|
||||
<span class="comment">// testing email exists
|
||||
</span><span class="macro">assert!</span>(
|
||||
db.email_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
|
||||
<span class="string">"user is registered so email should exist"
|
||||
</span>);
|
||||
<span class="macro">assert!</span>(
|
||||
db.username_exists(p.username).<span class="kw">await</span>.unwrap(),
|
||||
<span class="string">"user is registered so username should exist"
|
||||
</span>);
|
||||
|
||||
<span class="comment">// with username</span>
|
||||
<span class="kw">let</span> <span class="ident">name_hash</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_password</span>(<span class="kw-2">&</span><span class="ident">Login::Username</span>(<span class="ident">p</span>.<span class="ident">username</span>)).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">name_hash</span>.<span class="ident">hash</span>, <span class="ident">p</span>.<span class="ident">hash</span>, <span class="string">"user password matches"</span>);
|
||||
<span class="comment">// update password test. setting password = username
|
||||
</span>name_hash.hash = name_hash.username.clone();
|
||||
db.update_password(<span class="kw-2">&</span>name_hash).<span class="kw">await</span>.unwrap();
|
||||
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">name_hash</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">username</span>, <span class="string">"username matches"</span>);
|
||||
|
||||
<span class="comment">// with email</span>
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">name_hash</span> <span class="op">=</span> <span class="ident">db</span>
|
||||
.<span class="ident">get_password</span>(<span class="kw-2">&</span><span class="ident">Login::Email</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()))
|
||||
.<span class="kw">await</span>
|
||||
.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">name_hash</span>.<span class="ident">hash</span>, <span class="ident">p</span>.<span class="ident">hash</span>, <span class="string">"user password matches"</span>);
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">name_hash</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">username</span>, <span class="string">"username matches"</span>);
|
||||
|
||||
<span class="comment">// testing get_email</span>
|
||||
<span class="kw">let </span>name_hash = db.get_password(<span class="kw-2">&</span>Login::Username(p.username)).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(
|
||||
<span class="ident">db</span>.<span class="ident">get_email</span>(<span class="ident">p</span>.<span class="ident">username</span>)
|
||||
.<span class="kw">await</span>
|
||||
.<span class="ident">unwrap</span>()
|
||||
.<span class="ident">as_ref</span>()
|
||||
.<span class="ident">unwrap</span>()
|
||||
.<span class="ident">as_str</span>(),
|
||||
<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">unwrap</span>()
|
||||
);
|
||||
name_hash.hash, p.username,
|
||||
<span class="string">"user password matches with changed value"
|
||||
</span>);
|
||||
<span class="macro">assert_eq!</span>(name_hash.username, p.username, <span class="string">"username matches"</span>);
|
||||
|
||||
<span class="comment">// testing email exists</span>
|
||||
<span class="comment">// update username to p.email
|
||||
</span><span class="macro">assert!</span>(
|
||||
!db.username_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
|
||||
<span class="string">"user with p.email doesn't exist. pre-check to update username to p.email"
|
||||
</span>);
|
||||
db.update_username(p.username, p.email.as_ref().unwrap())
|
||||
.<span class="kw">await
|
||||
</span>.unwrap();
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="ident">db</span>.<span class="ident">email_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
|
||||
<span class="string">"user is registered so email should exist"</span>
|
||||
);
|
||||
db.username_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
|
||||
<span class="string">"user with p.email exist post-update"
|
||||
</span>);
|
||||
|
||||
<span class="comment">// deleting user for re-registration with email = None
|
||||
</span>db.delete_user(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
|
||||
<span class="string">"user is registered so username should exist"</span>
|
||||
);
|
||||
!db.username_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
|
||||
<span class="string">"user is deleted so username shouldn't exist"
|
||||
</span>);
|
||||
|
||||
<span class="comment">// update password test. setting password = username</span>
|
||||
<span class="ident">name_hash</span>.<span class="ident">hash</span> <span class="op">=</span> <span class="ident">name_hash</span>.<span class="ident">username</span>.<span class="ident">clone</span>();
|
||||
<span class="ident">db</span>.<span class="ident">update_password</span>(<span class="kw-2">&</span><span class="ident">name_hash</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
|
||||
<span class="kw">let</span> <span class="ident">name_hash</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_password</span>(<span class="kw-2">&</span><span class="ident">Login::Username</span>(<span class="ident">p</span>.<span class="ident">username</span>)).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(
|
||||
<span class="ident">name_hash</span>.<span class="ident">hash</span>, <span class="ident">p</span>.<span class="ident">username</span>,
|
||||
<span class="string">"user password matches with changed value"</span>
|
||||
);
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">name_hash</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">username</span>, <span class="string">"username matches"</span>);
|
||||
|
||||
<span class="comment">// update username to p.email</span>
|
||||
<span class="comment">// register with email = None
|
||||
</span><span class="kw">let </span><span class="kw-2">mut </span>p2 = p.clone();
|
||||
p2.email = <span class="prelude-val">None</span>;
|
||||
db.register(<span class="kw-2">&</span>p2).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="op">!</span><span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
|
||||
<span class="string">"user with p.email doesn't exist. pre-check to update username to p.email"</span>
|
||||
);
|
||||
<span class="ident">db</span>.<span class="ident">update_username</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>())
|
||||
.<span class="kw">await</span>
|
||||
.<span class="ident">unwrap</span>();
|
||||
db.username_exists(p2.username).<span class="kw">await</span>.unwrap(),
|
||||
<span class="string">"user is registered so username should exist"
|
||||
</span>);
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
|
||||
<span class="string">"user with p.email exist post-update"</span>
|
||||
);
|
||||
!db.email_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
|
||||
<span class="string">"user registration with email is deleted; so email shouldn't exist"
|
||||
</span>);
|
||||
|
||||
<span class="comment">// deleting user for re-registration with email = None</span>
|
||||
<span class="ident">db</span>.<span class="ident">delete_user</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="op">!</span><span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
|
||||
<span class="string">"user is deleted so username shouldn't exist"</span>
|
||||
);
|
||||
<span class="comment">// testing get_email = None
|
||||
</span><span class="macro">assert_eq!</span>(db.get_email(p.username).<span class="kw">await</span>.unwrap(), <span class="prelude-val">None</span>);
|
||||
|
||||
<span class="comment">// register with email = None</span>
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">p2</span> <span class="op">=</span> <span class="ident">p</span>.<span class="ident">clone</span>();
|
||||
<span class="ident">p2</span>.<span class="ident">email</span> <span class="op">=</span> <span class="prelude-val">None</span>;
|
||||
<span class="ident">db</span>.<span class="ident">register</span>(<span class="kw-2">&</span><span class="ident">p2</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="ident">db</span>.<span class="ident">username_exists</span>(<span class="ident">p2</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
|
||||
<span class="string">"user is registered so username should exist"</span>
|
||||
);
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="op">!</span><span class="ident">db</span>.<span class="ident">email_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
|
||||
<span class="string">"user registration with email is deleted; so email shouldn't exist"</span>
|
||||
);
|
||||
|
||||
<span class="comment">// testing get_email = None</span>
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">db</span>.<span class="ident">get_email</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(), <span class="prelude-val">None</span>);
|
||||
|
||||
<span class="comment">// testing update email</span>
|
||||
<span class="kw">let</span> <span class="ident">update_email</span> <span class="op">=</span> <span class="ident">UpdateEmail</span> {
|
||||
<span class="ident">username</span>: <span class="ident">p</span>.<span class="ident">username</span>,
|
||||
<span class="ident">new_email</span>: <span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>(),
|
||||
<span class="comment">// testing update email
|
||||
</span><span class="kw">let </span>update_email = UpdateEmail {
|
||||
username: p.username,
|
||||
new_email: p.email.as_ref().unwrap(),
|
||||
};
|
||||
<span class="ident">db</span>.<span class="ident">update_email</span>(<span class="kw-2">&</span><span class="ident">update_email</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
db.update_email(<span class="kw-2">&</span>update_email).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">println!</span>(
|
||||
<span class="string">"null user email: {}"</span>,
|
||||
<span class="ident">db</span>.<span class="ident">email_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>()
|
||||
db.email_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap()
|
||||
);
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="ident">db</span>.<span class="ident">email_exists</span>(<span class="ident">p</span>.<span class="ident">email</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>()).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
|
||||
<span class="string">"user was with empty email but email is set; so email should exist"</span>
|
||||
);
|
||||
db.email_exists(p.email.as_ref().unwrap()).<span class="kw">await</span>.unwrap(),
|
||||
<span class="string">"user was with empty email but email is set; so email should exist"
|
||||
</span>);
|
||||
|
||||
<span class="comment">/*
|
||||
* test notification workflows
|
||||
* 1. Add notifications: a minimum of two, to mark as read and test if it has affected it
|
||||
* 2. Get unread notifications
|
||||
* 3. Mark a notification read, check if it has affected Step #2
|
||||
*/</span>
|
||||
*/
|
||||
|
||||
<span class="comment">// 1. add notification</span>
|
||||
<span class="ident">db</span>.<span class="ident">create_notification</span>(<span class="ident">an</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="ident">db</span>.<span class="ident">create_notification</span>(<span class="ident">an</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
// 1. add notification
|
||||
</span>db.create_notification(an).<span class="kw">await</span>.unwrap();
|
||||
db.create_notification(an).<span class="kw">await</span>.unwrap();
|
||||
|
||||
<span class="comment">// 2. Get notifications</span>
|
||||
<span class="kw">let</span> <span class="ident">notifications</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_all_unread_notifications</span>(<span class="ident">an</span>.<span class="ident">to</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">notifications</span>.<span class="ident">len</span>(), <span class="number">2</span>);
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">notifications</span>[<span class="number">0</span>].<span class="ident">heading</span>.<span class="ident">as_ref</span>().<span class="ident">unwrap</span>(), <span class="ident">an</span>.<span class="ident">heading</span>);
|
||||
<span class="comment">// 2. Get notifications
|
||||
</span><span class="kw">let </span>notifications = db.get_all_unread_notifications(an.to).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(notifications.len(), <span class="number">2</span>);
|
||||
<span class="macro">assert_eq!</span>(notifications[<span class="number">0</span>].heading.as_ref().unwrap(), an.heading);
|
||||
|
||||
<span class="comment">// 3. mark a notification read</span>
|
||||
<span class="ident">db</span>.<span class="ident">mark_notification_read</span>(<span class="ident">an</span>.<span class="ident">to</span>, <span class="ident">notifications</span>[<span class="number">0</span>].<span class="ident">id</span>.<span class="ident">unwrap</span>())
|
||||
.<span class="kw">await</span>
|
||||
.<span class="ident">unwrap</span>();
|
||||
<span class="kw">let</span> <span class="ident">new_notifications</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_all_unread_notifications</span>(<span class="ident">an</span>.<span class="ident">to</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">new_notifications</span>.<span class="ident">len</span>(), <span class="number">1</span>);
|
||||
<span class="comment">// 3. mark a notification read
|
||||
</span>db.mark_notification_read(an.to, notifications[<span class="number">0</span>].id.unwrap())
|
||||
.<span class="kw">await
|
||||
</span>.unwrap();
|
||||
<span class="kw">let </span>new_notifications = db.get_all_unread_notifications(an.to).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(new_notifications.len(), <span class="number">1</span>);
|
||||
|
||||
<span class="comment">// create captcha</span>
|
||||
<span class="ident">db</span>.<span class="ident">create_captcha</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert!</span>(<span class="ident">db</span>.<span class="ident">captcha_exists</span>(<span class="prelude-val">None</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>());
|
||||
<span class="macro">assert!</span>(<span class="ident">db</span>.<span class="ident">captcha_exists</span>(<span class="prelude-val">Some</span>(<span class="ident">p</span>.<span class="ident">username</span>), <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>());
|
||||
<span class="comment">// create captcha
|
||||
</span>db.create_captcha(p.username, c).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert!</span>(db.captcha_exists(<span class="prelude-val">None</span>, c.key).<span class="kw">await</span>.unwrap());
|
||||
<span class="macro">assert!</span>(db.captcha_exists(<span class="prelude-val">Some</span>(p.username), c.key).<span class="kw">await</span>.unwrap());
|
||||
|
||||
<span class="comment">// get secret from captcha key</span>
|
||||
<span class="kw">let</span> <span class="ident">secret_from_captcha</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_secret_from_captcha</span>(<span class="kw-2">&</span><span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">secret_from_captcha</span>.<span class="ident">secret</span>, <span class="ident">p</span>.<span class="ident">secret</span>, <span class="string">"user secret matches"</span>);
|
||||
<span class="comment">// get secret from captcha key
|
||||
</span><span class="kw">let </span>secret_from_captcha = db.get_secret_from_captcha(<span class="kw-2">&</span>c.key).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(secret_from_captcha.secret, p.secret, <span class="string">"user secret matches"</span>);
|
||||
|
||||
<span class="comment">// get captcha configuration</span>
|
||||
<span class="kw">let</span> <span class="ident">captcha</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_captcha_config</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">captcha</span>.<span class="ident">key</span>, <span class="ident">c</span>.<span class="ident">key</span>);
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">captcha</span>.<span class="ident">duration</span>, <span class="ident">c</span>.<span class="ident">duration</span>);
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">captcha</span>.<span class="ident">description</span>, <span class="ident">c</span>.<span class="ident">description</span>);
|
||||
<span class="comment">// get captcha configuration
|
||||
</span><span class="kw">let </span>captcha = db.get_captcha_config(p.username, c.key).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(captcha.key, c.key);
|
||||
<span class="macro">assert_eq!</span>(captcha.duration, c.duration);
|
||||
<span class="macro">assert_eq!</span>(captcha.description, c.description);
|
||||
|
||||
<span class="comment">// get all captchas that belong to user</span>
|
||||
<span class="kw">let</span> <span class="ident">all_user_captchas</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_all_user_captchas</span>(<span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">all_user_captchas</span>.<span class="ident">len</span>(), <span class="number">1</span>);
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">all_user_captchas</span>[<span class="number">0</span>], <span class="ident">captcha</span>);
|
||||
<span class="comment">// get all captchas that belong to user
|
||||
</span><span class="kw">let </span>all_user_captchas = db.get_all_user_captchas(p.username).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(all_user_captchas.len(), <span class="number">1</span>);
|
||||
<span class="macro">assert_eq!</span>(all_user_captchas[<span class="number">0</span>], captcha);
|
||||
|
||||
<span class="comment">// get captcha cooldown duration</span>
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">db</span>.<span class="ident">get_captcha_cooldown</span>(<span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(), <span class="ident">c</span>.<span class="ident">duration</span>);
|
||||
<span class="comment">// get captcha cooldown duration
|
||||
</span><span class="macro">assert_eq!</span>(db.get_captcha_cooldown(c.key).<span class="kw">await</span>.unwrap(), c.duration);
|
||||
|
||||
<span class="comment">// add traffic pattern</span>
|
||||
<span class="ident">db</span>.<span class="ident">add_traffic_pattern</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>, <span class="ident">tp</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="comment">// add traffic pattern
|
||||
</span>db.add_traffic_pattern(p.username, c.key, tp).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(
|
||||
<span class="kw-2">&</span><span class="ident">db</span>.<span class="ident">get_traffic_pattern</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>(),
|
||||
<span class="ident">tp</span>
|
||||
<span class="kw-2">&</span>db.get_traffic_pattern(p.username, c.key).<span class="kw">await</span>.unwrap(),
|
||||
tp
|
||||
);
|
||||
|
||||
<span class="comment">// delete traffic pattern</span>
|
||||
<span class="ident">db</span>.<span class="ident">delete_traffic_pattern</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="comment">// delete traffic pattern
|
||||
</span>db.delete_traffic_pattern(p.username, c.key).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert!</span>(
|
||||
<span class="macro">matches!</span>(
|
||||
<span class="ident">db</span>.<span class="ident">get_traffic_pattern</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>,
|
||||
<span class="prelude-val">Err</span>(<span class="ident">DBError::TrafficPatternNotFound</span>)
|
||||
db.get_traffic_pattern(p.username, c.key).<span class="kw">await</span>,
|
||||
<span class="prelude-val">Err</span>(DBError::TrafficPatternNotFound)
|
||||
),
|
||||
<span class="string">"deletion successful; traffic pattern no longer exists"</span>
|
||||
);
|
||||
<span class="string">"deletion successful; traffic pattern no longer exists"
|
||||
</span>);
|
||||
|
||||
<span class="comment">// add captcha levels</span>
|
||||
<span class="ident">db</span>.<span class="ident">add_captcha_levels</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>, <span class="ident">l</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="comment">// add captcha levels
|
||||
</span>db.add_captcha_levels(p.username, c.key, l).<span class="kw">await</span>.unwrap();
|
||||
|
||||
<span class="comment">// get captcha levels with username</span>
|
||||
<span class="kw">let</span> <span class="ident">levels</span> <span class="op">=</span> <span class="ident">db</span>
|
||||
.<span class="ident">get_captcha_levels</span>(<span class="prelude-val">Some</span>(<span class="ident">p</span>.<span class="ident">username</span>), <span class="ident">c</span>.<span class="ident">key</span>)
|
||||
.<span class="kw">await</span>
|
||||
.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">levels</span>, <span class="ident">l</span>);
|
||||
<span class="comment">// get captcha levels without username</span>
|
||||
<span class="kw">let</span> <span class="ident">levels</span> <span class="op">=</span> <span class="ident">db</span>.<span class="ident">get_captcha_levels</span>(<span class="prelude-val">None</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">levels</span>, <span class="ident">l</span>);
|
||||
<span class="comment">// get captcha levels with username
|
||||
</span><span class="kw">let </span>levels = db
|
||||
.get_captcha_levels(<span class="prelude-val">Some</span>(p.username), c.key)
|
||||
.<span class="kw">await
|
||||
</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(levels, l);
|
||||
<span class="comment">// get captcha levels without username
|
||||
</span><span class="kw">let </span>levels = db.get_captcha_levels(<span class="prelude-val">None</span>, c.key).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert_eq!</span>(levels, l);
|
||||
|
||||
<span class="comment">/*
|
||||
* Test stats
|
||||
@@ -540,59 +540,59 @@
|
||||
* 4. fetch config fetches
|
||||
* 5. fetch solves
|
||||
* 6. fetch token verify
|
||||
*/</span>
|
||||
*/
|
||||
|
||||
<span class="macro">assert!</span>(<span class="ident">db</span>
|
||||
.<span class="ident">fetch_config_fetched</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>)
|
||||
.<span class="kw">await</span>
|
||||
.<span class="ident">unwrap</span>()
|
||||
.<span class="ident">is_empty</span>());
|
||||
<span class="macro">assert!</span>(<span class="ident">db</span>.<span class="ident">fetch_solve</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>().<span class="ident">is_empty</span>());
|
||||
<span class="macro">assert!</span>(<span class="ident">db</span>
|
||||
.<span class="ident">fetch_confirm</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>)
|
||||
.<span class="kw">await</span>
|
||||
.<span class="ident">unwrap</span>()
|
||||
.<span class="ident">is_empty</span>());
|
||||
</span><span class="macro">assert!</span>(db
|
||||
.fetch_config_fetched(p.username, c.key)
|
||||
.<span class="kw">await
|
||||
</span>.unwrap()
|
||||
.is_empty());
|
||||
<span class="macro">assert!</span>(db.fetch_solve(p.username, c.key).<span class="kw">await</span>.unwrap().is_empty());
|
||||
<span class="macro">assert!</span>(db
|
||||
.fetch_confirm(p.username, c.key)
|
||||
.<span class="kw">await
|
||||
</span>.unwrap()
|
||||
.is_empty());
|
||||
|
||||
<span class="ident">db</span>.<span class="ident">record_fetch</span>(<span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="ident">db</span>.<span class="ident">record_solve</span>(<span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="ident">db</span>.<span class="ident">record_confirm</span>(<span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
db.record_fetch(c.key).<span class="kw">await</span>.unwrap();
|
||||
db.record_solve(c.key).<span class="kw">await</span>.unwrap();
|
||||
db.record_confirm(c.key).<span class="kw">await</span>.unwrap();
|
||||
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">db</span>.<span class="ident">fetch_solve</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>().<span class="ident">len</span>(), <span class="number">1</span>);
|
||||
<span class="macro">assert_eq!</span>(db.fetch_solve(p.username, c.key).<span class="kw">await</span>.unwrap().len(), <span class="number">1</span>);
|
||||
<span class="macro">assert_eq!</span>(
|
||||
<span class="ident">db</span>.<span class="ident">fetch_config_fetched</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>)
|
||||
.<span class="kw">await</span>
|
||||
.<span class="ident">unwrap</span>()
|
||||
.<span class="ident">len</span>(),
|
||||
<span class="number">1</span>
|
||||
);
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">db</span>.<span class="ident">fetch_solve</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>().<span class="ident">len</span>(), <span class="number">1</span>);
|
||||
<span class="macro">assert_eq!</span>(<span class="ident">db</span>.<span class="ident">fetch_confirm</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>().<span class="ident">len</span>(), <span class="number">1</span>);
|
||||
db.fetch_config_fetched(p.username, c.key)
|
||||
.<span class="kw">await
|
||||
</span>.unwrap()
|
||||
.len(),
|
||||
<span class="number">1
|
||||
</span>);
|
||||
<span class="macro">assert_eq!</span>(db.fetch_solve(p.username, c.key).<span class="kw">await</span>.unwrap().len(), <span class="number">1</span>);
|
||||
<span class="macro">assert_eq!</span>(db.fetch_confirm(p.username, c.key).<span class="kw">await</span>.unwrap().len(), <span class="number">1</span>);
|
||||
|
||||
<span class="comment">// update captcha key; set key = username;</span>
|
||||
<span class="ident">db</span>.<span class="ident">update_captcha_key</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>, <span class="ident">p</span>.<span class="ident">username</span>)
|
||||
.<span class="kw">await</span>
|
||||
.<span class="ident">unwrap</span>();
|
||||
<span class="comment">// checking for captcha with old key; shouldn't exist</span>
|
||||
<span class="macro">assert!</span>(<span class="op">!</span><span class="ident">db</span>.<span class="ident">captcha_exists</span>(<span class="prelude-val">Some</span>(<span class="ident">p</span>.<span class="ident">username</span>), <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>());
|
||||
<span class="comment">// checking for captcha with new key; shouldn exist</span>
|
||||
<span class="macro">assert!</span>(<span class="ident">db</span>
|
||||
.<span class="ident">captcha_exists</span>(<span class="prelude-val">Some</span>(<span class="ident">p</span>.<span class="ident">username</span>), <span class="ident">p</span>.<span class="ident">username</span>)
|
||||
.<span class="kw">await</span>
|
||||
.<span class="ident">unwrap</span>());
|
||||
<span class="comment">// update captcha key; set key = username;
|
||||
</span>db.update_captcha_key(p.username, c.key, p.username)
|
||||
.<span class="kw">await
|
||||
</span>.unwrap();
|
||||
<span class="comment">// checking for captcha with old key; shouldn't exist
|
||||
</span><span class="macro">assert!</span>(!db.captcha_exists(<span class="prelude-val">Some</span>(p.username), c.key).<span class="kw">await</span>.unwrap());
|
||||
<span class="comment">// checking for captcha with new key; shouldn exist
|
||||
</span><span class="macro">assert!</span>(db
|
||||
.captcha_exists(<span class="prelude-val">Some</span>(p.username), p.username)
|
||||
.<span class="kw">await
|
||||
</span>.unwrap());
|
||||
|
||||
<span class="comment">// delete captcha levels</span>
|
||||
<span class="ident">db</span>.<span class="ident">delete_captcha_levels</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="comment">// delete captcha levels
|
||||
</span>db.delete_captcha_levels(p.username, c.key).<span class="kw">await</span>.unwrap();
|
||||
|
||||
<span class="comment">// update captcha; set description = username and duration *= duration;</span>
|
||||
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">c2</span> <span class="op">=</span> <span class="ident">c</span>.<span class="ident">clone</span>();
|
||||
<span class="ident">c2</span>.<span class="ident">duration</span> <span class="kw-2">*</span><span class="op">=</span> <span class="ident">c2</span>.<span class="ident">duration</span>;
|
||||
<span class="ident">c2</span>.<span class="ident">description</span> <span class="op">=</span> <span class="ident">p</span>.<span class="ident">username</span>;
|
||||
<span class="ident">db</span>.<span class="ident">update_captcha_metadata</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="kw-2">&</span><span class="ident">c2</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="comment">// update captcha; set description = username and duration *= duration;
|
||||
</span><span class="kw">let </span><span class="kw-2">mut </span>c2 = c.clone();
|
||||
c2.duration <span class="kw-2">*</span>= c2.duration;
|
||||
c2.description = p.username;
|
||||
db.update_captcha_metadata(p.username, <span class="kw-2">&</span>c2).<span class="kw">await</span>.unwrap();
|
||||
|
||||
<span class="comment">// delete captcha; updated key = p.username so invoke delete with it</span>
|
||||
<span class="ident">db</span>.<span class="ident">delete_captcha</span>(<span class="ident">p</span>.<span class="ident">username</span>, <span class="ident">p</span>.<span class="ident">username</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>();
|
||||
<span class="macro">assert!</span>(<span class="op">!</span><span class="ident">db</span>.<span class="ident">captcha_exists</span>(<span class="prelude-val">Some</span>(<span class="ident">p</span>.<span class="ident">username</span>), <span class="ident">c</span>.<span class="ident">key</span>).<span class="kw">await</span>.<span class="ident">unwrap</span>());
|
||||
<span class="comment">// delete captcha; updated key = p.username so invoke delete with it
|
||||
</span>db.delete_captcha(p.username, p.username).<span class="kw">await</span>.unwrap();
|
||||
<span class="macro">assert!</span>(!db.captcha_exists(<span class="prelude-val">Some</span>(p.username), c.key).<span class="kw">await</span>.unwrap());
|
||||
}
|
||||
</code></pre></div>
|
||||
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="db_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.64.0 (a55dd71d5 2022-09-19)" ></div></body></html>
|
||||
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="db_core" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.65.0 (897e37553 2022-11-02)" ></div></body></html>
|
||||
Reference in New Issue
Block a user