chore: get rid of direct DB init and use db_*

This commit is contained in:
realaravinth
2022-05-27 18:25:27 +05:30
parent cd72ae6ffe
commit d7fd23f565
25 changed files with 55 additions and 63 deletions

View File

@@ -36,7 +36,7 @@ pub async fn delete_account(
let username = id.identity().unwrap(); let username = id.identity().unwrap();
let hash = data let hash = data
.dblib .db
.get_password(&db_core::Login::Username(&username)) .get_password(&db_core::Login::Username(&username))
.await?; .await?;
@@ -54,7 +54,7 @@ pub mod runners {
use super::*; use super::*;
pub async fn delete_user(name: &str, data: &AppData) -> ServiceResult<()> { pub async fn delete_user(name: &str, data: &AppData) -> ServiceResult<()> {
data.dblib.delete_user(name).await?; data.db.delete_user(name).await?;
Ok(()) Ok(())
} }
} }

View File

@@ -33,7 +33,7 @@ pub async fn email_exists(
payload: web::Json<AccountCheckPayload>, payload: web::Json<AccountCheckPayload>,
data: AppData, data: AppData,
) -> ServiceResult<impl Responder> { ) -> ServiceResult<impl Responder> {
let exists = data.dblib.email_exists(&payload.val).await?; let exists = data.db.email_exists(&payload.val).await?;
let resp = AccountCheckResp { exists }; let resp = AccountCheckResp { exists };
@@ -59,7 +59,7 @@ async fn set_email(
new_email: &payload.email, new_email: &payload.email,
}; };
data.dblib.update_email(&update_email).await?; data.db.update_email(&update_email).await?;
Ok(HttpResponse::Ok()) Ok(HttpResponse::Ok())
} }

View File

@@ -60,7 +60,7 @@ async fn update_password_runner(
hash: new_hash, hash: new_hash,
}; };
data.dblib.update_password(&p).await?; data.db.update_password(&p).await?;
Ok(()) Ok(())
} }
@@ -80,7 +80,7 @@ async fn update_user_password(
let username = id.identity().unwrap(); let username = id.identity().unwrap();
// TODO: verify behavior when account is not found // TODO: verify behavior when account is not found
let res = data.dblib.get_password(&Login::Username(&username)).await?; let res = data.db.get_password(&Login::Username(&username)).await?;
if Config::verify(&res.hash, &payload.password)? { if Config::verify(&res.hash, &payload.password)? {
let update: UpdatePassword = payload.into_inner().into(); let update: UpdatePassword = payload.into_inner().into();

View File

@@ -28,7 +28,7 @@ use crate::AppData;
)] )]
async fn get_secret(id: Identity, data: AppData) -> ServiceResult<impl Responder> { async fn get_secret(id: Identity, data: AppData) -> ServiceResult<impl Responder> {
let username = id.identity().unwrap(); let username = id.identity().unwrap();
let secret = data.dblib.get_secret(&username).await?; let secret = data.db.get_secret(&username).await?;
Ok(HttpResponse::Ok().json(secret)) Ok(HttpResponse::Ok().json(secret))
} }
@@ -47,7 +47,7 @@ async fn update_user_secret(
loop { loop {
secret = get_random(32); secret = get_random(32);
match data.dblib.update_secret(&username, &secret).await { match data.db.update_secret(&username, &secret).await {
Ok(_) => break, Ok(_) => break,
Err(DBError::SecretTaken) => continue, Err(DBError::SecretTaken) => continue,
Err(e) => return Err(e.into()), Err(e) => return Err(e.into()),

View File

@@ -38,7 +38,7 @@ pub mod runners {
payload: &AccountCheckPayload, payload: &AccountCheckPayload,
data: &AppData, data: &AppData,
) -> ServiceResult<AccountCheckResp> { ) -> ServiceResult<AccountCheckResp> {
let exists = data.dblib.username_exists(&payload.val).await?; let exists = data.db.username_exists(&payload.val).await?;
Ok(AccountCheckResp { exists }) Ok(AccountCheckResp { exists })
} }
@@ -63,7 +63,7 @@ async fn set_username(
let processed_uname = data.creds.username(&payload.username)?; let processed_uname = data.creds.username(&payload.username)?;
data.dblib data.db
.update_username(&username, &processed_uname) .update_username(&username, &processed_uname)
.await?; .await?;

View File

@@ -99,11 +99,11 @@ pub mod runners {
}; };
let s = if payload.login.contains('@') { let s = if payload.login.contains('@') {
data.dblib data.db
.get_password(&db_core::Login::Email(&payload.login)) .get_password(&db_core::Login::Email(&payload.login))
.await? .await?
} else { } else {
data.dblib data.db
.get_password(&db_core::Login::Username(&payload.login)) .get_password(&db_core::Login::Username(&payload.login))
.await? .await?
}; };
@@ -141,7 +141,7 @@ pub mod runners {
secret: &secret, secret: &secret,
}; };
match data.dblib.register(&p).await { match data.db.register(&p).await {
Ok(_) => break, Ok(_) => break,
Err(DBError::SecretTaken) => continue, Err(DBError::SecretTaken) => continue,
Err(e) => return Err(e.into()), Err(e) => return Err(e.into()),

View File

@@ -81,13 +81,13 @@ pub mod runner {
duration, duration,
}; };
match data.dblib.create_captcha(username, &p).await { match data.db.create_captcha(username, &p).await {
Ok(_) => break, Ok(_) => break,
Err(DBError::SecretTaken) => continue, Err(DBError::SecretTaken) => continue,
Err(e) => return Err(e.into()), Err(e) => return Err(e.into()),
} }
} }
data.dblib data.db
.add_captcha_levels(username, &key, &payload.levels) .add_captcha_levels(username, &key, &payload.levels)
.await?; .await?;
let mcaptcha_config = MCaptchaDetails { let mcaptcha_config = MCaptchaDetails {

View File

@@ -43,13 +43,13 @@ async fn delete(
let username = id.identity().unwrap(); let username = id.identity().unwrap();
let hash = data.dblib.get_password(&Login::Username(&username)).await?; let hash = data.db.get_password(&Login::Username(&username)).await?;
if !Config::verify(&hash.hash, &payload.password)? { if !Config::verify(&hash.hash, &payload.password)? {
return Err(ServiceError::WrongPassword); return Err(ServiceError::WrongPassword);
} }
let payload = payload.into_inner(); let payload = payload.into_inner();
data.dblib.delete_captcha(&username, &payload.key).await?; data.db.delete_captcha(&username, &payload.key).await?;
if let Err(err) = data.captcha.remove(RemoveCaptcha(payload.key)).await { if let Err(err) = data.captcha.remove(RemoveCaptcha(payload.key)).await {
log::error!("Error while trying to remove captcha from cache {}", err); log::error!("Error while trying to remove captcha from cache {}", err);

View File

@@ -130,7 +130,7 @@ async fn create(
}; };
let mcaptcha_config = create_runner(&msg, &data, &username).await?; let mcaptcha_config = create_runner(&msg, &data, &username).await?;
data.dblib data.db
.add_traffic_pattern(&username, &mcaptcha_config.key, &pattern) .add_traffic_pattern(&username, &mcaptcha_config.key, &pattern)
.await?; .await?;
Ok(HttpResponse::Ok().json(mcaptcha_config)) Ok(HttpResponse::Ok().json(mcaptcha_config))
@@ -166,11 +166,11 @@ async fn update(
update_captcha_runner(&msg, &data, &username).await?; update_captcha_runner(&msg, &data, &username).await?;
data.dblib data.db
.delete_traffic_pattern(&username, &msg.key) .delete_traffic_pattern(&username, &msg.key)
.await?; .await?;
data.dblib data.db
.add_traffic_pattern(&username, &msg.key, &pattern) .add_traffic_pattern(&username, &msg.key, &pattern)
.await?; .await?;

View File

@@ -35,7 +35,7 @@ pub async fn get_captcha(
) -> ServiceResult<impl Responder> { ) -> ServiceResult<impl Responder> {
let username = id.identity().unwrap(); let username = id.identity().unwrap();
let levels = data let levels = data
.dblib .db
.get_captcha_levels(Some(&username), &payload.key) .get_captcha_levels(Some(&username), &payload.key)
.await?; .await?;
Ok(HttpResponse::Ok().json(levels)) Ok(HttpResponse::Ok().json(levels))

View File

@@ -44,7 +44,7 @@ pub async fn update_key(
key = get_random(32); key = get_random(32);
match data match data
.dblib .db
.update_captcha_key(&username, &payload.key, &key) .update_captcha_key(&username, &payload.key, &key)
.await .await
{ {
@@ -113,7 +113,7 @@ pub mod runner {
// still, needs to be benchmarked // still, needs to be benchmarked
defense.build()?; defense.build()?;
data.dblib data.db
.delete_captcha_levels(username, &payload.key) .delete_captcha_levels(username, &payload.key)
.await?; .await?;
@@ -123,9 +123,9 @@ pub mod runner {
description: &payload.description, description: &payload.description,
}; };
data.dblib.update_captcha_metadata(username, &m).await?; data.db.update_captcha_metadata(username, &m).await?;
data.dblib data.db
.add_captcha_levels(username, &payload.key, &payload.levels) .add_captcha_levels(username, &payload.key, &payload.levels)
.await?; .await?;
if let Err(ServiceError::CaptchaError(e)) = data if let Err(ServiceError::CaptchaError(e)) = data

View File

@@ -75,7 +75,7 @@ impl Health {
async fn health(data: AppData) -> impl Responder { async fn health(data: AppData) -> impl Responder {
let mut resp_builder = HealthBuilder::default(); let mut resp_builder = HealthBuilder::default();
resp_builder.db(data.dblib.ping().await); resp_builder.db(data.db.ping().await);
if let SystemGroup::Redis(_) = data.captcha { if let SystemGroup::Redis(_) = data.captcha {
if let Ok(r) = Redis::new(RedisConfig::Single( if let Ok(r) = Redis::new(RedisConfig::Single(

View File

@@ -51,7 +51,7 @@ pub async fn add_notification(
heading: &payload.heading, heading: &payload.heading,
}; };
data.dblib.create_notification(&p).await?; data.db.create_notification(&p).await?;
Ok(HttpResponse::Ok()) Ok(HttpResponse::Ok())
} }

View File

@@ -70,7 +70,7 @@ pub async fn get_notification(
let receiver = id.identity().unwrap(); let receiver = id.identity().unwrap();
// TODO handle error where payload.to doesnt exist // TODO handle error where payload.to doesnt exist
let notifications = data.dblib.get_all_unread_notifications(&receiver).await?; let notifications = data.db.get_all_unread_notifications(&receiver).await?;
let notifications = NotificationResp::from_notifications(notifications); let notifications = NotificationResp::from_notifications(notifications);
Ok(HttpResponse::Ok().json(notifications)) Ok(HttpResponse::Ok().json(notifications))
} }

View File

@@ -41,7 +41,7 @@ pub async fn mark_read(
// TODO handle error where payload.to doesnt exist // TODO handle error where payload.to doesnt exist
// TODO get payload from path /api/v1/notifications/{id}/read" // TODO get payload from path /api/v1/notifications/{id}/read"
data.dblib data.db
.mark_notification_read(&receiver, payload.id) .mark_notification_read(&receiver, payload.id)
.await?; .await?;

View File

@@ -42,7 +42,7 @@ pub async fn get_config(
data: AppData, data: AppData,
) -> ServiceResult<impl Responder> { ) -> ServiceResult<impl Responder> {
//if res.exists.is_none() { //if res.exists.is_none() {
if !data.dblib.captcha_exists(None, &payload.key).await? { if !data.db.captcha_exists(None, &payload.key).await? {
return Err(ServiceError::TokenNotFound); return Err(ServiceError::TokenNotFound);
} }
let payload = payload.into_inner(); let payload = payload.into_inner();
@@ -100,8 +100,8 @@ pub async fn get_config(
/// creates [MCaptcha][libmcaptcha::MCaptcha] and adds it to [Master][libmcaptcha::Defense] /// creates [MCaptcha][libmcaptcha::MCaptcha] and adds it to [Master][libmcaptcha::Defense]
async fn init_mcaptcha(data: &AppData, key: &str) -> ServiceResult<()> { async fn init_mcaptcha(data: &AppData, key: &str) -> ServiceResult<()> {
// get levels // get levels
let levels = data.dblib.get_captcha_levels(None, key).await?; let levels = data.db.get_captcha_levels(None, key).await?;
let duration = data.dblib.get_captcha_cooldown(&key).await?; let duration = data.db.get_captcha_cooldown(&key).await?;
// build defense // build defense
let mut defense = DefenseBuilder::default(); let mut defense = DefenseBuilder::default();

View File

@@ -41,7 +41,6 @@ use libmcaptcha::{
system::{System, SystemBuilder}, system::{System, SystemBuilder},
}; };
use sqlx::postgres::PgPoolOptions; use sqlx::postgres::PgPoolOptions;
use sqlx::PgPool;
use db_core::MCDatabase; use db_core::MCDatabase;
@@ -150,7 +149,7 @@ impl SystemGroup {
/// App data /// App data
pub struct Data { pub struct Data {
/// database ops defined by db crates /// database ops defined by db crates
pub dblib: Box<dyn MCDatabase>, pub db: Box<dyn MCDatabase>,
/// credential management configuration /// credential management configuration
pub creds: Config, pub creds: Config,
/// mCaptcha system: Redis cache, etc. /// mCaptcha system: Redis cache, etc.
@@ -186,20 +185,14 @@ impl Data {
log::info!("Initialized credential manager"); log::info!("Initialized credential manager");
}); });
// let db = PgPoolOptions::new()
// .max_connections(s.database.pool)
// .connect(&s.database.url)
// .await
// .expect("Unable to form database pool");
let pool = s.database.pool; let pool = s.database.pool;
let pool_options = PgPoolOptions::new().max_connections(pool); let pool_options = PgPoolOptions::new().max_connections(pool);
let connection_options = ConnectionOptions::Fresh(Fresh { let connection_options = ConnectionOptions::Fresh(Fresh {
pool_options, pool_options,
url: s.database.url.clone(), url: s.database.url.clone(),
}); });
let dblib = connection_options.connect().await.unwrap(); let db = connection_options.connect().await.unwrap();
dblib.migrate().await.unwrap(); db.migrate().await.unwrap();
let stats: Box<dyn Stats> = if s.captcha.enable_stats { let stats: Box<dyn Stats> = if s.captcha.enable_stats {
Box::new(Real::default()) Box::new(Real::default())
@@ -209,8 +202,7 @@ impl Data {
let data = Data { let data = Data {
creds, creds,
//db, db: Box::new(db),
dblib: Box::new(dblib),
captcha: SystemGroup::new(s).await, captcha: SystemGroup::new(s).await,
mailer: Self::get_mailer(s), mailer: Self::get_mailer(s),
settings: s.clone(), settings: s.clone(),

View File

@@ -48,7 +48,7 @@ const PAGE: &str = "Dashboard";
)] )]
async fn panel(data: AppData, id: Identity) -> PageResult<impl Responder> { async fn panel(data: AppData, id: Identity) -> PageResult<impl Responder> {
let username = id.identity().unwrap(); let username = id.identity().unwrap();
let sitekeys = data.dblib.get_all_user_captchas(&username).await?; let sitekeys = data.db.get_all_user_captchas(&username).await?;
let body = IndexPage::new(sitekeys).render_once().unwrap(); let body = IndexPage::new(sitekeys).render_once().unwrap();
Ok(HttpResponse::Ok() Ok(HttpResponse::Ok()
.content_type("text/html; charset=utf-8") .content_type("text/html; charset=utf-8")

View File

@@ -74,7 +74,7 @@ pub async fn notifications(data: AppData, id: Identity) -> PageResult<impl Respo
// TODO handle error where payload.to doesnt exist // TODO handle error where payload.to doesnt exist
// let mut notifications = runner::get_notification(&data, &receiver).await?; // let mut notifications = runner::get_notification(&data, &receiver).await?;
let mut notifications = data.dblib.get_all_unread_notifications(&receiver).await?; let mut notifications = data.db.get_all_unread_notifications(&receiver).await?;
let notifications = notifications.drain(0..).map(|x| x.into()).collect(); let notifications = notifications.drain(0..).map(|x| x.into()).collect();
let body = IndexPage::new(notifications).render_once().unwrap(); let body = IndexPage::new(notifications).render_once().unwrap();

View File

@@ -69,9 +69,9 @@ pub struct IndexPage<'a> {
async fn settings(data: AppData, id: Identity) -> PageResult<impl Responder> { async fn settings(data: AppData, id: Identity) -> PageResult<impl Responder> {
let username = id.identity().unwrap(); let username = id.identity().unwrap();
let secret = data.dblib.get_secret(&username).await?; let secret = data.db.get_secret(&username).await?;
let secret = secret.secret; let secret = secret.secret;
let email = data.dblib.get_email(&username).await?; let email = data.db.get_email(&username).await?;
let data = IndexPage { let data = IndexPage {
email, email,

View File

@@ -61,8 +61,8 @@ pub async fn advance(
let username = id.identity().unwrap(); let username = id.identity().unwrap();
let key = path.into_inner(); let key = path.into_inner();
let config = data.dblib.get_captcha_config(&username, &key).await?; let config = data.db.get_captcha_config(&username, &key).await?;
let levels = data.dblib.get_captcha_levels(Some(&username), &key).await?; let levels = data.db.get_captcha_levels(Some(&username), &key).await?;
let body = AdvanceEditPage::new(config, levels, key) let body = AdvanceEditPage::new(config, levels, key)
.render_once() .render_once()
@@ -103,9 +103,9 @@ pub async fn easy(
let username = id.identity().unwrap(); let username = id.identity().unwrap();
let key = path.into_inner(); let key = path.into_inner();
match data.dblib.get_traffic_pattern(&username, &key).await { match data.db.get_traffic_pattern(&username, &key).await {
Ok(c) => { Ok(c) => {
let config = data.dblib.get_captcha_config(&username, &key).await?; let config = data.db.get_captcha_config(&username, &key).await?;
let pattern = TrafficPatternRequest { let pattern = TrafficPatternRequest {
peak_sustainable_traffic: c.peak_sustainable_traffic as u32, peak_sustainable_traffic: c.peak_sustainable_traffic as u32,
avg_traffic: c.avg_traffic as u32, avg_traffic: c.avg_traffic as u32,

View File

@@ -45,7 +45,7 @@ impl IndexPage {
)] )]
pub async fn list_sitekeys(data: AppData, id: Identity) -> PageResult<impl Responder> { pub async fn list_sitekeys(data: AppData, id: Identity) -> PageResult<impl Responder> {
let username = id.identity().unwrap(); let username = id.identity().unwrap();
let res = data.dblib.get_all_user_captchas(&username).await?; let res = data.db.get_all_user_captchas(&username).await?;
let body = IndexPage::new(res).render_once().unwrap(); let body = IndexPage::new(res).render_once().unwrap();
Ok(HttpResponse::Ok() Ok(HttpResponse::Ok()
.content_type("text/html; charset=utf-8") .content_type("text/html; charset=utf-8")

View File

@@ -67,8 +67,8 @@ pub async fn view_sitekey(
) -> PageResult<impl Responder> { ) -> PageResult<impl Responder> {
let username = id.identity().unwrap(); let username = id.identity().unwrap();
let key = path.into_inner(); let key = path.into_inner();
let config = data.dblib.get_captcha_config(&username, &key).await?; let config = data.db.get_captcha_config(&username, &key).await?;
let levels = data.dblib.get_captcha_levels(Some(&username), &key).await?; let levels = data.db.get_captcha_levels(Some(&username), &key).await?;
let stats = data.stats.fetch(&data, &username, &key).await?; let stats = data.stats.fetch(&data, &username, &key).await?;
let body = IndexPage::new(stats, config, levels, key) let body = IndexPage::new(stats, config, levels, key)

View File

@@ -71,24 +71,24 @@ pub struct Real;
impl Stats for Real { impl Stats for Real {
/// record PoWConfig fetches /// record PoWConfig fetches
async fn record_fetch(&self, d: &Data, key: &str) -> DBResult<()> { async fn record_fetch(&self, d: &Data, key: &str) -> DBResult<()> {
d.dblib.record_fetch(key).await d.db.record_fetch(key).await
} }
/// record PoWConfig solves /// record PoWConfig solves
async fn record_solve(&self, d: &Data, key: &str) -> DBResult<()> { async fn record_solve(&self, d: &Data, key: &str) -> DBResult<()> {
d.dblib.record_solve(key).await d.db.record_solve(key).await
} }
/// record PoWConfig confirms /// record PoWConfig confirms
async fn record_confirm(&self, d: &Data, key: &str) -> DBResult<()> { async fn record_confirm(&self, d: &Data, key: &str) -> DBResult<()> {
d.dblib.record_confirm(key).await d.db.record_confirm(key).await
} }
/// fetch stats /// fetch stats
async fn fetch(&self, d: &Data, user: &str, key: &str) -> DBResult<CaptchaStats> { async fn fetch(&self, d: &Data, user: &str, key: &str) -> DBResult<CaptchaStats> {
let config_fetches_fut = d.dblib.fetch_config_fetched(user, key); let config_fetches_fut = d.db.fetch_config_fetched(user, key);
let solves_fut = d.dblib.fetch_solve(user, key); let solves_fut = d.db.fetch_solve(user, key);
let confirms_fut = d.dblib.fetch_confirm(user, key); let confirms_fut = d.db.fetch_confirm(user, key);
let (config_fetches, solves, confirms) = let (config_fetches, solves, confirms) =
futures::try_join!(config_fetches_fut, solves_fut, confirms_fut)?; futures::try_join!(config_fetches_fut, solves_fut, confirms_fut)?;

View File

@@ -98,7 +98,7 @@ macro_rules! get_app {
} }
pub async fn delete_user(data: &ArcData, name: &str) { pub async fn delete_user(data: &ArcData, name: &str) {
let x = data.dblib.delete_user(name).await; let x = data.db.delete_user(name).await;
println!(); println!();
println!(); println!();
println!(); println!();