// Copyright (C) 2021 Aravinth Manivannan // SPDX-FileCopyrightText: 2023 Aravinth Manivannan // // SPDX-License-Identifier: AGPL-3.0-or-later //! App data: database connections, etc. use std::sync::Arc; use std::thread; use argon2_creds::{Config, ConfigBuilder, PasswordPolicy}; use sqlx::postgres::PgPoolOptions; use sqlx::PgPool; use crate::mcaptcha::*; use crate::settings::Settings; /// App data pub struct Data { /// database pool pub db: PgPool, pub creds: Config, pub settings: Settings, pub mcaptcha: Box, } impl Data { pub fn get_creds() -> Config { ConfigBuilder::default() .username_case_mapped(true) .profanity(true) .blacklist(true) .password_policy(PasswordPolicy::default()) .build() .unwrap() } #[cfg(not(tarpaulin_include))] /// create new instance of app data pub async fn new( settings: Settings, mcaptcha: Box, ) -> Arc { let creds = Self::get_creds(); let c = creds.clone(); #[allow(unused_variables)] let init = thread::spawn(move || { log::info!("Initializing credential manager"); c.init(); log::info!("Initialized credential manager"); }); let db = PgPoolOptions::new() .max_connections(settings.database.pool) .connect(&settings.database.url) .await .expect("Unable to form database pool"); #[cfg(not(debug_assertions))] init.join().unwrap(); let data = Data { db, creds, settings, mcaptcha, }; Arc::new(data) } }