use sqlx::Pool; use sqlx::Sqlite; use sqlx::SqlitePool; use sqlx::{self, sqlite}; #[derive(Clone)] pub struct ServerState { pub pool: Pool, } impl ServerState { pub async fn new() -> Self { // This is almost certainly bad practice for more reasons than I can count dotenvy::dotenv().ok(); let db_url = dotenvy::var("DATABASE_URL").unwrap_or(":memory:".to_string()); let pool = sqlite::SqlitePoolOptions::new() .max_connections(5) .connect(&db_url) .await .unwrap(); sqlx::migrate!("./migrations").run(&pool).await.unwrap(); #[cfg(debug_assertions)] debug_setup(&pool).await; Self { pool } } } // Inserts a bunch of dummy data into the database // Mostly useful for debugging new posts, as we need to satisfy foreign key constraints. #[cfg(debug_assertions)] async fn debug_setup(pool: &SqlitePool) { use chrono::NaiveDateTime; use sqlx::query; let now = NaiveDateTime::from_timestamp(0, 0); query!( "INSERT INTO users (username, password, created_at, updated_at) VALUES ('test', 'test', ?, ?)", now, now ) .execute(pool) .await .unwrap(); query!( "INSERT INTO posts (user_id, content, created_at, updated_at) VALUES (1, 'Hello world!', ?, ?)", now, now ) .execute(pool) .await .unwrap(); }