use log::{info, warn}; use sqlx::{MySql, Pool}; use errors::{anyhow, AnyhowResult}; use hashing::bcrypt::bcrypt_password_hash::bcrypt_password_hash; use hashing::md5::email_to_gravatar_hash::email_to_gravatar_hash; use mysql_queries::queries::users::user::create_account::{create_account, CreateAccountArgs}; use tokens::tokens::users::UserToken; pub const ADMIN_USERNAME : &str = "admin"; pub const HANASHI_USERNAME : &str = "hanashi"; // We want deterministic tokens for some records pub const ADMIN_USER_TOKEN : &str = "user_4jgh4dk9tmr6t"; pub const HANASHI_USER_TOKEN : &str = "user_fcfteany0ds60"; pub async fn seed_user_accounts(mysql_pool: &Pool) -> AnyhowResult<()> { info!("Seeding user accounts..."); // NB: This is idempotent and will only install the accounts once. let users = [ (ADMIN_USERNAME, "password", Some(ADMIN_USER_TOKEN)), (HANASHI_USERNAME, "password", Some(HANASHI_USER_TOKEN)), ("test", "password", None), ]; for (username, password, maybe_user_token) in users { let maybe_user_token = maybe_user_token.map(|token| UserToken::new_from_str(token)); let result = seed_user(username, password, maybe_user_token, &mysql_pool).await; match result { Ok(_) => info!("Seeded {}", username), Err(err) => warn!(r#" Could not seed user {} : {:?} (No worries: if there's a duplicate key error, we probably already seeded the user on a previous invocation!) "#, username, err), } } Ok(()) } async fn seed_user( username: &str, password: &str, maybe_user_token: Option, mysql_pool: &Pool, ) -> AnyhowResult<()> { info!("Seeding user {} ...", username); let display_name = username.clone(); let username = username.to_lowercase(); let email_address = format!("{}@storyteller.ai", username); let email_gravatar_hash = email_to_gravatar_hash(&email_address); let password_hash = bcrypt_password_hash(password)?; create_account(mysql_pool, CreateAccountArgs { username: &username, display_name, email_address: &email_address, email_gravatar_hash: &email_gravatar_hash, password_hash: &password_hash, ip_address: "127.0.0.1", maybe_user_token: maybe_user_token.as_ref(), }).await.map_err(|err| anyhow!("err: {:?}", err))?; Ok(()) }