use sqlx::SqlitePool; const API_KEY_ALPHABET: &str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; const FILENAME_ALPHABET: &str = "0123456789abcdefghijklmnopqrstuvwxyz"; pub fn gen_filename() -> String { let alphabet = &FILENAME_ALPHABET.chars().collect::>()[..]; nanoid::nanoid!(8, alphabet) } pub fn gen_key() -> String { let alphabet = &API_KEY_ALPHABET.chars().collect::>()[..]; nanoid::nanoid!(64, alphabet) } pub fn gen_revocation_key() -> String { let alphabet = &API_KEY_ALPHABET.chars().collect::>()[..]; nanoid::nanoid!(128, alphabet) } pub async fn check_admin_key(pool: &SqlitePool) -> anyhow::Result<()> { let query = sqlx::query!("select admin from api_keys where admin = true") .fetch_all(pool) .await?; if query.is_empty() { let key = gen_key(); sqlx::query!("insert into api_keys (key, admin) values ($1, true)", key) .execute(pool) .await?; println!("created admin key: {}", key); } Ok(()) }