use crate::db::user::{add_user, get_user_by_name, get_user_count, DbUserRole}; use anyhow::{anyhow, Result}; use serde::Deserialize; use sqlx::SqlitePool; use tracing::info; #[derive(Debug, Deserialize)] struct BootstrapData { users: Vec, } #[derive(Debug, Deserialize)] struct BootstrapUser { name: String, role: String } pub async fn bootstrap_database(db: &SqlitePool) -> Result<()> { let bootstrap_str = match std::env::var("BOOTSTRAP_DATA") { Ok(s) => { info!("bootstrap data found, updating db: {}", s); s }, Err(_) => { info!("no Bootstrap data found"); return Ok(()); }, }; let data = ron::from_str::(&bootstrap_str)?; if db_needs_users(db).await? { for user in &data.users { let role = DbUserRole::try_from_str(&user.role).ok_or(anyhow!("invalid role {}", user.role))?; if get_user_by_name(db, &user.name).await?.is_none() { let new_id = add_user(db, &user.name, role).await?; info!("bootstrap new user {}:{} ({})", new_id, user.name, user.role); } } } Ok(()) } async fn db_needs_users(db: &SqlitePool) -> Result { let count = get_user_count(&db).await?; Ok(count <= 0) }