FrostByte/server/src/state.rs

91 lines
2.4 KiB
Rust
Raw Normal View History

2023-10-21 05:11:42 +02:00
use std::collections::BTreeMap;
use std::sync::Arc;
use std::sync::Mutex;
2023-11-02 11:29:34 +01:00
use log::error;
use log::info;
use sqlx::migrate::MigrateDatabase;
2023-10-10 19:45:18 +02:00
use sqlx::Pool;
2023-10-10 00:03:04 +02:00
use sqlx::Sqlite;
use sqlx::{self, sqlite};
2023-10-21 05:11:42 +02:00
#[derive(Clone)]
pub struct CaptchaState {
pub capthca_db: Arc<Mutex<BTreeMap<i32, String>>>,
}
impl CaptchaState {
pub fn new() -> Self {
Self {
capthca_db: Arc::new(Mutex::new(BTreeMap::new())),
}
}
}
2023-10-10 00:03:04 +02:00
#[derive(Clone)]
pub struct ServerState {
2023-10-10 00:03:04 +02:00
pub pool: Pool<Sqlite>,
}
impl ServerState {
2023-10-10 00:03:04 +02:00
pub async fn new() -> Self {
2023-10-20 20:57:58 +02:00
// 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());
2023-11-02 11:29:34 +01:00
info!("Using db_url: {}", &db_url);
2023-10-20 20:57:58 +02:00
if !sqlx::Sqlite::database_exists(&db_url).await.unwrap() {
sqlx::Sqlite::create_database(&db_url).await.unwrap();
}
2023-10-10 00:03:04 +02:00
let pool = sqlite::SqlitePoolOptions::new()
.max_connections(5)
2023-10-20 20:57:58 +02:00
.connect(&db_url)
2023-10-10 00:03:04 +02:00
.await
.unwrap();
sqlx::migrate!("./migrations").run(&pool).await.unwrap();
2023-11-02 11:29:34 +01:00
match crate::db::db_new_user("imbus".to_string(), "kartellen1234".to_string(), &pool).await
{
Some(u) => info!("Created default user {}", u.username),
None => error!("Failed to create default user..."),
}
#[cfg(debug_assertions)]
2023-10-21 00:59:35 +02:00
debug_setup(&pool).await.unwrap();
Self { pool }
2023-10-10 00:03:04 +02:00
}
}
#[cfg(debug_assertions)]
use sqlx::SqlitePool;
// 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)]
2023-10-21 00:59:35 +02:00
async fn debug_setup(pool: &SqlitePool) -> Result<(), sqlx::Error> {
use sqlx::query;
use crate::db::db_new_user;
2023-10-21 08:51:51 +02:00
db_new_user("user".to_string(), "pass".to_string(), pool).await;
2023-10-21 00:59:35 +02:00
// Check if the demo post already exists
let posted = query!("SELECT * FROM posts WHERE id = 1",)
.fetch_one(pool)
.await
.ok();
// If the demo user already has a post, don't insert another one
if !posted.is_some() {
// This requires that the user with id 1 exists in the user table
query!("INSERT INTO posts (user_id, content) VALUES (1, 'Hello world! The demo username is user and the password is pass.')",)
2023-10-21 00:59:35 +02:00
.execute(pool)
.await?;
}
2023-10-21 00:59:35 +02:00
Ok(())
}